01 / 20
Lógica de Programação · Aula compilada · Semana 17

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.

ProfessorGuilherme Antunes CursoTécnico em Desenvolvimento de Sistemas ConteúdoSemana 17 · Aulas 1 a 4 CódigoSISANO1C1B3S17
02 / 20
Objetivos da aula

Ao final, você será capaz de.

01

Definir e chamar funções, entendendo a diferença entre criar a receita e executá-la

02

Criar funções com parâmetros e retorno, processando dados diferentes com o mesmo código

03

Distinguir escopo local e global e evitar efeitos colaterais indesejados

04

Identificar repetição no código e transformá-la em função reutilizável

Por que isso importa agora: nas semanas anteriores vocês organizaram os dados com vetores e matrizes. Modularizar é organizar o código — e é o que permite que o sistema continue crescendo sem virar uma parede de trezentas linhas.
03 / 20
Conceito

Função é uma receita

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
Definir = escrever a receita no caderno. Chamar = usar a receita para fazer o bolo. Definir não executa nada — o código dentro da função só roda quando alguém chama.
04 / 20
Sintaxe em Python

Anatomia de uma função

def saudacao():
    print("Olá, seja bem-vindo!")


saudacao()
print("Linha do programa principal.")
saudacao()
1

def — a palavra-chave que indica o início da definição.

2

Nome — deve descrever o que a função faz. saudacao, não func1.

3

Bloco de código — as instruções que ela executa, delimitadas pela indentação.

Para chamar, basta escrever o nome seguido de parênteses: saudacao(). Os parênteses são o que diferencia mencionar a função de executá-la.
05 / 20
Fluxo de execução

O programa desvia e volta

Quando uma função é chamada, o programa interrompe o fluxo principal, executa a função e depois continua exatamente de onde parou.

O que acontece, em ordem

1

Inicia o programa principal

2

Encontra saudacao()desvia para a função

3

Executa as instruções da função

4

Função termina → retorna ao ponto da chamada

5

Continua a execução normal

Saída do código anterior

Olá, seja bem-vindo!
Linha do programa principal.
Olá, seja bem-vindo!
Três linhas de saída a partir de uma definição. Isso é reutilização: escreveu uma vez, executou quantas quiser.
06 / 20
Parâmetros

A mesma função, dados diferentes

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.

Sem parâmetro — engessado

def saudacao_ana():
    print("Olá, Ana!")

def saudacao_carlos():
    print("Olá, Carlos!")

def saudacao_bia():
    print("Olá, Bia!")

Com parâmetro — flexível

def saudacao(nome):
    print("Olá,", nome + "!")

saudacao("Ana")
saudacao("Carlos")
saudacao("Bia")
Três funções viraram uma. E se amanhã a saudação mudar para "Bom dia", você altera em um lugar em vez de três — que é exatamente o motivo pelo qual empresas pagam por código modularizado.
07 / 20
Vocabulário técnico

Parâmetro x argumento

Muita gente usa como sinônimo, mas há uma diferença que aparece em prova e em entrevista:

Parâmetro

A variável vazia, escrita na definição da função.

É o campo em branco da ficha de cadastro.

Argumento

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
08 / 20
O comando de retorno

Devolver é diferente de imprimir

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.

Só imprime — o valor se perde

def dobro(n):
    print(n * 2)

x = dobro(5)      # imprime 10
print(x)          # None  ← nada voltou

Retorna — o valor é reaproveitável

def dobro(n):
    return n * 2

x = dobro(5)      # x recebe 10
print(x + 3)      # 13  ← dá para continuar
Regra de bolso: função que calcula deve retornar; quem decide o que fazer com o resultado (imprimir, somar, salvar) é o programa principal. Misturar cálculo e impressão dentro da mesma função é o que torna o código difícil de reaproveitar.
09 / 20
Escopo de variáveis

Onde a variável vive

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
Curiosidade útil: variáveis locais com o mesmo nome podem existir em funções diferentes sem causar conflito. Cada função tem seu próprio espaço — é por isso que você pode usar i, total ou temp em todo lugar sem medo.
10 / 20
Escopo de variáveis

Global: use com cuidado

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.

Má prática — depende do global

taxa = 0.1

def total(valor):
    return valor + valor * taxa

# quem lê a função não sabe
# de onde 'taxa' veio

Boa prática — recebe por parâmetro

def total(valor, taxa):
    return valor + valor * taxa

print(total(100, 0.1))   # 110.0
# a função é autossuficiente
# e testável isoladamente
Cuidado: o uso excessivo de variáveis globais é considerado má prática. Como qualquer função pode alterá-las, fica difícil rastrear a origem de um erro — são os chamados efeitos colaterais indesejados.
11 / 20
Pause e responda

O que acontece aqui?

O que acontece quando tentamos acessar uma variável local fora da função onde ela foi declarada?

AA variável se torna global automaticamente
BO valor da variável é zerado
CO programa funciona normalmente
DOcorre um erro, pois a variável não existe naquele contexto
Por que D: quando a função termina, suas variáveis locais são apagadas da memória. Em Python o erro tem nome e sobrenome: NameError. Não é o valor que some — é a variável que nunca existiu ali fora.
12 / 20
Funções reutilizáveis

Achar o padrão repetido

Uma loja aplica 15% de desconto em três produtos. Repare no que se repete — e no que muda.

Antes — a mesma conta, três vezes

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)

Depois — uma função, três chamadas

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))
Dez linhas viraram cinco — mas o ganho real não é tamanho, é ponto único de mudança.
13 / 20
Pause e responda

Quantas alterações?

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?

ATrês vezes, uma para cada produto no código principal
BUma única vez, dentro da função de cálculo
CApenas nas variáveis globais de cada produto
DNenhuma, pois funções não podem ser editadas
Por que B: a regra de negócio está concentrada em um só lugar. Essa é a diferença entre modularizar por organização e modularizar por manutenção — no código de antes, esquecer um dos três produtos geraria um bug silencioso.
14 / 20
Boas práticas

Como escrever uma função decente

1

Nome que explica

calcular_media() diz o que faz. func2() obriga a ler o corpo inteiro para descobrir.

2

Uma responsabilidade

Uma função, uma tarefa. Se o nome precisa de "e" (calcular_e_imprimir), provavelmente são duas.

3

Dados por parâmetro

Entra por parâmetro, sai por return. Global só quando não houver alternativa.

4

Curta o suficiente

Se não cabe na tela, provavelmente há mais de uma função escondida ali dentro.

Teste rápido: consegue explicar o que a função faz em uma frase, sem usar "e depois"? Se sim, o escopo dela está bom.
15 / 20
Desafio · individual

Calculadora modular

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.

1

Crie a função calcular(n1, n2, op), que recebe dois números e o símbolo da operação.

2

Dentro dela, use uma estrutura de decisão para realizar a conta conforme o operador.

3

Use return para devolver o valor calculado — não imprima dentro da função.

4

No programa principal, peça os dados ao usuário, chame a função e exiba o resultado.

Atenção à divisão por zero. Toda divisão precisa ser validada antes — é o erro que mais derruba programa de aluno (e de profissional).
16 / 20
Desafio · como fica o código

Calculadora funcionando

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
Repare na divisão de trabalho: a função só calcula e devolve; o programa principal só conversa com o usuário. Trocar input por dados vindos de um arquivo não exigiria mexer uma linha na função.
17 / 20
Revisão por pares · prática de mercado

Ler o código do colega

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.

O que olhar

  • Os nomes explicam o que cada função faz?
  • Os dados entram por parâmetro ou dependem de global?
  • A função retorna ou só imprime?
  • Sobrou código repetido que caberia numa função?
  • Casos de erro (divisão por zero, entrada inválida) foram tratados?

Como falar

"Tá errado isso aí, ninguém faz assim."
"A função calcular está imprimindo e retornando ao mesmo tempo. Se ela só retornasse, daria para reaproveitar em outro ponto — o que acha?"
Feedback assertivo: critique o código, nunca a pessoa; aponte o problema e um caminho; pergunte em vez de sentenciar. Quem revisa bem é convidado a revisar de novo.
18 / 20
Então ficamos assim…

O que vimos hoje

  • Função → bloco de código nomeado e reutilizável; definirchamar
  • Parâmetro → variável na definição · argumento → valor na chamada
  • return → devolve o resultado para quem chamou; imprimir não devolve nada
  • Escopo local → morre com a função · global → use com parcimônia
  • Modularizar → repetição vira função; a regra de negócio passa a ter um único lugar
Próximo passo

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.

19 / 20
Cola de bolso

Funções em seis linhas

  • def nome(param): — define; o corpo vem indentado abaixo
  • nome(argumento) — chama; sem os parênteses, nada executa
  • return valor — devolve e encerra a função na hora
  • Sem return, a função devolve None
  • Variável criada dentro da função é local — some quando a função acaba
  • Repetiu o mesmo trecho duas vezes? Provavelmente é uma função esperando para nascer
A pergunta que resume tudo: "se essa regra mudar amanhã, em quantos lugares vou ter que mexer?". Se a resposta for maior que um, falta modularizar.
20 / 20
Referências

De onde veio cada coisa

SEDUC-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