Python for

Na aula while, você repetiu um bloco enquanto uma condição era verdadeira, e cuidou de tudo à mão: criar o contador, testar, somar 1. Muitas vezes, porém, o que você quer é mais simples: fazer alguma coisa com cada letra de um texto, ou com cada item de uma lista de compras. Para isso existe o for (em inglês, "para"): para cada item, faça isto.

Você vai aprender
  • Como se escreve um for: a variável, o in, o que vai ser percorrido, os dois-pontos e o bloco.
  • A percorrer um texto, letra por letra, e a contar letras com um if dentro do laço.
  • O mínimo de listas para percorrê-las: a lista de compras, as notas da turma.
  • A somar durante o laço e a calcular uma média.
  • O que acontece com a variável depois do laço, e com uma lista vazia.
  • Quando usar for e quando usar while, e os erros reais mais comuns.

Todos os programas desta aula rodaram no Python 3.14 da máquina da Ana (usuária ana, computador notebook), com python3 arquivo.py. Você pode rodar cada um no editor do guia.


A ideia: "para cada item da lista, ponha no carrinho"

A Ana vai ao mercado com uma lista de compras: pão, leite, café, manteiga. No mercado, ela não pensa "vou repetir 4 vezes". Ela pensa: "para cada item da lista, pego o item e ponho no carrinho". Ela começa pelo primeiro, vai até o último, e para quando a lista acaba. Ninguém precisa contar nada.

O for funciona assim:

  1. Pega o primeiro item e dá a ele um nome (por exemplo, item).
  2. Roda o bloco com esse item.
  3. Pega o próximo item, guarda no mesmo nome, roda o bloco de novo.
  4. Quando não há mais itens, sai do laço.

A diferença para o while: lá, você escrevia uma condição e cuidava do contador. No for, você diz o que percorrer, e o Python cuida do resto: começa, avança e para sozinho.


1. O primeiro for: as letras de um texto

Um texto (uma string) é uma sequência de letras. O for passa por elas, uma de cada vez:

for letra in "Ana":
    print(letra)
print("Acabaram as letras.")
for
A palavra-chave do laço: "para".
letra
A variável do laço. A cada volta, ela recebe o próximo item. O nome é você quem escolhe; letra deixa claro o que ela guarda. Você não precisa criá-la antes: o for cria.
in
"Em", "dentro de". Lê-se a linha inteira assim: "para cada letra em "Ana"".
"Ana"
O que vai ser percorrido. Aqui, um texto de 3 letras: o laço vai dar 3 voltas.
:
Os dois-pontos, como no if e no while: "agora vem o bloco".
print(letra)
O corpo do laço, indentado com 4 espaços. Roda uma vez para cada letra.
print("Acabaram as letras.")
Na margem esquerda: fora do laço, roda uma vez só, no fim.
$ python3 letras.py
A
n
a
Acabaram as letras.

Passo a passo

VoltaValor de letraO que aparece
1ª"A"A
2ª"n"n
3ª"a"a
—acabaram as letraso laço termina; vem Acabaram as letras.

Repare no que não existe aqui: nenhum contador, nenhuma condição, nenhum += 1. O for sabe sozinho onde começar, como avançar e quando parar. Por isso é muito mais difícil escrever um laço infinito com ele.

Soletrando numa linha só

Com o end do print (aula As Opções sep e end), as letras ficam na mesma linha, separadas por um tracinho:

nome = "Padaria"
for letra in nome:
    print(letra, end="-")
print()
$ python3 soletrar.py
P-a-d-a-r-i-a-

O texto pode estar numa variável (nome): o for percorre o valor dela. O print() vazio no fim, fora do laço, só pula a linha. (Sim, sobrou um tracinho depois do último a; a aula de Métodos de Texto mostra um jeito de juntar letras sem sobras.)

Missão: troque o nome para "Luana" e o separador para um asterisco ("*"). A saída deve ser L*u*a*n*a*.

nome = "Padaria"
for letra in nome:
    print(letra, end="-")
print()
nome = "Luana"
for letra in nome:
    print(letra, end="*")
print()

2. Um if dentro do for: contar letras

Dentro do bloco do for pode ir qualquer coisa, inclusive um if. Quantas letras a tem a palavra banana?

palavra = "banana"
quantos = 0
for letra in palavra:
    if letra == "a":
        quantos += 1
print(f"A palavra {palavra} tem {quantos} letras a.")
$ python3 contar_a.py
A palavra banana tem 3 letras a.
quantos = 0
Um contador, criado antes do laço. Ele não conta as voltas (são 6), e sim só as letras que interessam.
if letra == "a":
Em cada volta, pergunta se a letra da vez é um a. Repare na indentação: o if está 4 espaços para dentro (faz parte do for)…
quantos += 1
…e esta linha está 8 espaços para dentro: faz parte do if. Só roda quando a letra é a.

Atenção: a comparação diferencia maiúsculas de minúsculas. Para o Python, "A" == "a" é False:

for letra in "Aa":
    print(letra, letra == "a")
$ python3 maiusc.py
A False
a True

3. Percorrendo uma lista

Uma lista guarda vários valores numa variável só. Ela tem aula própria logo adiante (Listas); por enquanto, basta saber escrever uma:

compras = ["pão", "leite", "café", "manteiga"]
for item in compras:
    print(f"- {item}")
print(f"São {len(compras)} itens.")
[ … ]
Os colchetes abrem e fecham a lista.
"pão", "leite", …
Os itens, separados por vírgula. Aqui são textos, mas podem ser números.
for item in compras:
"Para cada item em compras." A cada volta, item recebe o próximo item da lista, na ordem em que estão escritos.
len(compras)
O tamanho da lista: quantos itens ela tem (a mesma função len() que mede o tamanho de um texto).
$ python3 compras_lista.py
- pão
- leite
- café
- manteiga
São 4 itens.
Um costume que ajuda a ler: plural e singular

Dê à lista um nome no plural (compras, notas, alunos) e à variável do laço o mesmo nome no singular (item, nota, aluno). Aí a linha se lê como uma frase: for nota in notas, "para cada nota nas notas". Os nomes vão sem acento (preco, não preço): o Python aceitaria o acento, mas não é o costume.

Somando durante o laço: a média da turma

A técnica do acumulador, que você viu no while, funciona igual no for: uma variável começa em 0 antes do laço e recebe mais um pouco a cada volta.

notas = [7.5, 8.0, 6.5, 9.0]
soma = 0
for nota in notas:
    soma += nota
media = soma / len(notas)
print(f"Soma: {soma}")
print(f"Média: {media}")
$ python3 media.py
Soma: 31.0
Média: 7.75

A soma passou por 0 → 7.5 → 15.5 → 22.0 → 31.0. A média é a soma dividida pela quantidade de notas: 31.0 / 4 = 7.75. Repare que a conta da média fica fora do laço: ela só pode ser feita depois de todas as notas somadas.

Missão: a compra da Ana na padaria custou R$ 4,50, R$ 12,90 e R$ 3,25. O programa mostra cada preço, mas o total sai zerado. Mude o bloco do for para somar cada preço no total (com +=). A saída deve terminar com Total: R$ 20.65.

precos = [4.50, 12.90, 3.25]
total = 0
for preco in precos:
    print(preco)
print(f"Total: R$ {total:.2f}")
precos = [4.50, 12.90, 3.25]
total = 0
for preco in precos:
    total += preco
print(f"Total: R$ {total:.2f}")

4. Dois detalhes que vale saber

A variável continua existindo depois do laço

for letra in "sol":
    print(letra)
print(f"Depois do laço, letra vale {letra}")
$ python3 depois.py
s
o
l
Depois do laço, letra vale l

Quando o laço termina, a variável fica com o último valor que recebeu: l, a última letra. Dá para usar esse valor, mas não conte muito com isso: fica mais claro usar a variável do laço só dentro dele.

Lista vazia: zero voltas

pendentes = []
for tarefa in pendentes:
    print(f"Falta: {tarefa}")
print("Fim da lista de tarefas.")
$ python3 vazia.py
Fim da lista de tarefas.

[] é uma lista sem nenhum item. Não há nada para percorrer, então o bloco não roda nenhuma vez, e o programa segue. Não é erro: é a Ana sem tarefas pendentes. O mesmo vale para um texto vazio, "".


5. E para contar de 1 a 10?

O for percorre sequências: textos, listas e outras. Um número sozinho, como 10, não é uma sequência (veja o erro em Quando dá errado). Para contar, o Python tem a função range() ("faixa"), que fabrica a sequência de números para o for percorrer:

for contador in range(1, 6):
    print(f"Volta {contador}")
$ python3 contador_for.py
Volta 1
Volta 2
Volta 3
Volta 4
Volta 5

É o mesmo resultado do primeiro while da aula anterior, em duas linhas. Por que range(1, 6) para ir até 5? Essa é a próxima aula: range().


Formas diferentes de fazer a mesma coisa

Mostrar cada item de uma lista dá para fazer com while, usando um contador como posição na lista (o compras[i] pega o item da posição i, contando do zero, como nos índices de texto):

compras = ["pão", "leite", "café"]
i = 0
while i < len(compras):
    print(f"- {compras[i]}")
    i += 1

…ou com for, direto nos itens:

compras = ["pão", "leite", "café"]
for item in compras:
    print(f"- {item}")

Os dois mostram exatamente a mesma coisa:

$ python3 while_indice.py
- pão
- leite
- café
$ python3 for_direto.py
- pão
- leite
- café

A versão com for tem menos peças para dar errado: não tem contador para esquecer de somar, nem condição para errar por um (< ou <=?). Quem programa em Python prefere o for sempre que o trabalho é "passar por cada item".

SituaçãoQual usar
Fazer algo com cada letra de um texto ou cada item de uma listafor item in sequencia:
Repetir um número conhecido de vezes (contar de 1 a 10)for numero in range(…): (aula range())
Repetir sem saber quantas vezes: até a meta, até digitar 0, até a resposta ser válidawhile condição: (aula while)

Quando dá errado

Esqueceu o in
for letra "Ana":
    print(letra)
$ python3 sem_in.py
  File "/home/ana/sem_in.py", line 1
    for letra "Ana":
              ^^^^^
SyntaxError: invalid syntax

"Erro de sintaxe: sintaxe inválida". Aqui o Python não dá dica do que faltou, mas os ^^^^^ apontam o lugar: logo depois da variável ele esperava o in e encontrou o texto "Ana". Como consertar: for letra in "Ana":. Todo for tem as quatro partes: for, a variável, in e o que percorrer.

Esqueceu os dois-pontos
for letra in "Ana"
    print(letra)
$ python3 for_dois_pontos.py
  File "/home/ana/for_dois_pontos.py", line 1
    for letra in "Ana"
                      ^
SyntaxError: expected ':'

"Era esperado :", e o ^ mostra onde. Como consertar: for letra in "Ana":.

Tentou percorrer um número
for numero in 10:
    print(numero)
$ python3 numero.py
Traceback (most recent call last):
  File "/home/ana/numero.py", line 1, in <module>
    for numero in 10:
                  ^^
TypeError: 'int' object is not iterable

"Erro de tipo: um objeto int (número inteiro) não é iterável". Iterável é o nome técnico de "coisa que dá para percorrer item por item": textos e listas são; um número, não. O 10 é um valor só; o Python não sabe que você queria "de 1 a 10" ou "de 0 a 9". Como consertar: use range(): for numero in range(1, 11): (aula range()).

Usou a lista no lugar do item (plural × singular)
notas = [7.5, 8.0, 6.5, 9.0]
soma = 0
for nota in notas:
    soma += notas
print(f"Soma: {soma}")
$ python3 plural.py
Traceback (most recent call last):
  File "/home/ana/plural.py", line 4, in <module>
    soma += notas
TypeError: unsupported operand type(s) for +=: 'int' and 'list'

"Erro de tipo: tipos de operando não suportados para +=: int e list". Na linha 4, o programa tentou somar ao número soma a lista inteira notas, com s, e não a nota da vez. Uma letra de diferença. Como consertar: soma += nota, no singular.

O print ficou dentro do laço

Este não dá mensagem de erro; dá uma saída estranha:

precos = [4.50, 12.90, 3.25]
total = 0
for preco in precos:
    total += preco
    print(f"Total: R$ {total:.2f}")
$ python3 dentro.py
Total: R$ 4.50
Total: R$ 17.40
Total: R$ 20.65

O print tem 4 espaços na frente, então faz parte do laço e roda a cada volta, mostrando a soma pela metade. Como consertar: tire a indentação do print, para ele rodar uma vez só, depois do laço. (Às vezes é exatamente isso que se quer, um "subtotal" a cada item. A indentação decide.)

Esqueceu uma vírgula na lista
compras = ["pão", "leite" "café"]
for item in compras:
    print(f"- {item}")
$ python3 virgula.py
- pão
- leitecafé

Nenhum erro, mas o leite e o café viraram um item só. Quando dois textos ficam lado a lado sem nada entre eles, o Python os junta num texto só (aula Juntar e Repetir Textos). A lista ficou com 2 itens em vez de 3. Como consertar: ponha a vírgula: ["pão", "leite", "café"].


Referência rápida

EscritaO que faz
for letra in "texto":Roda o bloco uma vez para cada letra
for item in lista:Roda o bloco uma vez para cada item, na ordem da lista
["pão", "leite"]Uma lista: itens entre colchetes, separados por vírgula
[]Lista vazia: o for dá zero voltas
len(lista)Quantos itens a lista tem
total += item dentro do laçoAcumular (somar) a cada volta
if …: dentro do laçoFazer algo só com alguns itens (contar, escolher)
for numero in range(1, 6):Contar de 1 a 5 (aula range())
SintomaCausa provável
SyntaxError: invalid syntax na linha do forFaltou o in
SyntaxError: expected ':'Faltaram os dois-pontos
TypeError: 'int' object is not iterableTentou percorrer um número: use range()
TypeError: unsupported operand type(s) for +=: 'int' and 'list'Usou a lista (plural) no lugar do item (singular)
O resultado aparece repetido, pela metadeO print ficou indentado, dentro do laço
Dois itens grudados (leitecafé)Faltou uma vírgula entre os textos da lista

Exercícios

1. Complete o laço

Complete para mostrar cada fruta da lista:

frutas = ["maçã", "banana", "uva"]
fruta frutas:
    print(fruta)

2. Quantas voltas?

Quantas voltas dá o laço for letra in "Python":? Responda com um número.

São voltas.

3. O que este programa mostra? soma = 0 / for n in [2, 3, 5]: /     soma += n / print(soma)

4. Por que for numero in 10: dá TypeError: 'int' object is not iterable?

5. Depois de for letra in "pão": terminar, quanto vale letra?

Missão final: as letras da mágica

Missão: quantas vezes a letra a aparece em abracadabra? Escreva um for no lugar do comentário que percorra a palavra e some 1 em quantos a cada letra a.

palavra = "abracadabra"
quantos = 0
# escreva o for aqui

print(f"A letra a aparece {quantos} vezes.")
palavra = "abracadabra"
quantos = 0
for letra in palavra:
    if letra == "a":
        quantos += 1
print(f"A letra a aparece {quantos} vezes.")

No lab, saiu A letra a aparece 5 vezes. Depois, troque a letra procurada por "b" e por "r".


Resumo

  • for item in sequencia: ("para cada item em…") roda o bloco uma vez para cada item, do primeiro ao último, e para sozinho.
  • Dá para percorrer um texto (letra por letra) e uma lista (item por item). Uma lista se escreve entre colchetes, com os itens separados por vírgula.
  • A variável do laço é criada pelo próprio for; depois do laço, ela fica com o último valor.
  • Acumuladores e contadores funcionam igual ao while: crie antes do laço, atualize dentro, use o resultado depois.
  • Sequência vazia: zero voltas, sem erro. Número sozinho não se percorre: para contar, use range().
  • Prefira o for para "passar por cada item"; deixe o while para quando não se sabe quantas voltas vão ser.