🌗 ← Índice
Data: 17/06/2026
Nível: Básico
Funções são blocos de código reutilizáveis — você define uma vez e chama quantas vezes precisar. É o coração da organização em Python.
A palavra-chave def inicia a definição de uma função. Tudo que vem indentado abaixo é o corpo.
# Definindo
def saudacao():
print("Olá, seja bem-vindo!")
# Chamando
saudacao() # Olá, seja bem-vindo!
def exibir_cardapio():
print("=" * 25)
print("🏪 Cardápio Los Michelitos")
print("=" * 25)
print("1. Corte — R$ 70")
print("2. Barba — R$ 40")
print("3. Corte + Barba — R$ 110")
exibir_cardapio()
▶ Saída:
=========================
🏪 Cardápio Los Michelitos
=========================
1. Corte — R$ 70
2. Barba — R$ 40
3. Corte + Barba — R$ 110
💡 Nome de funções: use verbos no infinitivo (calcular_total, exibir_menu, buscar_cliente) e snake_case — é a convenção PEP 8.
Funções podem receber dados de entrada através de parâmetros.
def saudacao_personalizada(nome):
print(f"Olá, {nome}! Seja bem-vindo(a) à barbearia.")
saudacao_personalizada("Hugo") # Olá, Hugo!...
saudacao_personalizada("Pedro") # Olá, Pedro!...
def resumo_servico(servico, preco, duracao):
print(f"✂️ {servico}")
print(f" Preço: R$ {preco:.2f}")
print(f" Duração: {duracao} min")
resumo_servico("Corte Degradê", 85, 40)
▶ Saída:
✂️ Corte Degradê
Preço: R$ 85.00
Duração: 40 min
def calcular_total(preco, quantidade=1):
return preco * quantidade
print(calcular_total(70)) # 70 (1 corte)
print(calcular_total(70, 3)) # 210 (3 cortes)
💡 Parâmetros com valor padrão devem vir por último na lista de parâmetros. Python obriga isso.
⏰ Lembre-se do P01: print() e input() também são funções — você já usa funções desde a primeira aula!
Funções podem retornar um valor com return. Quem chamou a função recebe esse valor.
def calcular_total(preco, quantidade):
total = preco * quantidade
return total
# Usando o retorno
valor = calcular_total(70, 2)
print(f"Total a pagar: R$ {valor:.2f}") # Total a pagar: R$ 140.00
Python permite retornar vários valores em uma tupla:
def dados_cliente():
nome = "Hugo"
idade = 32
plano = "Premium"
return nome, idade, plano
# Desempacotando
nome, idade, plano = dados_cliente()
print(f"{nome}, {idade} anos — Plano {plano}")
▶ Saída:
Hugo, 32 anos — Plano Premium
def so_exibe():
print("Isso não retorna nada")
resultado = so_exibe()
print(resultado) # None
💡 None é o "nada" do Python. Sempre que uma função não tem return, ela retorna None implicitamente.
Variáveis criadas dentro da função só existem lá (escopo local). Variáveis criadas fora são globais.
# Global
taxa_servico = 0.10 # 10%
def calcular_com_taxa(preco):
taxa = preco * taxa_servico # taxa_servico é global — funciona
return preco + taxa
print(calcular_com_taxa(100)) # 110.0
# Cuidado! Modificar global dentro da função não funciona sem global
comissao = 5
def aplicar_comissao():
comissao = 10 # Isso CRIA uma nova variável LOCAL
print(f"Dentro: {comissao}") # 10
aplicar_comissao()
print(f"Fora: {comissao}") # 5 (global não mudou)
Para modificar uma global, use global:
total_vendas = 0
def registrar_venda(valor):
global total_vendas
total_vendas += valor
registrar_venda(70)
registrar_venda(110)
print(f"Total de vendas: R$ {total_vendas}") # 180
💡 Regra geral: prefira passar valores como parâmetros e retornar resultados. Evite global — funções que só dependem de seus parâmetros são mais previsíveis e fáceis de testar.
Toda função deve ter uma docstring (documentação) logo após o def:
def calcular_media(valores):
"""Calcula a média aritmética de uma lista de números.
Args:
valores (list): Lista de números (int ou float).
Returns:
float: A média dos valores. Retorna 0 se a lista for vazia.
"""
if not valores:
return 0
return sum(valores) / len(valores)
A docstring pode ser acessada com help(calcular_media) ou print(calcular_media.__doc__).
💡 Existe um estilo oficial: Google Style (como o exemplo acima) ou NumPy Style. Ambos são aceitos. O importante é documentar o que a função faz, quais parâmetros espera e o que retorna.
"""Sistema de agendamento da barbearia Los Michelitos."""
servicos = {
"Corte": 70,
"Barba": 40,
"Corte + Barba": 110,
"Hidratação": 60,
}
def exibir_cardapio():
"""Mostra o cardápio com preços."""
print("=" * 30)
print("🏪 Cardápio Los Michelitos")
print("=" * 30)
for servico, preco in servicos.items():
print(f"{servico:20s} R$ {preco:.2f}")
print("=" * 30)
def calcular_total(servico, quantidade=1):
"""Calcula o total de um serviço com quantidade.
Args:
servico (str): Nome do serviço.
quantidade (int): Quantidade de vezes (padrão 1).
Returns:
float: Preço total. Retorna 0 se serviço não existir.
"""
preco = servicos.get(servico, 0)
return preco * quantidade
def aplicar_desconto(total, percentual=10):
"""Aplica um desconto percentual sobre o total.
Args:
total (float): Valor total.
percentual (float): Percentual de desconto (padrão 10%).
Returns:
float: Total com desconto.
"""
return total * (1 - percentual / 100)
# ── Execução principal ──
exibir_cardapio()
servico_escolhido = "Corte + Barba"
quantidade = 2
total_bruto = calcular_total(servico_escolhido, quantidade)
total_final = aplicar_desconto(total_bruto, 15)
print(f"\n🎯 {servico_escolhido} x{quantidade}")
print(f"💰 Total: R$ {total_bruto:.2f}")
print(f"🏷️ Com 15% off: R$ {total_final:.2f}")
▶ Saída:
==============================
🏪 Cardápio Los Michelitos
==============================
Corte R$ 70.00
Barba R$ 40.00
Corte + Barba R$ 110.00
Hidratação R$ 60.00
==============================
🎯 Corte + Barba x2
💰 Total: R$ 220.00
🏷️ Com 15% off: R$ 187.00
💡 Anotações importantes:
Crie uma função calcular_gorjeta(total, percentual=10) que retorna o valor da gorjeta e o total com gorjeta:
Requisitos:
def calcular_gorjeta(total, percentual=10):
gorjeta = total * percentual / 100
return gorjeta, total + gorjeta
gorjeta, total = calcular_gorjeta(85)
print(f"Gorjeta: R$ {gorjeta:.2f}")
print(f"Total: R$ {total:.2f}")
▶ Saída:
Gorjeta: R$ 8.50
Total: R$ 93.50
Crie uma função validar_senha(senha) que retorna True se a senha tiver pelo menos 8 caracteres e False caso contrário:
Requisitos:
def validar_senha(senha):
return len(senha) >= 8
senha1 = "admin123"
senha2 = "abc"
print(f"'{senha1}' → {'✅' if validar_senha(senha1) else '❌'}")
print(f"'{senha2}' → {'✅' if validar_senha(senha2) else '❌'}")
▶ Saída:
'admin123' → ✅
'abc' → ❌
Crie uma função calcular_parcela(total, parcelas=3, juros_mensal=2) que calcula o valor de cada parcela com juros compostos:
Fórmula: valor_parcela = total * (1 + juros_mensal/100)^parcelas / parcelas
Requisitos:
def calcular_parcela(total, parcelas=3, juros_mensal=2):
fator = (1 + juros_mensal / 100) ** parcelas
return total * fator / parcelas
parcela = calcular_parcela(600, 6, 3)
print(f"💳 6x de R$ {parcela:.2f}")
print(f"💰 Total financiado: R$ {parcela * 6:.2f}")
▶ Saída:
💳 6x de R$ 111.64
💰 Total financiado: R$ 669.83
💡 Dica AWS: No AWS Lambda, cada função handler é exatamente isso — uma função Python que recebe um event (dict) como parâmetro e retorna um dict com statusCode e body. É a base da computação serverless! [Doc AWS Lambda Python](https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html)
| Conceito | O que faz | Doc Oficial |
|---|
|----------|-----------|-------------|
| `def nome():` | Define uma função | [doc](https://docs.python.org/3/tutorial/controlflow.html#defining-functions) |
|---|---|---|
| `return valor` | Retorna um valor da função | [doc](https://docs.python.org/3/tutorial/controlflow.html#return-statements) |
| `def f(a, b=1):` | Parâmetros com valor padrão | [doc](https://docs.python.org/3/tutorial/controlflow.html#default-argument-values) |
| `def f(*args):` | Número variável de argumentos (avançado) | [doc](https://docs.python.org/3/tutorial/controlflow.html#arbitrary-argument-lists) |
| Docstring `"""..."""` | Documentação da função | [doc](https://peps.python.org/pep-0257/) |
| Escopo local/global | Variáveis dentro e fora da função | [doc](https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces) |
| `None` | Valor de retorno padrão (sem return) | [doc](https://docs.python.org/3/library/constants.html#None) |