Uma função é um bloco de passos com nome
Qualquer hora que você se pega escrevendo as mesmas poucas linhas mais de uma vez — ou querendo dar nome a um pedacinho de lógica — você está pronto para escrever uma função. Funções são a primeira ferramenta real para gerenciar complexidade num programa Python.
O formato básico:
Dissecando:
defé a palavra-chave que começa a definição de função.greeté o nome da função.(name)é a lista de parâmetros — as entradas que a função recebe.- Os dois pontos terminam o cabeçalho; o bloco indentado abaixo é o corpo.
greet("Ada")é uma chamada. O Python roda o corpo comnameamarrado a"Ada".
Funções ficam adormecidas até serem chamadas. Definir uma não executa. Chamar com greet("Ada") executa.
Parâmetros e argumentos
A palavra parâmetro é o nome dentro da definição da função. A palavra argumento é o valor passado quando você chama. Não é grande coisa na conversa casual, mas a distinção ajuda ao ler mensagens de erro.
Aqui base e exponent são parâmetros. 2 e 10 são argumentos. O Python amarra na ordem: primeiro argumento para primeiro parâmetro, e assim por diante.
return: enviando um valor de volta
print escreve na tela. return devolve um valor para quem chamou, para que possa usar:
Sem return, uma função retorna None por padrão:
return também sai da função imediatamente. Você vai ver retornos antecipados usados para escapar de casos de borda antes da lógica principal:
Retornos antecipados evitam que o corpo principal fique aninhado em if/else.
Argumentos default
Um parâmetro pode ter um valor default, usado quando quem chama não fornece:
Todos os parâmetros com default precisam vir depois dos parâmetros sem default. def f(a, b=1, c): é erro de sintaxe.
A armadilha do default mutável
Essa é a pegadinha mais famosa do Python. Veja:
Você esperaria que cada chamada começasse com uma lista vazia. Em vez disso, a lista default é compartilhada entre as chamadas, e os itens acumulam. O Python avalia o default uma vez, quando a função é definida, e reutiliza aquela lista única para sempre.
O padrão seguro é usar None como default e criar a lista dentro da função:
Agora cada chamada que não passa items recebe uma lista nova. Essa regra se aplica a listas, dicts, sets — qualquer coisa mutável.
Argumentos por palavra-chave
Você pode passar argumentos por nome em vez de posição. Isso permite pular parâmetros do meio e tornar chamadas longas mais legíveis:
Argumentos posicionais e por palavra-chave podem se misturar, mas os posicionais têm que vir primeiro:
Quando uma função tem mais de três ou quatro parâmetros, favorecer argumentos por palavra-chave torna as chamadas muito mais fáceis de ler.
Parâmetros só posicionais e só por palavra-chave
O Python permite marcar alguns parâmetros como chamáveis só por posição (com /) ou só por palavra-chave (com *):
Você não precisa disso no primeiro dia. Ficam úteis quando você está projetando APIs e quer travar como as pessoas usam sua função.
Docstrings e nomeação
A primeira linha dentro de uma função pode ser uma docstring — uma string de aspas triplas que o Python trata como documentação:
Ferramentas como help(), tooltips de IDE e geradores de documentação leem a docstring automaticamente. Uma linha só é muito melhor do que nada.
E, por favor, pense em nomeação:
- Nomes de função devem ser verbos:
fetch_profile,compute_total,is_valid. - Use
lower_snake_case. - Funções que retornam booleano geralmente começam com
is_,has_oucan_.
Um bom nome torna o ponto de chamada autoexplicativo sem precisar de comentário.
Funções puras são mais fáceis de raciocinar
Uma função pura retorna a mesma saída para a mesma entrada e não tem efeitos colaterais — não modifica estado global, não imprime no stdout (exceto para debug) e não escreve em arquivos.
As duas têm seu lugar, mas em código que você quer reutilizar e testar, empurre para funções puras o quanto puder.
Um exemplo pequeno funcional
Uma função rápida que combina defaults, argumentos por palavra-chave e return:
Próxima: listas flexíveis de argumentos
Às vezes você não sabe com quantos argumentos uma função vai ser chamada — ou quer encaminhar quaisquer argumentos que chegarem para outra função. *args e **kwargs lidam com isso. Essa é a próxima página.
Perguntas frequentes
Como defino uma função em Python?
Use a palavra-chave def, seguida do nome da função, parênteses para parâmetros e dois pontos. O bloco indentado abaixo é o corpo da função. Exemplo: def greet(name): print(f'Hi, {name}').
O que o return faz em Python?
return manda um valor de volta para quem chamou a função. Uma função sem return explícito retorna None automaticamente. Uma vez que return roda, a função sai imediatamente — qualquer código depois dele no mesmo bloco é pulado.
O que são argumentos default em Python?
Argumentos default deixam um parâmetro ter um valor pré-definido que é usado se quem chama não fornece um. def greet(name='friend'): significa que greet() sem argumentos usa 'friend'. Nunca use defaults mutáveis como [] — veja abaixo o padrão mais seguro.