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.
- Como se escreve um
for: a variável, oin, o que vai ser percorrido, os dois-pontos e o bloco. - A percorrer um texto, letra por letra, e a contar letras com um
ifdentro 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
fore quando usarwhile, 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:
- Pega o primeiro item e dá a ele um nome (por exemplo,
item). - Roda o bloco com esse item.
- Pega o próximo item, guarda no mesmo nome, roda o bloco de novo.
- 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;
letradeixa claro o que ela guarda. Você não precisa criá-la antes: oforcria. - in
- "Em", "dentro de". Lê-se a linha inteira assim: "para cada
letraem"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
ife nowhile: "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
| Volta | Valor de letra | O que aparece |
|---|---|---|
| 1ª | "A" | A |
| 2ª | "n" | n |
| 3ª | "a" | a |
| — | acabaram as letras | o 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: oifestá 4 espaços para dentro (faz parte dofor)… - 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
itememcompras." A cada volta,itemrecebe 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.
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ção | Qual usar |
|---|---|
| Fazer algo com cada letra de um texto ou cada item de uma lista | for 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álida | while condição: (aula while) |
Quando dá errado
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.
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":.
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()).
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.
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.)
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
| Escrita | O 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ço | Acumular (somar) a cada volta |
if …: dentro do laço | Fazer algo só com alguns itens (contar, escolher) |
for numero in range(1, 6): | Contar de 1 a 5 (aula range()) |
| Sintoma | Causa provável |
|---|---|
SyntaxError: invalid syntax na linha do for | Faltou o in |
SyntaxError: expected ':' | Faltaram os dois-pontos |
TypeError: 'int' object is not iterable | Tentou 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 metade | O 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:
fruta frutas:
print(fruta)
2. Quantas voltas?
Quantas voltas dá o laço for letra in "Python":? Responda com um número.
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
forpara "passar por cada item"; deixe owhilepara quando não se sabe quantas voltas vão ser.