Funções e
modularização
Parar de escrever o mesmo código três vezes. Dar nome às partes do programa, mandar dados para dentro delas e receber resultados de volta — o primeiro passo para código que se mantém.
Parar de escrever o mesmo código três vezes. Dar nome às partes do programa, mandar dados para dentro delas e receber resultados de volta — o primeiro passo para código que se mantém.
Definir e chamar funções, entendendo a diferença entre criar a receita e executá-la
Criar funções com parâmetros e retorno, processando dados diferentes com o mesmo código
Distinguir escopo local e global e evitar efeitos colaterais indesejados
Identificar repetição no código e transformá-la em função reutilizável
Imagine um confeiteiro com a receita do melhor bolo de chocolate: misturar os secos, depois os molhados, bater, assar. Toda vez que alguém encomenda um bolo, ele não reinventa o processo — pega a receita e executa.
Em programação é igual. Uma função é um bloco de código organizado e reutilizável que executa uma tarefa específica. Em vez de escrever o mesmo código várias vezes, nós o "empacotamos" e damos um nome a ele.
def fazer_bolo():
print("Misture os ingredientes")
print("Coloque no forno")
print("Bolo pronto!")
fazer_bolo() # chamando a função
def saudacao():
print("Olá, seja bem-vindo!")
saudacao()
print("Linha do programa principal.")
saudacao()
def — a palavra-chave que indica o início da definição.
Nome — deve descrever o que a função faz. saudacao, não func1.
Bloco de código — as instruções que ela executa, delimitadas pela indentação.
saudacao(). Os parênteses são o que diferencia mencionar a função de executá-la.
Quando uma função é chamada, o programa interrompe o fluxo principal, executa a função e depois continua exatamente de onde parou.
Inicia o programa principal
Encontra saudacao() → desvia para a função
Executa as instruções da função
Função termina → retorna ao ponto da chamada
Continua a execução normal
Olá, seja bem-vindo! Linha do programa principal. Olá, seja bem-vindo!
Uma calculadora não é recriada para cada equação — muda-se apenas os valores. Parâmetros são as variáveis declaradas na definição da função: as "portas de entrada" por onde valores externos passam.
def saudacao_ana():
print("Olá, Ana!")
def saudacao_carlos():
print("Olá, Carlos!")
def saudacao_bia():
print("Olá, Bia!")
def saudacao(nome):
print("Olá,", nome + "!")
saudacao("Ana")
saudacao("Carlos")
saudacao("Bia")
Muita gente usa como sinônimo, mas há uma diferença que aparece em prova e em entrevista:
A variável vazia, escrita na definição da função.
É o campo em branco da ficha de cadastro.O valor real, passado na chamada da função.
É o seu nome preenchido na ficha.def saudacao(nome): # 'nome' é o PARÂMETRO
print("Olá,", nome)
saudacao("Maria") # 'Maria' é o ARGUMENTO
Muitas funções não apenas executam uma ação: elas calculam um resultado e o enviam de volta para quem chamou. Isso é o return (Retorne, no pseudocódigo). Ao executá-lo, a função encerra e devolve o valor.
def dobro(n):
print(n * 2)
x = dobro(5) # imprime 10
print(x) # None ← nada voltou
def dobro(n):
return n * 2
x = dobro(5) # x recebe 10
print(x + 3) # 13 ← dá para continuar
Escopo é a região do código onde uma variável existe e pode ser acessada. Variáveis criadas dentro de uma função são locais: só existem enquanto a função está executando e são destruídas quando ela termina.
def calcular_total(preco, qtd):
subtotal = preco * qtd # variável LOCAL
return subtotal
print(calcular_total(10, 3)) # 30
print(subtotal) # NameError: name 'subtotal' is not defined
i, total ou temp em todo lugar sem medo.
Variáveis globais são criadas no programa principal, fora de qualquer função. Podem ser acessadas por diferentes partes do programa — e é justamente aí que mora o problema.
taxa = 0.1
def total(valor):
return valor + valor * taxa
# quem lê a função não sabe
# de onde 'taxa' veio
def total(valor, taxa):
return valor + valor * taxa
print(total(100, 0.1)) # 110.0
# a função é autossuficiente
# e testável isoladamente
O que acontece quando tentamos acessar uma variável local fora da função onde ela foi declarada?
NameError. Não é o valor que some — é a variável que nunca existiu ali fora.
Uma loja aplica 15% de desconto em três produtos. Repare no que se repete — e no que muda.
preco1 = 100
final1 = preco1 - preco1 * 0.15
print("Produto 1:", final1)
preco2 = 250
final2 = preco2 - preco2 * 0.15
print("Produto 2:", final2)
preco3 = 80
final3 = preco3 - preco3 * 0.15
print("Produto 3:", final3)
def aplicar_desconto(preco, taxa):
return preco - preco * taxa
print("Produto 1:", aplicar_desconto(100, 0.15))
print("Produto 2:", aplicar_desconto(250, 0.15))
print("Produto 3:", aplicar_desconto(80, 0.15))
Se a regra da loja mudar e incluir uma taxa extra para todos os produtos, quantas alterações seriam necessárias no código modularizado?
calcular_media() diz o que faz. func2() obriga a ler o corpo inteiro para descobrir.
Uma função, uma tarefa. Se o nome precisa de "e" (calcular_e_imprimir), provavelmente são duas.
Entra por parâmetro, sai por return. Global só quando não houver alternativa.
Se não cabe na tela, provavelmente há mais de uma função escondida ali dentro.
Criem uma calculadora que usa função com parâmetros e retorno. O fluxo do programa é: receber dados → processar com a função → retornar resultado → exibir.
Crie a função calcular(n1, n2, op), que recebe dois números e o símbolo da operação.
Dentro dela, use uma estrutura de decisão para realizar a conta conforme o operador.
Use return para devolver o valor calculado — não imprima dentro da função.
No programa principal, peça os dados ao usuário, chame a função e exiba o resultado.
def calcular(n1, n2, op):
if op == "+":
return n1 + n2
elif op == "-":
return n1 - n2
elif op == "*":
return n1 * n2
elif op == "/":
if n2 != 0:
return n1 / n2
else:
print("Erro: divisão por zero!")
return 0
else:
print("Operador inválido!")
return 0
print("--- Calculadora modular ---")
num1 = float(input("Primeiro número: "))
operador = input("Operador (+ - * /): ")
num2 = float(input("Segundo número: "))
resultado = calcular(num1, num2, operador)
print("Resultado:", resultado)
--- Calculadora modular --- Primeiro número: 12 Operador (+ - * /): / Segundo número: 4 Resultado: 3.0
input por dados vindos de um arquivo não exigiria mexer uma linha na função.
O Code Review é prática indispensável no mercado: outra pessoa lê seu código antes dele entrar no sistema. Eleva a qualidade e espalha conhecimento pelo time.
calcular está imprimindo e retornando ao mesmo tempo. Se ela só retornasse, daria para reaproveitar em outro ponto — o que acha?"Com o sistema organizado em módulos, a Semana 18 traz documentação, testes unitários e depuração — o que se faz para garantir que cada função realmente entrega o que promete.
def nome(param): — define; o corpo vem indentado abaixonome(argumento) — chama; sem os parênteses, nada executareturn valor — devolve e encerra a função na horareturn, a função devolve NoneSEDUC-SP. Educação Profissional Paulista — Técnico em Desenvolvimento de Sistemas. Lógica de Programação, Unidade 5, Componente 1 — Funções e procedimentos: Modularização I (Semana 17, aulas 1 a 4). Códigos: SISANO1C1B3S17A1 a A4.
ASCENCIO, A. F. G.; CAMPOS, E. A. V. Fundamentos da programação de computadores: algoritmos, Pascal, C/C++ (padrão ANSI) e Java. São Paulo: Pearson Education do Brasil, 2012.
FORBELLONE, A. L. V.; EBERSPÄCHER, H. F. Lógica de programação: a construção de algoritmos e estruturas de dados. São Paulo: Pearson Hall, 2005.
MANZANO, J. A. N. G.; OLIVEIRA, J. F. Algoritmos: lógica para desenvolvimento de programação de computadores. São Paulo: Érica, 2019.
HASHTAG PROGRAMAÇÃO. Como usar def no Python — funções explicadas em 10min. YouTube, 17 set. 2024. Disponível em: youtube.com. Acesso em: 8 abr. 2026.
CÓDIGO FONTE TV. Code review (como essa prática funciona?) — Dicionário do Programador. YouTube, 15 mar. 2021. Disponível em: youtube.com. Acesso em: 8 abr. 2026.
Aula compilada · adaptação para apresentação HTML por Guilherme Antunes