Por que usar funções? Sintaxe básica, parâmetros e docstrings

🎯 Por que funções? Antes do código, o problema

Imagine que você está construindo um aplicativo que envia mensagens: várias partes do programa precisam montar uma saudação. Em vez de repetir o mesmo trecho em cada lugar, criamos uma função que encapsula essa lógica — assim evitamos duplicação e facilitamos manutenção. Vamos ver o porquê antes do como: funções nos permitem dividir o problema em blocos reutilizáveis e testáveis, facilitando mudanças futuras.(1)

Agora a sintaxe mínima: usamos a palavra-chave def, nomeamos a função, declaramos parâmetros entre parênteses e terminamos com dois-pontos. O corpo tem indentação. É recomendável adicionar um docstring (uma string logo abaixo da definição) que explica em uma linha o propósito da função; essa documentação fica disponível em __doc__ e via help().(1)(2)

# Vamos criar uma função simples que retorna uma saudação.

def saudacao(nome):
    '''Retorna uma saudação personalizada para o nome informado.'''
    return f'Olá, {nome}!'

# Testes rápidos para validar comportamento esperado
assert saudacao('Ana') == 'Olá, Ana!'
print(saudacao('Mundo'))  # Saída esperada: Olá, Mundo!

Explicando o código acima passo a passo: primeiro declaramos a função — saudacao — que recebe um parâmetro nome. A docstring (entre três aspas simples) descreve o propósito. A função retorna a string formada pela f-string. Observe que usamos return para enviar um valor de volta ao chamador; sem return a função retorna None. Isso é prática comum ao projetar funções reutilizáveis.(1)(2)

Atividade: Copie a função acima e modifique para aceitar dois parâmetros: nome e saudacao_inicial (ex.: 'Oi', 'Olá'). Atualize a docstring e escreva 2 assertes que verifiquem saídas diferentes.

Erros comuns: muitos iniciantes esquecem a indentação dentro da função ou chamam a função antes de defini-la. Outro erro frequente é usar print dentro da função quando você precisa que ela devolva um valor para outras partes do código — prefira return para lógica reutilizável.(1)

Lembra dos tipos que estudamos antes? Funções trabalham sobre esses valores: strings, números e coleções — tudo pode ser passado como argumento. Isso prepara você para estruturar decisões e laços no próximo módulo.