Estruturas de Repetição: for
Além do loop while, também existe um outra alternativa para repetições no python, o for. O for possui uma sintaxe bem menos verbosa (isso significa que o for pode fazer a mesma coisa que o loop while, porém com menos linhas de código) e ainda te permite iterar sobre listas ou coleções (Assunto mais adiante).
Exemplo básico de for
Exemplo ruim de uma contagem até 5:
print('Contagem: 1')
print('Contagem: 2')
print('Contagem: 3')
print('Contagem: 4')
print('Contagem: 5')
Exemplo recomendável e certo de contar até 5:
for contagem in range(1, 6):
print(f'Contagem: {contagem}')
Entendendo o loop for range
for range: Conta do início até o fim, como uma contagem regressiva (ou progressiva).
Sintaxe:
for contador in range(inicio, fim, passos):
bloco de códigos
Primeiramente utiliza-se a palavra-chave for, em seguida uma variável desejada, como contador, e por fim utiliza-se 'in' e o range(), contendo dentro dos seus parênteses os números especificados. Vamos ver um exemplo:
for contador in range(0, 5, 1):
print(contador)
Utilizamos o for, a variável contador, logo em seguida o in range(0, 5, 1). Vamos explicar o range. O primeiro número do range significa em qual número ele deve começar, nesse caso, 0. O segundo número diz até quando o contador deve parar, nesse caso 4, pois o fim sempre é subtraído em -1, ou seja, se o número final é 10, então na verdade seu fim é 9. E o último número diz quantos em quantos passos o contador irá pular, nesse caso é 1, então contará normalmente de 0 a 4. Por fim é colocado dentro da estrutura do for o comando de blocos, nesse caso, imprimirá o contador, ou seja, imprimirá: 0, 1, 2, 3, 4.
Vamos ver mais um exemplo:
for i in range(1, 6, 1):
print(i)
Declaramos a variável i, e o range começa do 1, termina até o 6, e pula de 1 em 1 número (isso é, normalmente). A saída será: 1, 2, 3, 4, 5
Lembre-se que o for é uma estrutura de repetição, então sempre que executar uma vez o bloco de código dentro dele, a variável contador será subtraída ou adicionada em 1, como um loop while. Veremos mais a frente a diferença entre loop while e loop for.
Omitindo parâmetros do range
Mas não é necessário colocar em quantos em quantos passos a variável vai pular. podemos utilizar essa sintaxe:
for i in range(inicio, fim):
bloco de comandos
Vamos ver um exemplo:
for i in range(1, 4):
print(i)
Declaramos a variável contadora 'i', e o seu range de início é de 1, ou seja, comecará em 1, e seu range de fim é 4, ou seja, terminará em 3, pois o fim é sempre subtraído. A saída desse for é: 1, 2, 3
Porém ainda é possível omitir o range de início, restando apenas o range de fim! Vamos ver como isso ficaria:
for i in range(fim):
bloco de comandos
for i in range(5):
print(i)
Aqui omitimos o range de início, então ele começará em 0, e terminará em 4, bela reduzida, não é mesmo?
Exemplo prático
Vamos ver um exemplo mais avançado:
for foguete in range(4):
print(f'Lançando em {foguete}')
Vamos entender o código. Declaramos a variável foguete, que conta de 0 até 3. O seu bloco de código imprimirá 'Lançando em {e o número do contador}'. Cada execução que o loop realizar, será incrementado em +1 a variável foguete. Vamos entender melhor isso:
for i in range(1, 4):
print(i)
Esse bloco de código começa em 1, e termina em 3. A cada execução, é incrementada +1 a variável i, e o programa verifica se i é maior que 3. Se a variável i for maior que 3, então o loop para de executar, pois sua condição já esteve satisfeita. Não parece, mas o loop for também há uma condição, conseguiu perceber?
for i in condição:
bloco de código
Mas nesse caso a condição é o range, e não uma comparação tradicional com operadores de comparação como num loop while. É claro que o programa faz comparação no loop for, mas isso não é visível. Vamos ver apenas um último exemplo:
for repeticao in range(1, 6):
print('Estou repetindo!')
Ok, declaramos uma variável repeticao e agora ela repete de 1 até 5, e a cada repetição, será incrementada +1 na variável, executando o bloco de código 'Estou repetindo!'. Acompanhe comigo: A variável repeticao tem o valor de 1, então o programa verifica se a repeticao é menor que 5, e como 1 é menor que 5, então executa o bloco de código, imprimindo o que estiver lá dentro. Na segunda, terceira, quarta, quinta repetição, o programa verifica se ainda a variável não é 5, então executa novamente. Mas quando a variável repeticao é 6, o programa compara, e vê que a variável já chegou ao fim, já terminou. Então simplesmente para de executar o loop e executa o resto do programa.
For com else
Então, que tal ver um loop for com um else, lembrando muito as condições?
for foguete in range(4):
print(f'Lançando em {foguete}')
else:
print('Lançar!')
Vamos lá, foi declarada a variável foguete, que começa em 0 e termina em 3. Na primeira repetição é executado o loop, executando o seu bloco de código, e imprime 'lançando em {e a variável}'. Como nesse caso não especificamos o início e apenas o fim, então a repetição começará do 0. Ou seja, na primeira repetição imprimirá 'Lançando em 0', pois a variável foguete tem o valor 0. Então é feita mais uma repetição, e desta vez o valor da variável é 1, pois a cada execução a variável é incrementada em 1, e então, imprime 'Lançando em 1'. E repete isso até chegar na repetição 4. O programa verifica se a variável é 4, e então, ignora o bloco de código do loop for e executa o else. Lembra do else, aquele utilizado em condições, que quando uma condição é falsa, ele é executado? Então, o programa viu que a condição do loop for é falsa e executou o else, imprimindo na tela 'Lançar!'.
Diferença entre while e for
Vamos lá, hora de responder algumas perguntas
Qual a diferença entre loop while e loop for?
Um loop while pode ser usado quando não se sabe ao certo quantas repetições você quer que algo repita. o while True é um exemplo muito bom disso, pois executa a repetição infinitamente, e só para quando é feito o uso de um break. Vamos ver um loop while True:
while True:
nome = input("Digite o seu nome ou 'exit' para sair: ")
if nome == 'exit':
break
Vamos explicar: Criamos um loop while True, isso significa que o loop executará infinitamente. Pedimos ao usuário o seu nome, e isso ficará executando. O loop while só terminará de executar quando o usuário digitar 'exit', pois foi feito o uso do break, quebrando o laço while. Então enquanto o usuário digitar qualquer outra coisa que não seja 'exit', o loop ficará executado seu bloco de código para sempre, perguntado ao usuário seu nome infinitamente. A única forma de parar essa repetição é utilizando um break.
Já um loop for pode ser usado quando já se sabe o número de repetições que você quer. Um exemplo:
for i in range(6):
print('Já sei quantas vezes serei executado! 5 vezes!')
Iteração em listas e strings
Agora vamos ver alguns exemplos de iteração em listas. A iteração em listas segue o mesmo conceito da iteração com strings, mas a grande diferença é que a iteração em listas imprime cada elemento da lista, e não cada letra. Vamos ver alguns exemplos.
Iterando com o loop for
Uma iteração significa acessar cada elemento ou caractere de uma sequência, como uma lista ou uma string. Vamos ver alguns exemplos:
Vamos supor que temos uma string, e queremos imprimir cada letra da string individualmente. É possível fazer isso com uma iteração:
string = 'texto'
for letra in string:
print(letra)
Aqui já é notável que as coisas mudaram, vamos entender. Declaramos a variável string e atribuímos seu valor a 'texto'. Em seguida, criamos um loop for e uma variável letra, ela será responsável por iterar sobre cada caractere da string, ou seja, imprimir cada letrinha. Lembrando que o nome da variável após o loop for pode ser qualquer um que você desejar. O código acima se lê assim:
para cada letra na string, então imprima a letra.
Vamos ver mais exemplos:
pais = 'Brasil' # Lembrando que variáveis não devem ter acentuações!
for letra in pais:
print(letra)
Vamos entender: Declaramos a variável pais, e em seguida o loop for, seguido da variável letra, que itera sobre cada letra da variável pais (Brasil). Então isso imprimirá cada letra do Brasil em uma linha diferente, ou seja:
B
r
a
s
i
l
Iteração em listas
Agora vamos falar de iterações com listas. As iterações com listas diferentemente das iterações com strings, imprimem cada elemento da lista, e não cada letra da lista. É feito quase a mesma coisa com a iteração de strings, vamos ver um exemplo:
Vamos supor que queremos imprimir individualmente cada elemento de uma lista de frutas:
frutas = ['Maçã', 'Banana', 'Laranja']
for fruta in frutas:
print(fruta)
Vamos entender: Declaramos a lista frutas, declaramos o laço for seguido pelo nome da variável e a palavra-chave in com a lista frutas, e no seu bloco de código imprime cada fruta, resultado em:
Maçã
Banana
Laranja
Uma coisa muito importante a dizer é que, ao executar o bloco de códigos dentro do loop for, a repetição é feita novamente até não possuir mais elementos dentro da lista.
Repare que o nome da lista está escrito no plural ('frutas') e o nome da variável após o for está escrito em singular ('fruta') indicando que isso acessará cada elemento da lista individualmente.
Vamos ver mais um exemplo:
animais = ['Coruja', 'Lobo', 'Cachorro', 'Cavalo']
for animal in animais:
print(animal)
O loop for acima se lê assim: Para cada animal na lista de animais, então: imprima animal. Vamos entender melhor, declaramos a lista animais seguido pelo loop for, que itera a cada elemento, e imprime cada elemento individualmente, conseguiu compreender?
Exemplo avançado com continue
Vamos a alguns exemplos mais avançados:
Vamos supor que estavamos minerando numa caverna, mas não queremos que tenha Ferros, apenas queremos outros minérios, e ignorar o minério Ferro. Podemos utilizar um loop for e dentro desse loop utilizar uma estrutura de condição verificando se Ferro está na lista. Se estiver, então queremos que o programa ignore esse minério. Vamos como isso funciona:
minerios = ['Diamante', 'Ouro', 'Ferro', 'Cobre']
for minerio in minerios:
if minerio == 'Ferro':
continue
print(minerio)
Vamos entender esse código. Criamos uma lista e dentro dela possui minérios. Em seguida utilizamos o loop for, para iterar sobre cada elemento. Dentro deste loop for, utilizamos uma estrutura de condição para verificar se o elemento que estamos iterando é Ferro. Se o elemento for ferro, então simplesmente ignoramos esse elemento e a repetição retorna ao início, verificando se o elemento é ferro novamente, se não for, apenas imprime o minério. A saída desse código é a seguinte:
Diamante
Ouro
Cobre
Tópicos avançados
Vamos supor que você está iterando uma lista, e quer verificar se algum elemento está na lista. Você utiliza uma condição para verificar e quando verifica, o elemento dentro da lista era maiúsculo, e você utilizou letras minúsculas. Veja o exemplo a seguir:
produtos = ['Fone', 'Celular', 'Tablet', 'Computador']
for produto in produtos:
if produto == 'celular':
print('Achei um celular!')
Aqui há um grande problema. Repare que na lista, celular está com sua primeira letra em maiúsculas ('Celular') e você está verificando se 'celular' (em minúsculas) está na lista produtos. Não vai ter nenhuma saída, pois 'Celular' é diferente de 'celular'. Por sorte podemos utilizar uma função de strings para converter todos os produtos em minúsculas, o lower(). O código ficaria assim:
produtos = ['Fone', 'Celular', 'Tablet', 'Computador']
for produto in produtos:
produto = produto.lower()
if produto == 'celular':
print('Achei um celular!')
Agora sim. O que foi alterado nesse código é que antes de tudo, convertemos todos os produtos da lista para minúsculas, e em seguida, verificamos se celular está na lista. Veja como a função lower() é muito importante.