Curso

Funções são parte essencial da linguagem de programação Python: você provavelmente já encontrou e usou várias funções excelentes que vêm embutidas na linguagem ou fazem parte do seu ecossistema de bibliotecas. Porém, como cientista de dados, você vai precisar escrever suas próprias funções o tempo todo para resolver problemas que surgem a partir dos seus dados.
Este tutorial usa a sintaxe do Python 3. Todos os exemplos funcionam em Python 3.10+ e foram atualizados para refletir convenções modernas (f-strings, type hints, parâmetros apenas posicionais e apenas nomeados). A versão estável atual é o Python 3.14.
Para executar facilmente todo o código de exemplo deste tutorial por conta própria, você pode criar um workbook no DataLab gratuitamente, já com Python pré-instalado e contendo todas as amostras de código. Para praticar ainda mais a escrita de funções em Python, confira este exercício prático da DataCamp ou faça nosso curso Python Data Science Toolbox!
Funções em Python
No dia a dia de programação, você usa funções para agrupar um conjunto de instruções que quer reutilizar ou que, por sua complexidade, ficam melhor encapsuladas em um subprograma a ser chamado quando necessário. Ou seja, uma função é um trecho de código escrito para executar uma tarefa específica. Para realizar essa tarefa, a função pode precisar ou não de várias entradas. Ao terminar, ela pode retornar um ou mais valores — ou não retornar nada.
Há três tipos de funções em Python:
-
Funções embutidas, como
help()para pedir ajuda,min()para obter o menor valor,print()para imprimir algo no terminal,… Você encontra uma visão geral com várias dessas funções aqui. -
Funções definidas pelo usuário (UDFs), que são funções criadas por você para facilitar seu trabalho; e
-
Funções anônimas, também chamadas de funções lambda, pois não são declaradas com a palavra-chave padrão
def.
Funções vs. métodos
Método é uma função que faz parte de uma classe. Você o acessa a partir de uma instância ou objeto dessa classe. Já uma função não tem essa restrição: é uma função isolada. Isso significa que todo método é uma função, mas nem toda função é um método.
Considere este exemplo, em que você primeiro define a função plus() e depois uma classe Summation com um método sum():
Se agora você quiser chamar o método sum(), que faz parte da classe Summation, primeiro precisa definir uma instância ou objeto dessa classe. Então, vamos criar esse objeto:
Lembre-se de que essa instanciação não é necessária quando você quer chamar a função plus()! Você conseguiria executar plus(1,2) no bloco de código do DataCamp Light sem problemas!
Parâmetros vs. argumentos
Parâmetros são os nomes usados ao definir uma função ou método, aos quais os argumentos serão mapeados. Em outras palavras, argumentos são os valores passados em uma chamada de função ou método, enquanto o código da função/método se refere a eles pelos nomes dos parâmetros.
Considere o exemplo a seguir e volte ao bloco do DataCamp Light acima: você passa dois argumentos para o método sum() da classe Summation, embora tenha definido três parâmetros anteriormente: self, a e b.
O que aconteceu com o self?
O primeiro argumento de todo método de classe é sempre uma referência à instância atual da classe, que neste caso é Summation. Por convenção, esse argumento se chama self.
Isso tudo quer dizer que você não passa o self explicitamente, porque self é o nome do parâmetro para um argumento passado de forma implícita que se refere à instância pela qual o método está sendo invocado. Ele é inserido automaticamente na lista de argumentos.
Como definir uma função: funções definidas pelo usuário (UDFs)
Os quatro passos para definir uma função em Python são:
-
Use a palavra-chave
defpara declarar a função e, em seguida, o nome dela. -
Adicione parâmetros à função: eles devem ficar entre parênteses. Termine a linha com dois-pontos.
-
Inclua as instruções que a função deve executar.
-
Finalize com uma instrução
returnse a função precisar retornar algo. Sem oreturn, sua função retorna o objetoNone.
Claro, suas funções vão ficar mais complexas com o tempo: você pode adicionar laços for, controle de fluxo … e muito mais para deixá-las mais refinadas:
def hello():
name = input("Enter your name: ")
if name:
print(f"Hello {name}")
else:
print("Hello World")
hello()
No exemplo acima, você pede que o usuário informe um nome. Se nenhum nome for informado, a função imprime “Hello World”. Caso contrário, o usuário recebe um cumprimento personalizado.
Lembre-se também de que você pode definir um ou mais parâmetros para sua UDF. Você vai ver mais sobre isso na seção de argumentos de função. Além disso, você pode retornar um ou vários valores como resultado da sua função — ou não retornar nada.
Aprenda Python do zero
A instrução return
Note que, como você está imprimindo algo na sua UDF hello(), não precisa necessariamente retorná-lo. Não haverá diferença entre a função acima e esta aqui:
No entanto, se você quiser continuar trabalhando com o resultado da sua função e testar algumas operações sobre ele, precisará usar a instrução return para de fato retornar um valor, como uma string, um inteiro, …. Considere o cenário a seguir, em que hello() retorna a string "hello", enquanto a função hello_noreturn() retorna None:
A segunda função gera um erro porque não dá para executar operações com None. Você receberá um TypeError dizendo que não é possível fazer multiplicação entre NoneType (o None retornado por hello_noreturn()) e int (2).
Dica: funções encerram imediatamente quando encontram uma instrução return, mesmo que isso signifique não retornar valor algum:
Outra coisa que vale mencionar ao trabalhar com return é que você pode usá-lo para retornar múltiplos valores. Para isso, use tuplas.
Lembre-se de que essa estrutura de dados é bem semelhante a uma lista: pode conter vários valores. Porém, tuplas são imutáveis, ou seja, você não pode modificar os valores armazenados nelas! Você as constrói com parênteses (). É possível desempacotar tuplas em múltiplas variáveis usando vírgula e o operador de atribuição.
Veja o exemplo a seguir para entender como sua função pode retornar múltiplos valores:
Nota: a instrução return return sum, a teria o mesmo resultado que return (sum, a): na prática, a primeira empacota sum e a em uma tupla nos bastidores!
Como chamar uma função
Nas seções anteriores, você já viu vários exemplos de como chamar uma função. Chamar uma função significa executar a função que você definiu — diretamente no prompt do Python ou a partir de outra função (como você verá na seção “Funções aninhadas”).
Chame sua função recém-definida hello() simplesmente executando hello(), como no bloco do DataCamp Light abaixo:
Como adicionar docstrings a uma função em Python
Outro aspecto essencial ao escrever funções em Python: docstrings. Docstrings descrevem o que sua função faz, como os cálculos que executa ou os valores que retorna. Essas descrições servem como documentação, para que qualquer pessoa que leia a docstring entenda o propósito da função sem precisar vasculhar todo o código da definição.
Docstrings de função ficam na linha imediatamente após o cabeçalho da função e são colocadas entre aspas triplas. Uma docstring apropriada para sua função hello() é: ‘Imprime “Hello World”’.
def hello() -> None:
"""Prints "Hello World"."""
print("Hello World")
Nota: docstrings podem ser bem mais longas do que a usada aqui como exemplo. Se quiser estudar docstrings em mais detalhes, vale conferir alguns repositórios no Github de bibliotecas Python como scikit-learn ou pandas, onde você encontrará vários exemplos!
Type hints
Bem próximas das docstrings — e quase tão comuns no Python moderno — estão as anotações de tipo (type hints). Desde o Python 3.5, você pode anotar os parâmetros da sua função e o valor de retorno com os tipos esperados. Veja o exemplo mais simples possível:
def plus(a: int, b: int) -> int:
return a + b
: int após cada parâmetro indica “isso deve ser um inteiro”, e -> int após os parênteses indica “esta função retorna um inteiro”. O próprio Python não impõe essas anotações em tempo de execução — você ainda pode passar uma string para plus() e o Python não vai reclamar até algo quebrar. Mas ferramentas como mypy, pyright e os verificadores de tipo embutidos em editores como VS Code e PyCharm usam essas dicas para detectar bugs antes mesmo de você executar o código.
Para tipos mais complexos, você pode usar genéricos embutidos diretamente (Python 3.9+) ou importar do módulo typing:
def greet(names: list[str]) -> None:
for name in names:
print(f"Hello {name}")
def find_user(user_id: int) -> dict | None:
# returns the user dict, or None if not found
...
Argumentos de função em Python
Mais cedo, você aprendeu a diferença entre parâmetros e argumentos. Resumindo: argumentos são os valores passados em qualquer chamada de função ou método, enquanto o código da função/método se refere a eles pelos nomes dos parâmetros. Há quatro tipos de argumentos que UDFs em Python podem receber:
- Argumentos padrão
- Argumentos obrigatórios
- Argumentos nomeados (keyword)
- Número variável de argumentos
Argumentos padrão
Argumentos padrão recebem um valor default se nenhum valor for passado na chamada da função. Você atribui esse valor usando o operador de atribuição =, como no exemplo a seguir:
Argumentos obrigatórios
Como o nome sugere, argumentos obrigatórios de uma UDF são aqueles que precisam estar presentes. Eles devem ser passados na chamada da função e exatamente na ordem correta, como no exemplo a seguir:
Você precisa de argumentos que mapeiem para os parâmetros a e b para chamar a função sem erros. Se você inverter a e b, o resultado não muda — mas mudaria se você alterasse plus() para o seguinte:
Argumentos nomeados (keyword)
Se quiser garantir que está passando os parâmetros na ordem certa, use argumentos nomeados na chamada da função. Com eles, você identifica os argumentos pelo nome do parâmetro. Vamos pegar o exemplo acima para deixar mais claro:
Note que, ao usar argumentos nomeados, você também pode inverter a ordem dos parâmetros e ainda obter o mesmo resultado ao executar a função:
Número variável de argumentos
Em casos em que você não sabe o número exato de argumentos a passar para a função, use a seguinte sintaxe com *args:
O asterisco (*) é colocado antes do nome da variável que guarda os valores de todos os argumentos não nomeados. Note que você também poderia ter passado *varint, *var_int_args ou qualquer outro nome para a função plus().
Dica: tente substituir *args por outro nome que inclua o asterisco. Você vai ver que o código acima continua funcionando!
Perceba que a função acima usa a função embutida do Python sum() para somar todos os argumentos passados para plus().
Variáveis globais vs. locais
Em geral, variáveis definidas dentro do corpo de uma função têm escopo local, e as definidas fora têm escopo global. Isso significa que variáveis locais são definidas dentro do bloco da função e só podem ser acessadas lá dentro, enquanto variáveis globais podem ser acessadas por todas as funções do seu script:
Você verá que receberá um NameError dizendo que name 'total' is not defined ao tentar imprimir a variável local total, definida dentro do corpo da função. Já a variável init pode ser exibida sem problemas.
Parâmetros apenas posicionais e apenas nomeados
Desde o Python 3.8, você pode ter mais controle sobre como os argumentos devem ser passados usando dois marcadores especiais na assinatura da função: / e *. Tudo que vem antes de / só pode ser passado por posição; tudo que vem depois de * só pode ser passado por nome (keyword).
def greet(name, /, greeting="Hello", *, punctuation="!"):
print(f"{greeting} {name}{punctuation}")
Veja como isso funciona na chamada:
greet("Alice") # funciona
greet("Alice", greeting="Hi") # funciona
greet("Alice", "Hi", punctuation="?") # funciona
greet(name="Alice") # TypeError: name é apenas posicional
greet("Alice", "Hi", "?") # TypeError: punctuation é apenas nomeado
Por que você iria querer isso? Dois motivos principais.
Apenas posicionais permitem renomear parâmetros no futuro sem quebrar o código de ninguém — como ninguém pode usar o nome do parâmetro como keyword, você é livre para mudá-lo.
Apenas nomeados forçam quem chama a ser explícito sobre o que está passando, o que deixa as chamadas mais legíveis quando há várias opções ou flags.
Em resumo, é uma forma limpa de reforçar a intenção.
Funções anônimas em Python
Funções anônimas também são chamadas de funções lambda em Python porque, em vez de declará-las com a palavra-chave padrão def, você usa lambda.
No bloco do DataCamp Light acima, lambda x: x*2 é a função anônima ou lambda. x é o argumento e x*2 é a expressão/instrução que é avaliada e retornada. O especial dessa função é que ela não tem nome, diferente dos exemplos que você viu na primeira parte deste tutorial. Se você escrevesse a função acima como uma UDF, ficaria assim:
def double(x):
return x*2
Vamos considerar outro exemplo de função lambda com dois argumentos:
Você usa funções anônimas quando precisa de uma função sem nome por um curto período e criada em tempo de execução. Contextos típicos são quando você trabalha com filter(), map() e reduce():
A função filter() filtra, como o nome sugere, a lista de entrada original my_list com base no critério >10. Já com map(), você aplica uma função a todos os itens da lista my_list. Neste caso, multiplica todos os elementos por 2.
Note que a função reduce() faz parte da biblioteca functools. Você a aplica cumulativamente aos itens da lista my_list, da esquerda para a direita, reduzindo a sequência a um único valor — 55, neste caso.
Usando main() como função em Python
Se você tem experiência com outras linguagens como Java, sabe que a função main é necessária para executar o programa. Como você viu nos exemplos acima, isso não é obrigatório em Python. No entanto, incluir uma função main() no seu programa pode ser útil para estruturar o código de forma lógica — os componentes mais importantes ficam contidos dentro dessa função.
Você pode definir uma função main() e chamá-la exatamente como fez com as outras funções acima:
Porém, do jeito que está, o código da sua função main() será executado quando você a importar como módulo. Para evitar isso, chame a função main() quando __name__ == '__main__'.
Isso significa que o bloco de código acima fica assim:
Nota: além de __main__, existe também a função __init__, que inicializa uma instância de classe ou objeto. Em termos simples, ela age como um construtor/inicializador e é chamada automaticamente quando você cria uma nova instância de uma classe. Com essa função, o objeto recém-criado é atribuído ao parâmetro self, que você viu anteriormente neste tutorial. Veja o exemplo:
class Dog:
"""A simple Dog class.
Args:
legs: Number of legs so that the dog can walk.
color: The color of the fur.
"""
def __init__(self, legs: int, color: str) -> None:
self.legs = legs
self.color = color
def bark(self) -> str:
return "bark" * 2
if __name__ == "__main__":
dog = Dog(4, "brown")
print(dog.bark())
Continue praticando funções em Python
Parabéns! Você chegou ao fim deste tutorial rápido sobre funções em Python. Se quiser revisar outros conteúdos básicos de programação em Python, não deixe de conferir o curso Data Types for Data Science, onde você vai consolidar e praticar seus conhecimentos sobre listas, dicionários, tuplas, conjuntos e datas e horas.
Obtenha a certificação para a função de cientista de dados dos seus sonhos
Nossos programas de certificação ajudam você a se destacar e a provar que suas habilidades estão prontas para o trabalho para possíveis empregadores.

Perguntas frequentes sobre funções em Python
O que é uma função em Python?
Função é um bloco de código reutilizável que executa uma tarefa específica. Ela pode receber entradas, processá-las e retornar saídas.
Como definir uma função em Python?
Para definir uma função em Python, use a palavra-chave def, dê um nome à função, adicione parâmetros opcionais entre parênteses, escreva o código e, se necessário, use return para devolver um valor.
Qual a diferença entre funções e métodos em Python?
Funções são independentes; métodos pertencem a classes. Todo método é uma função, mas nem toda função é um método.
Quais são os tipos de funções em Python?
Python tem funções embutidas (como print()), funções definidas pelo usuário (as que você cria) e funções anônimas (funções lambda de curta duração).
Qual a diferença entre parâmetros e argumentos?
Parâmetros são os nomes definidos na função; argumentos são os valores reais que você passa ao chamá-la.
O que é uma função lambda?
Uma função lambda é uma função sem nome, de uma linha, usada para tarefas rápidas.
Por que usar a função __main__?
A função __main__ ajuda a organizar o código e garante que partes específicas rodem apenas quando o script é executado diretamente, não quando é importado.
Qual a diferença entre variáveis globais e locais?
Variáveis globais funcionam em todo o script; variáveis locais existem apenas dentro da função onde foram declaradas.