Pular para o conteúdo

Controle de Fluxo

Um programa que só executa linha por linha, de cima para baixo, sem nunca desviar ou repetir, não resolve muita coisa. As ferramentas de controle de fluxo são o que permite um programa decidir e repetir.

A estrutura if/elif/else testa condições em sequência e executa o primeiro bloco cuja condição for verdadeira:

nota = 7.5
if nota >= 9:
print("Excelente")
elif nota >= 7:
print("Bom")
elif nota >= 5:
print("Regular")
else:
print("Insuficiente")

O elif é opcional e pode se repetir quantas vezes for preciso; o else final também é opcional. Condicionais podem ser aninhadas, mas quando a indentação cresce demais (3, 4 níveis), geralmente é sinal de que vale a pena extrair uma função:

if usuario.esta_logado:
if usuario.eh_admin:
print("Painel de administração")
else:
print("Painel comum")

Toda expressão em um if é avaliada como verdadeira ou falsa, mesmo quando não é um bool literal. Os seguintes valores são falsy (se comportam como False):

0, 0.0, "", [], {}, set(), None, False

Qualquer outro valor é truthy. Isso permite escrever condições mais diretas:

nomes = []
# em vez de:
if len(nomes) == 0:
print("lista vazia")
# o idiomático em Python:
if not nomes:
print("lista vazia")

Para escolher entre dois valores em uma linha, sem precisar de um if completo:

idade = 20
status = "adulto" if idade >= 18 else "menor"

Use só quando a condição for simples - encadear vários ternários numa linha só deixa o código difícil de ler.

Desde o Python 3.10, existe o structural pattern matching, uma forma de comparar um valor contra vários padrões sem empilhar if/elif:

def descreve_status(codigo: int) -> str:
match codigo:
case 200:
return "OK"
case 404:
return "Não encontrado"
case 401 | 403:
return "Acesso negado"
case _ if codigo >= 500:
return "Erro no servidor"
case _:
return "Status desconhecido"

O _ funciona como “qualquer outro caso” (equivalente ao else). match também sabe desestruturar tuplas e objetos, o que vai além do que um switch de outras linguagens faz:

ponto = (0, 5)
match ponto:
case (0, 0):
print("origem")
case (0, y):
print(f"no eixo y, em {y}")
case (x, 0):
print(f"no eixo x, em {x}")
case (x, y):
print(f"em ({x}, {y})")

Para a maioria dos casos simples, uma cadeia de if/elif continua perfeitamente válida - match brilha quando você precisa comparar a forma do dado, não só valores soltos.

O for em Python itera sobre qualquer sequência (lista, string, range, etc.), sem precisar controlar um índice manualmente:

frutas = ["maçã", "banana", "uva"]
for fruta in frutas:
print(fruta)

Quando você precisa de uma contagem de 0 até N, range() gera essa sequência sob demanda, sem criar uma lista na memória:

for i in range(5): # 0, 1, 2, 3, 4
print(i)
for i in range(2, 10, 2): # 2, 4, 6, 8 (start, stop, step)
print(i)

Se, além do valor, você também precisa do índice, enumerate() evita ter que criar e incrementar um contador à mão:

for indice, fruta in enumerate(frutas):
print(f"{indice}: {fruta}")
# 0: maçã
# 1: banana
# 2: uva

E para percorrer duas (ou mais) sequências ao mesmo tempo, posição a posição, zip() combina os itens em pares:

nomes = ["Ana", "Bruno"]
idades = [25, 30]
for nome, idade in zip(nomes, idades):
print(f"{nome} tem {idade} anos")

Use while quando não se sabe de antemão quantas repetições serão necessárias - a condição é testada antes de cada repetição:

tentativas = 0
senha_correta = False
while not senha_correta and tentativas < 3:
senha = input("Digite a senha: ")
senha_correta = senha == "1234"
tentativas += 1

Um while True cria um laço infinito proposital, controlado por um break dentro do bloco - padrão comum em menus de terminal e servidores que ficam escutando eventos:

while True:
comando = input("> ")
if comando == "sair":
break
print(f"Executando: {comando}")
  • break interrompe o laço imediatamente, mesmo que a condição continue verdadeira
  • continue pula o resto da iteração atual e vai direto para a próxima
  • pass não faz nada - serve como placeholder onde a sintaxe exige um bloco, mas ainda não há código para escrever
for numero in range(10):
if numero == 5:
break # para o laço no 5
if numero % 2 == 0:
continue # pula os pares
print(numero) # imprime 1, 3

Um detalhe pouco conhecido mesmo entre quem já programa em Python: for e while aceitam um else, que executa quando o laço termina sem ter sido interrompido por break. É útil para padrões de busca:

numeros = [1, 3, 5, 7, 9]
for n in numeros:
if n % 2 == 0:
print("Achei um par")
break
else:
print("Nenhum número par na lista")

Se o laço rodar até o fim sem encontrar nada, o else dispara - pense nele como “se o laço não encontrou motivo para sair antes do tempo”.