Copiar e colar o mesmo bloco de código em 10 lugares diferentes é um dos maiores erros que um programador iniciante pode cometer. Quando você precisar corrigir um bug ou mudar o comportamento, terá que fazer isso em 10 lugares — e é quase certo que vai esquecer pelo menos um. Funções existem justamente para resolver esse problema: você escreve a lógica uma vez, dá um nome pra ela, e chama esse nome sempre que precisar.
Criando sua primeira função
Em Python, uma função é definida com a palavra-chave def, seguida do nome da função, parênteses e dois pontos. O corpo da função é indentado (4 espaços é o padrão). Uma função de saudação simples é definida assim: def saudar(): seguida de print("Olá, mundo!") indentado. Para executar, você chama: saudar(). Simples assim.
O nome da função deve descrever o que ela faz. calcular_media, validar_email, enviar_mensagem — ao ler o nome, qualquer desenvolvedor entende o propósito sem precisar ler o código interno. Funções bem nomeadas tornam o código quase auto-documentado.
Parâmetros e argumentos
Funções ficam muito mais úteis quando aceitam dados para trabalhar. Parâmetros são as variáveis definidas na assinatura da função; argumentos são os valores passados na chamada. def saudar(nome): define um parâmetro chamado nome. Ao chamar saudar("Carlos"), o valor “Carlos” é o argumento, e dentro da função nome será “Carlos”.
Python permite parâmetros com valor padrão: def saudar(nome, cumprimento="Olá"): define que se o cumprimento não for passado, usa “Olá”. Você pode chamar saudar("Ana") ou saudar("Ana", "Bom dia"). Parâmetros com valor padrão devem sempre vir depois dos parâmetros obrigatórios.
Retornando valores com return
Uma função pode calcular algo e devolver o resultado para quem a chamou. A palavra-chave return faz isso. def somar(a, b): return a + b retorna a soma dos dois números. Quem chamou pode usar o resultado: resultado = somar(3, 7) faz resultado ter o valor 10. Sem return, a função retorna None implicitamente.
Uma função pode retornar múltiplos valores separados por vírgula: return minimo, maximo. Python empacota isso numa tupla, e você pode desempacotar na chamada: min_val, max_val = calcular_extremos(lista). Isso é um recurso elegante que muitas linguagens não têm nativamente.
Escopo de variáveis: local versus global
Variáveis criadas dentro de uma função existem apenas dentro dela — são locais. Ao sair da função, somem. Isso é fundamental para entender bugs sutis: se você tem uma variável total no código principal e uma variável total dentro de uma função, são duas variáveis completamente independentes. A função trabalha com sua própria cópia.
Variáveis globais (definidas fora de funções) podem ser lidas dentro de funções, mas para modificá-las é necessário declará-las com global nome_variavel. Na prática, uso excessivo de variáveis globais é considerado má prática — funções que dependem de estado global são difíceis de testar e de entender. Prefira sempre passar o que a função precisa como parâmetro e retornar o que ela produz.
Funções como cidadãs de primeira classe
Python trata funções como qualquer outro valor: você pode guardá-las em variáveis, passá-las como argumento para outras funções, e retorná-las de funções. Isso habilita padrões poderosos. A função embutida sorted(lista, key=funcao_de_ordenacao) aceita uma função como parâmetro para controlar o critério de ordenação. map(funcao, lista) aplica a função a cada elemento. filter(funcao_que_retorna_bool, lista) mantém apenas os elementos para os quais a função retorna True.
Lambda é uma forma de criar funções pequenas e anônimas em uma linha: lambda x: x * 2 define uma função sem nome que dobra o valor recebido. É útil como argumento para sorted, map e filter quando a lógica é simples demais para merecer uma função nomeada completa.
Docstrings: documentando suas funções
Uma função bem documentada tem uma docstring — um texto entre três aspas logo após o def, que descreve o propósito, os parâmetros e o retorno. help(sua_funcao) exibe essa documentação no terminal. IDEs como VS Code e PyCharm usam docstrings para exibir dicas ao digitar. Documentar funções parece overhead quando você está começando, mas depois de 3 meses sem ver o código, você vai agradecer ao seu eu do passado que teve esse cuidado.
O princípio de responsabilidade única diz que cada função deve fazer uma coisa e fazê-la bem. Se uma função precisa de 5 linhas de comentário para explicar o que faz, provavelmente está tentando fazer coisas demais. Divida em funções menores. Funções curtas (5-15 linhas) são mais fáceis de testar, entender e reutilizar. À medida que seu código cresce, a disciplina de escrever funções bem definidas é o que separa projetos sustentáveis de espaguetes impossíveis de manter.
Tem um projeto em mente?
Somos especialistas em transformar ideias em produtos digitais. Apps, sites, automações e IA — vamos construir juntos.