Listas, for e range: repetindo sem copiar e colar
Imprimir dez preços copiando e colando dez vezes o mesmo print é um desperdício. Um laço faz o Python repetir uma instrução para cada item, sozinho.
Estudar esta lição interativa →Imagine uma lista de preços de um carrinho de compras: imprimir cada um copiando e colando um print para cada item funciona para três produtos, mas vira um pesadelo de manter com trinta. É exatamente o problema que um laço resolve: uma única instrução que o Python repete, sozinho, uma vez para cada item de uma coleção.
Antes do laço, veja como criar e acessar uma lista, a coleção mais usada do Python:
precos = [8.9, 15.0, 22.5]
print(precos[0])
print(precos[1])
print(precos[2])Índices começam em 0: precos[0] é o primeiro item, não o segundo.
Agora o laço for: ele pega, um de cada vez, todo item de uma lista (ou de qualquer outra coleção), executando o bloco recuado abaixo dele para cada um, na ordem, até acabar.
precos = [8.9, 15.0, 22.5]
for preco in precos:
print(f"Preço: R$ {preco:.2f}")Pense num for como alguém tirando, um de cada vez, cada item de dentro de uma caixa e fazendo a mesma coisa com ele antes de pegar o próximo: nunca pula um item, nunca repete, e para automaticamente quando a caixa esvazia.
Quando você precisa repetir algo um número específico de vezes (não necessariamente ligado a uma lista), range(n) gera uma sequência de números de 0 até n - 1, pronta para um for percorrer:
for numero in range(5):
print(numero)range(5) gera 0, 1, 2, 3, 4: cinco números, não seis.
range(2, 10, 2) começa em 2, para antes de chegar em 10, pulando de 2 em 2: gera 2, 4, 6, 8. O terceiro número (o passo) é opcional; sem ele, o padrão é andar de 1 em 1.
Uma lista com 3 itens tem índices válidos 0, 1 e 2, nunca 3. Tentar precos[3] numa lista de 3 itens gera IndexError: list index out of range, um dos erros mais comuns de quem está começando (geralmente por confundir "quantidade de itens" com "último índice válido"). O último índice válido é sempre len(lista) - 1, nunca len(lista).
Escrever b = a não cria uma lista nova: cria um segundo nome para a mesma lista. Mudar por um nome muda para o outro. Quando você quer uma cópia de verdade, use a.copy() (ou list(a), ou a[:]). Isso vale para todo tipo mutável do Python, como as listas e os dicionários que você vai ver adiante. Um aviso a mais: a cópia é rasa, então uma lista que guarda outras listas ainda compartilha as de dentro.
a = [1, 2, 3]
b = a # b NÃO é uma cópia: é outro nome para a MESMA lista
b.append(4)
print(a) # [1, 2, 3, 4]
print(a is b) # True (o mesmo objeto)
c = a.copy() # cópia de verdade (também: list(a) ou a[:])
c.append(5)
print(a) # [1, 2, 3, 4]
print(c) # [1, 2, 3, 4, 5]
print(a is c) # Falseb = a não copia. a.copy() copia.
for numero in range(5):
print(numero)Ajuste o range para imprimir de 1 a 5.