🌗 ← Índice

🐍 Python P04 — Funções


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.




O que vamos aprender


  • Criar funções com `def`
  • Parâmetros e argumentos
  • `return` — retornar valores
  • Escopo de variáveis (local vs global)
  • Docstrings — documentar funções
  • Exemplos práticos com sistema de agendamento



  • 📌 O que vamos aprender


  • Criar funções com `def`
  • Parâmetros e argumentos posicionais e nomeados
  • `return` — retornar valores
  • Escopo de variáveis (local vs global)
  • Docstrings — documentar funções
  • Exemplos práticos com sistema de agendamento



  • 🧱 def — Definindo funções


    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.




    📥 Parâmetros e Argumentos


    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!...
    

    Múltiplos parâmetros


    
    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
    

    Parâmetros com valor padrão


    
    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!




    ↩️ return — Retornando valores


    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
    

    Retornando múltiplos valores


    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
    

    Função sem return → None


    
    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.




    🔍 Escopo de variáveis


    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.




    📖 Docstrings — documentando funções


    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.




    🏪 Exemplo completo — sistema de agendamento


    
    """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:

  • O `servicos.items()` retorna pares (chave, valor) do dicionário — vimos isso nos dicionários
  • `servicos.get(servico, 0)` retorna o valor OU 0 se a chave não existir — sem erro!
  • Funções pequenas e com **responsabilidade única** são mais fáceis de testar e reutilizar



  • 🎯 Exercícios Práticos


    1️⃣ Calculadora de gorjeta


    Crie uma função calcular_gorjeta(total, percentual=10) que retorna o valor da gorjeta e o total com gorjeta:


    Requisitos:

  • Recebe o total da conta e o percentual de gorjeta (padrão 10%)
  • Retorna uma tupla: `(gorjeta, total_com_gorjeta)`
  • Exemplo: `calcular_gorjeta(70)` → `(7.0, 77.0)`

  • 
    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
    



    2️⃣ Validador de senha


    Crie uma função validar_senha(senha) que retorna True se a senha tiver pelo menos 8 caracteres e False caso contrário:


    Requisitos:

  • Use `len()` para verificar o tamanho
  • Retorne booleano (`True`/`False`)
  • Teste com "admin123" (True) e "abc" (False)

  • 
    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' → ❌
    



    3️⃣ Calculadora de parcelas (desafio)


    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:

  • Use o operador `**` para potência (juros compostos)
  • Retorne o valor de cada parcela (float)
  • Exemplo: `calcular_parcela(300, 3, 2)` → R$ 104.04 cada

  • 
    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)




    📚 Resumo


    ConceitoO que fazDoc 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/globalVariá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)



    📖 Referências externas


  • [docs.python.org — Definindo funções](https://docs.python.org/3/tutorial/controlflow.html#defining-functions)
  • [docs.python.org — Mais sobre definição de funções](https://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions)
  • [docs.python.org — PEP 257: Docstrings](https://peps.python.org/pep-0257/)
  • [docs.python.org — Escopo e namespaces](https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces)
  • [AWS Lambda Python — handler functions](https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html)