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

  • for itera sobre sequências — listas, strings, ranges e outras coleções
  • range(start, stop, step) gera sequências numéricas eficientemente
  • enumerate() fornece índice e valor simultaneamente
  • while repete enquanto uma condição for verdadeira
  • break encerra o laço; continue pula para a próxima iteração
  • O else em laços executa quando não há break
  • Prefira for quando o número de iterações é conhecido; while quando depende de uma condição

Referências e Leituras Complementares


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


claude response