Laços de Repetição: for e while
Dominando o Python em 1 Ano
Artigo 05 — Laços de Repetição: for e while
Prof. Ricardo Matos Módulo 1 · Fundamentos da Linguagem · Artigo 5 de 6
Introdução
Computadores são excepcionalmente bons em repetir tarefas — muito melhor do que humanos. Os laços de repetição são o mecanismo que permite instruir um programa a executar um bloco de código múltiplas vezes, seja um número fixo de vezes ou enquanto uma condição for verdadeira. Python oferece dois laços principais: for e while.
O Laço for
O for em Python é diferente do for clássico de C ou Java. Em vez de controlar um contador manualmente, ele itera sobre uma sequência — percorrendo cada item de uma coleção:
frutas = ["maçã", "banana", "laranja"]
for fruta in frutas:
print(fruta)
# maçã
# banana
# laranja
A variável fruta assume o valor de cada item a cada iteração. O nome é escolhido por você — o importante é que seja descritivo.
A Função range()
Para repetir um bloco um número específico de vezes, usa-se range():
# range(stop) — de 0 até stop-1
for i in range(5):
print(i)
# 0, 1, 2, 3, 4
# range(start, stop)
for i in range(1, 6):
print(i)
# 1, 2, 3, 4, 5
# range(start, stop, step)
for i in range(0, 20, 5):
print(i)
# 0, 5, 10, 15
# Contagem regressiva
for i in range(10, 0, -1):
print(i)
# 10, 9, 8, ..., 1
range() não cria uma lista na memória — ela gera os valores sob demanda, o que a torna eficiente mesmo para intervalos grandes.
Iterando com Índice: enumerate()
Quando você precisa do índice e do valor ao mesmo tempo:
linguagens = ["Python", "JavaScript", "Go", "Rust"]
for indice, linguagem in enumerate(linguagens):
print(f"{indice + 1}. {linguagem}")
# 1. Python
# 2. JavaScript
# 3. Go
# 4. Rust
Evite o padrão for i in range(len(lista)) — ele funciona, mas é considerado não-pythônico. Prefira enumerate().
Iterando sobre Strings
Strings são sequências de caracteres e podem ser percorridas diretamente:
palavra = "Python"
for letra in palavra:
print(letra)
# P, y, t, h, o, n
O Laço while
O while repete um bloco enquanto uma condição for verdadeira. É ideal quando não se sabe antecipadamente quantas iterações serão necessárias:
tentativas = 0
senha_correta = "python123"
while tentativas < 3:
senha = input("Digite a senha: ")
if senha == senha_correta:
print("Acesso concedido!")
break
tentativas += 1
print(f"Senha incorreta. Tentativas restantes: {3 - tentativas}")
if tentativas == 3:
print("Conta bloqueada.")
break e continue
Dois comandos controlam o fluxo dentro de um laço:
break — encerra o laço imediatamente:
numeros = [3, 7, 2, 9, 4, 1, 8]
for numero in numeros:
if numero == 9:
print(f"Número 9 encontrado!")
break
print(numero)
# 3, 7, 2 — para ao encontrar 9
continue — pula para a próxima iteração, ignorando o restante do bloco:
for i in range(10):
if i % 2 == 0:
continue # pula os pares
print(i)
# 1, 3, 5, 7, 9
A Cláusula else em Laços
Python permite um else ao final de laços — um recurso pouco conhecido mas útil. O bloco else é executado quando o laço termina normalmente, sem ser interrompido por break:
numeros = [2, 4, 6, 8]
for numero in numeros:
if numero % 2 != 0:
print("Número ímpar encontrado!")
break
else:
print("Todos os números são pares.")
# Todos os números são pares.
Isso é especialmente útil em buscas — se o item não for encontrado, o else executa:
alunos = ["Ana", "Bruno", "Carla"]
busca = "Diego"
for aluno in alunos:
if aluno == busca:
print(f"{busca} encontrado!")
break
else:
print(f"{busca} não está na lista.")
Laços Aninhados
É possível colocar um laço dentro de outro. Um uso clássico é percorrer estruturas bidimensionais:
# Tabuada
for i in range(1, 4):
for j in range(1, 4):
print(f"{i} x {j} = {i * j}")
print("---")
# 1 x 1 = 1
# 1 x 2 = 2
# 1 x 3 = 3
# ---
# 2 x 1 = 2
# ...
Cuidado com laços aninhados profundos — o custo computacional cresce exponencialmente e a legibilidade cai.
Exemplo Completo: Jogo de Adivinhação
import random
numero_secreto = random.randint(1, 100)
tentativas = 0
max_tentativas = 7
print("Adivinhe o número entre 1 e 100!")
while tentativas < max_tentativas:
tentativas += 1
chute = int(input(f"Tentativa {tentativas}/{max_tentativas}: "))
if chute == numero_secreto:
print(f"Parabéns! Você acertou em {tentativas} tentativa(s)!")
break
elif chute < numero_secreto:
print("Muito baixo!")
else:
print("Muito alto!")
else:
print(f"Fim de jogo! O número era {numero_secreto}.")
Resumo
foritera sobre sequências — listas, strings, ranges e outras coleçõesrange(start, stop, step)gera sequências numéricas eficientementeenumerate()fornece índice e valor simultaneamentewhilerepete enquanto uma condição for verdadeirabreakencerra o laço;continuepula para a próxima iteração- O
elseem laços executa quando não hábreak - Prefira
forquando o número de iterações é conhecido;whilequando depende de uma condição
Referências e Leituras Complementares
- Laços e iteração — documentação oficial — https://docs.python.org/3/tutorial/controlflow.html#for-statements
- Função range() — https://docs.python.org/3/library/stdtypes.html#range
- Função enumerate() — https://docs.python.org/3/library/functions.html#enumerate
- Módulo random — https://docs.python.org/3/library/random.html
- MATTHES, Eric. Python Crash Course. 3. ed. No Starch Press, 2023. Cap. 4.
- LUTZ, Mark. Learning Python. 5. ed. O'Reilly Media, 2013. Cap. 13.
- RAMALHO, Luciano. Fluent Python. 2. ed. O'Reilly Media, 2022. Cap. 17.
Prof. Ricardo Matos — Dominando o Python em 1 Ano · Artigo 05 de 52 Próximo: Artigo 06 — Funções: definição, parâmetros e escopo
you asked
Sim