01 / 29
Lógica de Programação · Revisão geral

Tudo o que
já sabemos

Operadores, condicionais, range, for, while, listas e funções — em um único mapa. Não tem conteúdo novo aqui: tem tudo junto, do jeito que cai na prova e aparece no código real.

ProfessorGuilherme Antunes CursoTécnico em Desenvolvimento de Sistemas FormatoRevisão · consulta livre
02 / 29
Roteiro da revisão

Sete blocos, uma lógica só

Tudo que estudamos se encaixa em sete peças. Elas não vivem separadas: um programa de verdade usa todas ao mesmo tempo.

Bloco 1

Variáveis e tipos

Guardar dados e converter entrada do usuário.

Bloco 2

Operadores

Aritméticos, relacionais e lógicos.

Bloco 3

Condicionais

if, elif, else — decidir o caminho.

Bloco 4

range()

Gerar a sequência que o laço vai percorrer.

Bloco 5

Laços

for, while, break, continue, aninhados.

Bloco 6

Listas

Guardar coleções e percorrer com acumuladores.

Bloco 7

Funções

def, parâmetros e return — organizar e reaproveitar.

03 / 29
Bloco 1 · Fundamento

Variáveis e tipos

Uma variável é um nome que aponta para um valor guardado na memória. Em Python o tipo é definido pelo valor — você não declara, só atribui.

idade = 17            # int   → número inteiro
altura = 1.75         # float → número com vírgula
nome = "Ana"          # str   → texto
aprovado = True       # bool  → True ou False

print(type(idade))    # <class 'int'>
# input() SEMPRE devolve texto (str)
idade = input("Idade: ")     # "17" ← texto!
print(idade + 1)             # ERRO

# Converta na hora de ler:
idade = int(input("Idade: "))
nota  = float(input("Nota: "))
O erro nº 1 do bimestre: esquecer o int() ou o float() em volta do input(). O programa até roda, mas na hora da conta explode com TypeError — ou pior: soma textos e devolve "17" + "3" = "173".
04 / 29
Bloco 2 · Operadores

Operadores aritméticos

OperadorNomeExemploResultado
+Soma7 + 29
-Subtração7 - 25
*Multiplicação7 * 214
/Divisão (sempre float)7 / 23.5
//Divisão inteira (descarta a parte fracionária)7 // 23
%Resto da divisão (módulo)7 % 21
**Potência7 ** 249
O % é o operador mais útil da lista. n % 2 == 0 testa se o número é par. n % 5 == 0 testa se é múltiplo de 5. Quase toda questão de "divisível por" se resolve com o resto.
05 / 29
Bloco 2 · Operadores

Operadores relacionais

Comparam dois valores e devolvem sempre True ou False. São eles que alimentam o if e a condição do while.

OperadorSignificadoExemploResultado
==Igual anota == 10True / False
!=Diferente denome != "Ana"True / False
>Maior que7 > 2True
<Menor que7 < 2False
>=Maior ou igual6 >= 6True
<=Menor ou igual5 <= 4False
Um sinal muda tudo: = atribui um valor à variável; == compara dois valores. Escrever if nota = 10: é erro de sintaxe — o Python nem executa o programa.
06 / 29
Bloco 2 · Operadores

Operadores lógicos

Combinam duas ou mais comparações em uma única condição.

and — E

Verdadeiro só se as duas forem verdadeiras.

nota >= 6 and faltas <= 10

or — OU

Verdadeiro se pelo menos uma for verdadeira.

dia == "sab" or dia == "dom"

not — NÃO

Inverte o resultado da condição.

not aprovado

ABA and BA or Bnot A
TrueTrueTrueTrueFalse
TrueFalseFalseTrueFalse
FalseTrueFalseTrueTrue
FalseFalseFalseFalseTrue
07 / 29
Pause e responda · 1 de 4

Quanto vale 17 % 5?

Lembrando: % devolve o resto da divisão inteira.

A3.4 — o resultado da divisão
B3 — a parte inteira da divisão
C2 — o que sobra
D85 — o produto de 17 por 5
Por que 2: 5 cabe 3 vezes em 17 (3 × 5 = 15) e sobram 2. Compare os três: 17 / 53.4 (alternativa A), 17 // 53 (alternativa B) e 17 % 52. Três operadores, três respostas diferentes para os mesmos números.
08 / 29
Bloco 3 · Condicionais

if · elif · else

A estrutura de decisão testa condições de cima para baixo e executa apenas o primeiro bloco cuja condição for verdadeira. O else é a rede de segurança: roda quando nenhuma das anteriores der certo.

nota = float(input("Nota: "))

if nota >= 6.0:
    print("Aprovado")
elif nota >= 4.0:            # só testa se a de cima foi False
    print("Recuperação")
else:                         # só roda se todas foram False
    print("Reprovado")
A ordem importa. Se você escrever if nota >= 4.0 antes de if nota >= 6.0, uma nota 8 cai na recuperação — porque 8 também é maior que 4, e o primeiro que bate vence. Sempre da condição mais restritiva para a mais ampla.
09 / 29
Bloco 3 · Condicionais

Condições compostas

Quando a decisão depende de mais de um fator, combinamos comparações com and / or.

# Aprovação por nota E frequência
nota = 7.5
faltas = 8

if nota >= 6.0 and faltas <= 10:
    print("Aprovado")
elif nota >= 6.0 and faltas > 10:
    print("Reprovado por falta")
else:
    print("Reprovado por nota")
# Faixa de valores — o intervalo
idade = 16

if idade >= 12 and idade <= 17:
    print("Adolescente")

# Python aceita o encadeamento:
if 12 <= idade <= 17:
    print("Adolescente")
Armadilha clássica: if idade >= 12 or idade <= 17 com or é sempre verdadeiro — qualquer número do mundo satisfaz uma das duas partes. Para intervalo, use and. Para opções alternativas (sábado ou domingo), use or.
10 / 29
Bloco 3 · Erros comuns

Os três tropeços do if

1 — Esquecer os dois-pontos e a indentação

if nota >= 6
print("Aprovado")
# SyntaxError + IndentationError
Correto: if nota >= 6: e a linha de dentro com 4 espaços de recuo.

2 — Usar vários if em vez de elif

if nota >= 6.0:
    print("Aprovado")
if nota >= 4.0:              # testa de novo!
    print("Recuperação")     # nota 8 imprime os dois
Com elif, os testes são exclusivos: um só resultado sai.
3 — Comparar texto com número: if input("Nota: ") >= 6: quebra, porque input devolve str. Converta primeiro: nota = float(input("Nota: ")).
11 / 29
Bloco 4 · range()

range() dissecado

O range não é um laço — é um gerador de sequência de números. Ele só produz a lista de valores; quem percorre é o for.

FormaLeituraGera
range(5)de 0 até antes de 50 · 1 · 2 · 3 · 4
range(2, 6)de 2 até antes de 62 · 3 · 4 · 5
range(0, 10, 2)de 0 a 9, pulando de 2 em 20 · 2 · 4 · 6 · 8
range(10, 0, -1)de 10 até 1, de trás para frente10 · 9 · … · 2 · 1
range(len(lista))todos os índices válidos da lista0 · 1 · … · N−1
A regra de ouro: o início entra, o fim não. range(1, 11) gera de 1 a 10 — por isso, para contar de 1 até n, escrevemos range(1, n + 1).
12 / 29
Bloco 4 · range()

O fim nunca entra

Visualizando range(5) — cinco números, começando no zero, parando antes do 5:

0entra
1entra
2entra
3entra
4entra
5fica de fora
# Contar de 1 a 10 (o jeito certo)
for i in range(1, 11):
    print(i)     # 1, 2, 3 ... 10
# Tabuada do 7 — pulando de 7 em 7
for n in range(7, 71, 7):
    print(n)     # 7, 14, 21 ... 70
Por que o Python faz assim? Porque range(len(lista)) devolve exatamente os índices válidos — de 0 a N−1. O comportamento que parece estranho é o que evita o IndexError.
13 / 29
Bloco 5 · Laços

O laço for

O for repete um bloco uma vez para cada item de uma sequência. Use quando você já sabe quantas vezes vai repetir.

# Percorrendo os VALORES da lista
frutas = ["maçã", "uva", "pera"]

for fruta in frutas:
    print(fruta)
# maçã / uva / pera
# Percorrendo os ÍNDICES da lista
frutas = ["maçã", "uva", "pera"]

for i in range(len(frutas)):
    print(i, "->", frutas[i])
# 0 -> maçã / 1 -> uva / 2 -> pera
Qual dos dois usar? Se você só precisa do valor, use a forma da esquerda — é mais limpa. Se precisa da posição (para comparar com a lista ao lado, ou para alterar o item), use range(len(...)).
14 / 29
Bloco 5 · Laços

O laço while

O while repete enquanto uma condição for verdadeira. Use quando não se sabe de antemão quantas repetições serão necessárias.

# Contador — você controla o índice
i = 1
while i <= 5:
    print(i)
    i = i + 1        # sem isso: laço infinito
# Sentinela — repete até o usuário parar
senha = ""
while senha != "1234":
    senha = input("Senha: ")
print("Acesso liberado")
Todo while precisa de saída. Alguma coisa dentro do laço tem que alterar a variável da condição — seja um i += 1, seja um novo input(). Esqueceu? O programa trava e você precisa interromper com Ctrl + C.
15 / 29
Bloco 5 · Laços

for ou while?

Use for quando…

· A quantidade de repetições é conhecida
· Você vai percorrer uma lista inteira
· Precisa de uma contagem fixa (1 a 10, tabuada)

Exemplo: ler as notas de 30 alunos — você sabe que são 30.

Use while quando…

· A repetição depende de uma condição
· O usuário decide quando parar
· Você espera uma entrada válida

Exemplo: pedir a senha até acertar — pode ser 1 tentativa ou 20.
Os dois resolvem quase tudo. Todo for pode ser reescrito como while, e vice-versa. A escolha é sobre clareza: quem lê o código deve entender de cara se a repetição é contada ou condicional.
16 / 29
Bloco 5 · Controle do laço

break e continue

Duas palavras que alteram o fluxo dentro de qualquer laço.

# break — ABANDONA o laço na hora
for n in [4, 9, 7, 2, 8]:
    if n == 7:
        print("Achei o 7!")
        break            # sai do for
    print(n)
# 4 / 9 / Achei o 7!  → 2 e 8 nem são vistos
# continue — PULA para a próxima volta
for n in [4, 9, 7, 2, 8]:
    if n % 2 != 0:
        continue         # ignora os ímpares
    print(n)
# 4 / 2 / 8
Em uma frase: break encerra o laço inteiro; continue pula só a volta atual e segue para a próxima. O break é o que usamos na busca linear — encontrou, não faz sentido continuar procurando.
17 / 29
Bloco 5 · Laços

Laços aninhados

Um laço dentro do outro. O de fora dá uma volta; o de dentro dá todas as suas voltas antes de o de fora avançar.

for tabuada in range(1, 4):          # externo: 1, 2, 3
    print(f"\nTabuada do {tabuada}")
    for n in range(1, 11):           # interno: 1 a 10, TODA vez
        print(tabuada, "x", n, "=", tabuada * n)
Conta rápida: 3 voltas no externo × 10 no interno = 30 execuções da linha de dentro. É essa multiplicação que explica por que laços aninhados ficam lentos quando as listas crescem — e é exatamente a estrutura usada para percorrer matrizes (linhas × colunas).
18 / 29
Pause e responda · 2 de 4

Quantas vezes esse laço repete?

for i in range(2, 10, 3):
    print(i)
A10 vezes — imprime de 0 a 9
B3 vezes — imprime 2, 5 e 8
C8 vezes — imprime de 2 a 9
D4 vezes — imprime 2, 5, 8 e 11
Por que B: começa em 2, avança de 3 em 3 e para antes de 10. A sequência é 2 → 5 → 8; o próximo seria 11, que já passou do limite e nem chega a existir. Alternativa D erra justamente por incluir esse 11.
19 / 29
Bloco 6 · Listas

Listas (vetores)

Uma variável que guarda vários valores. Cada um ocupa uma posição — e a contagem começa no zero.

7.5[0]
8.0[1]
6.5[2]
9.0[3]
?[4] erro
OperaçãoCódigoResultado
Criarnotas = [7.5, 8.0, 6.5, 9.0]lista com 4 itens
Acessarnotas[2]6.5
Alterarnotas[0] = 10.0troca o 1º valor
Tamanholen(notas)4
Adicionarnotas.append(5.0)vira 5 itens
Último itemnotas[len(notas) - 1]o do fim
20 / 29
Bloco 6 · O padrão que resolve tudo

Percurso com acumulador

Soma, média, contagem, maior, menor, busca — todos são o mesmo laço. Muda só o que acontece dentro dele.

1

Antes do laço — criar a variável que acumula: soma = 0, maior = lista[0].

2

Dentro do laço — atualizar essa variável com o item atual.

3

Depois do laço — usar o resultado: dividir, comparar, exibir.

notas = [7.5, 8.0, 6.5, 9.0]

soma = 0                       # 1 · antes
maior = notas[0]

for i in range(len(notas)):    # 2 · dentro
    soma = soma + notas[i]
    if notas[i] > maior:
        maior = notas[i]

media = soma / len(notas)      # 3 · depois
print("Média:", media, "| Maior:", maior)
21 / 29
Pause e responda · 3 de 4

O que esse código imprime?

numeros = [3, 8, 5, 12, 7]
total = 0

for n in numeros:
    if n % 2 == 0:
        total = total + n

print(total)
A35 — a soma de todos os números
B20 — a soma só dos pares
C15 — a soma só dos ímpares
D2 — a quantidade de números pares
Por que 20: a condição n % 2 == 0 deixa passar só os pares — 8 e 12. O acumulador soma apenas esses dois: 8 + 12 = 20. Se o teste fosse total = total + 1, aí sim a resposta seria 2 (alternativa D) — contagem em vez de soma.
22 / 29
Bloco 7 · Funções

Função é uma receita

Uma função é um bloco de código com nome, que executa uma tarefa e pode ser reaproveitado quantas vezes você quiser. Em vez de repetir o mesmo trecho em três lugares, você o empacota e chama pelo nome.

def saudacao():          # DEFINIR = escrever a receita
    print("Olá, seja bem-vindo!")

saudacao()               # CHAMAR = executar a receita
print("Linha do principal.")
saudacao()
Olá, seja bem-vindo!
Linha do principal.
Olá, seja bem-vindo!
→ três saídas, uma única definição
Definir não executa nada. O código de dentro só roda quando alguém escreve o nome seguido de (). São os parênteses que diferenciam mencionar a função de executá-la — e, ao terminar, o programa volta exatamente para a linha seguinte à chamada.
23 / 29
Bloco 7 · Funções

Parâmetros e argumentos

Parâmetros são as "portas de entrada" da função: variáveis declaradas na definição que recebem valores diferentes a cada chamada.

Parâmetro

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

É o campo em branco da ficha de cadastro.

Argumento

O valor real, passado na chamada.

É o seu nome preenchido na ficha.
def media(a, b, c):          # a, b, c → PARÂMETROS
    return (a + b + c) / 3

print(media(7, 8, 6))        # 7, 8, 6 → ARGUMENTOS  → 7.0
Três funções viram uma. Sem parâmetro você escreveria media_ana(), media_bia(), media_caio(). Com parâmetro, é uma só — e mudar a regra do cálculo passa a ser mudar uma linha, não três.
24 / 29
Bloco 7 · O que mais cai

return não é print

O print mostra na tela e o valor acaba ali. O return devolve o valor para quem chamou — e encerra a função na hora.

# Só imprime — o valor se perde
def dobro(n):
    print(n * 2)

x = dobro(5)      # imprime 10
print(x)          # None ← nada voltou
# Retorna — dá para reaproveitar
def dobro(n):
    return n * 2

x = dobro(5)      # x recebe 10
print(x + 3)      # 13
Escopo: variável criada dentro da função é local — some quando a função termina. Tentar usá-la fora dá NameError. Se o programa principal precisa do valor, a função tem que return-á-lo.
25 / 29
Pause e responda · 4 de 4

O que esse código imprime?

def soma(a, b):
    total = a + b

resultado = soma(3, 4)
print(resultado)
A7 — a soma de 3 com 4
BNone — a função não retornou nada
CNameError — total não existe fora da função
D0 — o valor inicial de total
Por que None: a função até calcula total = 7, mas total é local e nunca foi devolvido — função sem return devolve None. A alternativa C só aconteceria se o print fosse de total; aqui imprimimos resultado, que existe e vale None. Conserto: trocar a linha de dentro por return a + b.
26 / 29
Quando o código não roda

Checklist de depuração

Antes de chamar o professor, passe por estas seis linhas. Elas resolvem a maioria dos erros do bimestre:

Mensagem do PythonO que quase sempre é
SyntaxErrorFaltou : no fim do if/for/while, ou um parêntese/aspas sem fechar
IndentationErrorO bloco de dentro não está recuado — ou está com espaços irregulares
NameErrorNome escrito errado, ou variável usada antes de ser criada
TypeErrorEsqueceu o int()/float() no input() — está somando texto com número
IndexErrorAcessou uma posição que não existe: índices vão de 0 a len(lista) − 1
ZeroDivisionErrorDividiu por zero — normalmente uma média com lista vazia
E quando roda, mas dá resultado errado? Aí não há mensagem: coloque print() dentro do laço para ver o valor de cada variável a cada volta. É o jeito mais rápido de descobrir onde a lógica desviou.
27 / 29
Desafio final · use tudo

Um programa, sete blocos

Escrevam um programa que use todos os conceitos revisados. Se ele funcionar, você está pronto para a avaliação.

1

Pergunte quantos números serão digitados e leia cada um, guardando em uma lista (input + int + append).

2

Percorra a lista e calcule soma, média, maior e menor (for + range + acumulador).

3

Conte quantos são pares e quantos são ímpares (operador % + if/else).

4

Pergunte um valor e diga se ele está na lista e em qual posição (busca linear + break).

5

Repita o programa até o usuário digitar "sair" (while + condição de parada).

6

Coloque cada tarefa dentro de uma função com return — ler, calcular, contar, buscar (def + parâmetros + return).

Dica de execução: não tente escrever tudo de uma vez. Faça o passo 1, rode, confira. Depois o passo 2, rode, confira. Programa que cresce testado quase nunca quebra no fim.
28 / 29
Desafio final · Como fica o código

Os sete blocos num só programa

Uma solução completa: à esquerda as funções (cada uma faz uma coisa e devolve o resultado), à direita o programa principal que as usa.

def ler_numeros(qtd):        # 1 · entrada + lista
    lista = []
    for i in range(qtd):
        lista.append(int(input(f"Nº {i + 1}: ")))
    return lista

def media(lista):            # 2 · acumulador
    soma = 0
    for n in lista:
        soma += n
    return soma / len(lista)

def contar_pares(lista):     # 3 · % + if
    pares = 0
    for n in lista:
        if n % 2 == 0:
            pares += 1
    return pares

def buscar(lista, alvo):     # 4 · busca linear
    for i in range(len(lista)):
        if lista[i] == alvo:
            return i         # return já encerra o laço
    return -1
while True:                  # 5 · condição de parada
    if input("\nEnter ou 'sair': ") == "sair":
        break

    qtd = int(input("Quantos números? "))
    numeros = ler_numeros(qtd)

    maior = menor = numeros[0]
    for n in numeros:
        if n > maior: maior = n
        if n < menor: menor = n

    pares = contar_pares(numeros)
    print("Média:", media(numeros))
    print("Maior:", maior, "| Menor:", menor)
    print("Pares:", pares,
          "| Ímpares:", len(numeros) - pares)

    alvo = int(input("Buscar qual número? "))
    print("Posição:", buscar(numeros, alvo))
Leia da direita para a esquerda: o principal vira um roteiro curto — ler, calcular, contar, buscar — e cada detalhe fica guardado na sua função. É o mesmo programa da versão sem funções, só que agora dá para testar cada pedaço isoladamente. Repare no buscar: o return substitui o break, porque devolver já encerra o laço e a função.
29 / 29
Cola de bolso

O essencial em dez linhas

  • input() devolve texto — sempre converta com int() ou float()
  • = atribui · == compara — nunca troque os dois
  • % dá o resto; n % 2 == 0 é o teste de número par
  • and exige as duas condições · or aceita uma · not inverte
  • elif torna os testes exclusivos — e a ordem das condições importa
  • range(a, b) inclui o início e exclui o fim; range(len(lista)) dá os índices válidos
  • for para repetição contada · while para repetição condicional (com saída garantida)
  • Índices vão de 0 a len(lista) − 1 — e todo cálculo em lista é acumulador dentro do laço
  • def apenas define; o código só roda quando você chama com nome() — parênteses obrigatórios
  • return devolve e encerra a função · print só mostra · sem return, a função vale None — e variável criada dentro é local
Bom estudo

Reabram este deck no celular na véspera da prova — ele funciona offline depois de carregado e vale mais lido em voz alta do que decorado em silêncio.