Curso de Python / Repetir com for, range, enumerate e zip

Um laço for processa os elementos de um iterável, um objeto que fornece itens para percorrer. Use os valores diretamente quando possível, enumerate() quando precisar de uma contagem e zip() para percorrer coleções relacionadas em conjunto.

Percorra valores ou uma faixa numérica

Em Python, for não exige que você incremente manualmente o índice de uma lista. Ele pode percorrer a própria lista, uma string ou outro iterável. Quando a tarefa requer uma sequência numérica, range(start, stop, step) define início, limite excluído e passo.

for value in range(1, 4):
    print(value)

Esse pequeno exemplo mostra 1, 2 e 3, um valor por linha. O limite 4 não é incluído. Um passo negativo percorre valores em ordem decrescente; o limite continua excluído. range não é uma lista que armazena previamente todos os números. O tutorial oficial de controle de fluxo compara essas formas de repetição.

As instruções de cada repetição ficam indentadas sob o for. Se o iterável não tiver itens, o bloco será executado zero vezes. Inicialize fora do laço qualquer resultado que também precise existir quando a entrada estiver vazia.

Associe nomes e valores com números de exibição

Salve o programa completo abaixo em UTF-8 como for_loop.py, na pasta do projeto, e execute python for_loop.py no ambiente selecionado. No macOS ou Ubuntu, fora de um ambiente virtual, use python3 se esse for o comando da instalação. Os dados já estão nas duas listas; não são necessários pacotes nem arquivos externos.

names = ["coffee", "lunch", "bus"]
amounts = [3500, 8000, 2500]
for number, (name, amount) in enumerate(zip(names, amounts, strict=True), start=1):
    print(number, name, amount)
print(list(range(5, 0, -2)))

A saída esperada é:

1 coffee 3500
2 lunch 8000
3 bus 2500
[5, 3, 1]

zip() associa cada nome ao valor na posição correspondente. enumerate(..., start=1) acrescenta a contagem que aparece no início de cada linha. O alvo number, (name, amount) desempacota tanto o número quanto o par recebido. A aula de tuplas e desempacotamento explica essa correspondência de elementos.

A última linha converte o intervalo em uma lista para mostrá-lo. Partindo de 5 e subtraindo 2 a cada passo, os valores anteriores ao limite excluído são 5, 3 e 1.

Confira a contagem e a igualdade de comprimentos

O argumento start=1 muda a contagem de enumerate(), não os índices das listas originais. O primeiro nome ainda está no índice zero. Prefira usar o valor recebido no desempacotamento, em vez de procurar a lista com um número destinado à exibição.

Por padrão, zip() termina quando a coleção mais curta acaba e ignora os itens restantes da outra. Se as listas precisam ter o mesmo comprimento, strict=True torna uma diferença visível por meio de ValueError. Essa opção está disponível desde Python 3.10 e é compatível com o ambiente 3.12 ou posterior do curso. A referência de zip() descreve o comportamento padrão e o modo estrito.

A verificação estrita acontece durante o consumo do iterador. Ela não valida todas as linhas antes de o laço começar: algumas linhas podem ser mostradas antes de o comprimento diferente ser descoberto. Se uma operação exige validar tudo antes de modificar dados, planeje uma etapa de verificação anterior, em vez de presumir que strict=True desfaz efeitos já produzidos.

Duas listas paralelas também podem ter o mesmo comprimento e campos emparelhados incorretamente. Quando os registros ficarem mais complexos, considere guardar cada nome e valor no mesmo registro, por exemplo em uma lista de dicionários. Comprimento igual é uma condição necessária neste exemplo, mas não prova que os dados foram associados corretamente.

Teste os limites e preserve a coleção percorrida

  1. Remova somente 2500 de amounts. Execute e observe duas linhas de despesas antes de ValueError. A impressão final do intervalo não será alcançada.
  2. Mantenha essa lista curta e remova , strict=True da chamada de zip(). Agora serão mostradas apenas duas despesas, sem erro de comprimento, seguidas de [5, 3, 1].
  3. Restaure 2500 e a opção strict=True. Confirme as quatro linhas originais.
  4. Troque somente range(5, 0, -2) por range(5, -1, -2). O resultado continua sendo [5, 3, 1], pois -1 é o limite excluído. Para incluir -1 nesse passo, um limite como -2 produz [5, 3, 1, -1]. Restaure a expressão original.

Apagar elementos da lista que está sendo percorrida pode fazer o laço pular itens quando as posições mudam. Separe a leitura da coleção da alteração de sua estrutura: percorra uma cópia, reúna as mudanças primeiro ou construa uma nova coleção filtrada. Confira a quantidade de linhas e seus valores, além de observar apenas se o programa terminou sem erro.