Módulo 13 - Funções

Prática: funções de notas, média e aprovação

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Construir somar(a, b) e testá-la antes de seguir.
  • Criar calcular_media(notas) recebendo uma lista, com sum e len.
  • Escrever verificar_aprovacao(media) com múltiplos returns.
  • Montar o programa principal que conecta as três funções.

A missão e a primeira peça: somar

Hora de juntar as seis aulas do módulo num programa de verdade. A missão: um avaliador de notas escolares com três funções, cada uma com sua tarefa, e um programa principal que as conecta. Você vai construir no método profissional: uma peça por vez, testando cada uma antes de encaixar a próxima. Abra o Playground e digite junto; ler prática sem digitar é assistir academia pela janela.

def somar(a, b):
    return a + b

print(somar(2, 3))
print(somar(10, -4))
print(somar(0.5, 0.5))

# 5
# 6
# 1.0

A primeira peça, com três testes de mesa: valores fáceis de conferir de cabeça.

A somar é de propósito a função mais simples possível: dois parâmetros, um return, nada de print. Ela existe nesta prática como aquecimento e como demonstração do teste de mesa: chamamos com valores cujo resultado sabemos de antemão e conferimos a saída. Bateu? Peça aprovada, siga em frente. Não bateu? O defeito está nesta função, e em nenhum outro lugar, porque ainda não existe outro lugar. Esse isolamento é o superpoder de construir por partes.

As peças centrais: calcular_media e verificar_aprovacao

A segunda função é a estrela da prática: calcular_media recebe uma lista de notas, do jeito que você aprendeu no módulo 10, e devolve a média. Repare que o parâmetro aceita a lista inteira como um valor só. Dentro do corpo, duas funções embutidas fazem o trabalho pesado: sum soma todos os itens e len conta quantos são. A média é a divisão de uma pela outra, e funciona para qualquer quantidade de notas, duas ou vinte, sem mudar uma linha.

def calcular_media(notas):
    return sum(notas) / len(notas)

print(calcular_media([10, 8]))
print(calcular_media([7, 7, 7]))
print(calcular_media([10, 5, 8, 9]))

# 9.0
# 7.0
# 8.0

Uma linha de corpo, graças a sum e len. Os testes cobrem 2, 3 e 4 notas.

A terceira função decide a situação do aluno, e é o retrato da aula 4: múltiplos returns, um por caso. A regra de negócio é a das escolas brasileiras: média 7 ou mais aprova, de 5 a menos de 7 vai para recuperação, abaixo de 5 reprova. A ordem das condições importa: testamos do maior corte para o menor, e cada return que dispara encerra a função, então quem chega ao segundo if já tem média menor que 7, sem precisar dizer isso de novo.

def verificar_aprovacao(media):
    if media >= 7:
        return "Aprovado"
    if media >= 5:
        return "Recuperação"
    return "Reprovado"

print(verificar_aprovacao(8.5))
print(verificar_aprovacao(6.0))
print(verificar_aprovacao(4.9))
print(verificar_aprovacao(7.0))

# Aprovado
# Recuperação
# Reprovado
# Aprovado

Três saídas, três returns. O teste com 7.0 confere a fronteira exata do >=.

Repare no quarto teste, com a média exatamente 7.0: testar as fronteiras é hábito de programador experiente, porque é nelas que os erros de >= trocado por > se escondem. E note o que as três funções têm em comum: nenhuma usa print, nenhuma usa input. São cálculo puro com return, prontas para qualquer programa que precise delas. A conversa com o usuário é trabalho da próxima seção.

O programa completo e os desafios extras

Agora a montagem final: as três funções no topo e o programa principal embaixo, conectando tudo. O principal pede o nome do aluno, monta a lista de notas, calcula a média com uma função, decide a situação com a outra e mostra o boletim com print, formatando a média com uma casa decimal via f-string do módulo 12. Este é o código completo da prática, do primeiro def ao último print.

def somar(a, b):
    return a + b

def calcular_media(notas):
    return sum(notas) / len(notas)

def verificar_aprovacao(media):
    if media >= 7:
        return "Aprovado"
    if media >= 5:
        return "Recuperação"
    return "Reprovado"

# Programa principal
nome = input("Nome do aluno: ")
nota1 = float(input("Primeira nota: "))
nota2 = float(input("Segunda nota: "))
notas = [nota1, nota2]

media = calcular_media(notas)
situacao = verificar_aprovacao(media)
pontos = somar(nota1, nota2)

print(f"\n===== BOLETIM =====")
print(f"Aluno: {nome}")
print(f"Total de pontos: {pontos}")
print(f"Média: {media:.1f}")
print(f"Situação: {situacao}")

O programa completo. Rode com notas 8.5 e 7.0 e confira: média 7.8, situação Aprovado.

Execute algumas vezes variando as notas: um caso de aprovação, um de recuperação, um de reprovação. Depois releia o programa principal e perceba o que este módulo construiu: seis linhas de coordenação contam a história inteira, e cada regra mora numa função com nome. Se a escola mudar o corte de aprovação para 6, você altera um número dentro de verificar_aprovacao e pronto. Era exatamente essa a promessa da aula 1.

Se você completar ao menos os dois primeiros desafios, está pronto para a mini-prova do módulo. E leve daqui a sensação mais importante da prática: programa grande é só um monte de funções pequenas bem nomeadas. O módulo 14 blinda esse programa contra usuário que digita texto onde era número, e o projeto final monta o gerenciador de tarefas com esta mesma arquitetura.

Teste rápido

Por que calcular_media(notas) funciona para 2, 3 ou 10 notas sem mudar nenhuma linha?

Perguntas frequentes

Meu programa deu ZeroDivisionError na média. O que aconteceu?
A lista de notas chegou vazia em calcular_media: sum devolve 0, len devolve 0, e dividir por zero interrompe o programa. Nesta prática isso não ocorre, porque o principal sempre monta a lista com duas notas, mas no desafio do while vale conferir se a lista tem itens antes de calcular. O módulo 14 mostra o tratamento elegante para esses casos.
Por que a média 7.8 aparece como 7.8 e não 7.75?
Por causa do :.1f dentro da f-string, que formata o número com uma casa decimal e arredonda: 7.75 vira 7.8 na exibição. O valor guardado na variável continua 7.75; só a apresentação muda. Troque para :.2f e veja as duas casas aparecerem.
Posso testar verificar_aprovacao sem digitar notas toda vez?
Pode e deve: chame a função direto com valores fixos, como verificar_aprovacao(6.0), sem passar pelo input. É a vantagem de separar cálculo de conversa com o usuário: cada função de cálculo se testa sozinha, em segundos, no Playground.
E se o usuário digitar um texto em vez de nota?
O float não consegue converter e o programa para com ValueError, o velho conhecido do módulo 5. Nesta prática deixamos assim de propósito: o módulo 14 é inteiro sobre blindar programas com try e except, e este avaliador de notas volta lá como paciente.
Por que a ordem dos ifs em verificar_aprovacao importa?
Porque os returns cortam a execução em cascata: testamos do corte mais alto para o mais baixo. Se o primeiro teste fosse media >= 5, uma média 9 dispararia Recuperação, porque 9 também é maior que 5, e o teste do 7 nunca seria alcançado. Do maior para o menor, cada faixa pega só o que é dela.
Nota com vírgula, tipo 7,5, funciona no input?
Não: o float do Python espera ponto, padrão internacional, então 7,5 gera ValueError. Digite 7.5. Dá para aceitar vírgula trocando-a por ponto antes de converter, com o replace do módulo 12: float(texto.replace(',', '.')). Fica como desafio bônus.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.