2.12. Ciclos¶
Um ciclo executa o mesmo bloco de código repetidamente. O Python tem duas formas: while, que continua enquanto uma condição se mantiver verdadeira, e for, que percorre os itens de uma sequência.
while continua a testar uma condição; for percorre uma sequência até a esgotar.¶
2.12.1. Ciclos while¶
Um ciclo while testa a sua condição antes de cada iteração e executa o corpo até o teste se tornar falso:
count = 0
while count < 5:
print(count)
count += 1
Saída:
0
1
2
3
4
Se a condição for verdadeira no início e nunca se tornar falsa, o ciclo executa indefinidamente. while True: é o idioma padrão para um ciclo principal, terminado explicitamente com break:
while True:
step()
if done():
break
2.12.2. Ciclos for¶
Um ciclo for percorre os itens de um iterável – uma lista, tuplo, string, bytes, dict, ou qualquer outra coisa que suporte iteração:
for fruit in ["apple", "banana", "cherry"]:
print(fruit)
Saída:
apple
banana
cherry
A mesma forma funciona numa string, onde cada item é uma string de um único carácter:
for letter in "OpenMV":
print(letter)
Saída:
O
p
e
n
M
V
Iterar diretamente um dict produz as suas chaves, por ordem de inserção:
for key in {"a": 1, "b": 2}:
print(key)
Saída:
a
b
Cada passagem vincula a variável do ciclo (fruit, letter, key) ao próximo item. Após o fim do ciclo, a variável mantém o valor da última iteração.
2.12.3. range¶
Para ciclos sobre um intervalo numérico, use range():
range(stop)– 0, 1, …, stop - 1.range(start, stop)– start, start + 1, …, stop - 1.range(start, stop, step)– com um passo personalizado (valores negativos contam decrescentemente).
for i in range(5): # 0, 1, 2, 3, 4
print(i)
for i in range(2, 8, 2): # 2, 4, 6
print(i)
for i in range(10, 0, -1): # 10, 9, ..., 1
print(i)
range() produz valores de forma lazy – não constrói uma lista em memória. Para obter uma list efetiva, encapsule-a: list(range(10)).
2.12.4. enumerate¶
Quando o ciclo precisa tanto do índice como do item, enumerate() produz pares (index, item):
for i, name in enumerate(["a", "b", "c"]):
print(i, name)
# 0 a
# 1 b
# 2 c
Inicie o índice com um valor diferente de zero passando um segundo argumento: enumerate(items, start=1).
2.12.5. zip¶
Para percorrer dois (ou mais) iteráveis em simultâneo, use zip(). Produz um tuplo por posição e para no input mais curto:
names = ["alice", "bob", "carol"]
scores = [88, 92, 70]
for name, score in zip(names, scores):
print(name, score)
Saída:
alice 88
bob 92
carol 70
2.12.6. Atribuição inline com :=¶
O operador walrus := é uma atribuição que também é uma expressão. Vincula um nome e avalia para o mesmo valor ao mesmo tempo. Num ciclo while, isso colapsa o padrão comum «ler, verificar, corpo» numa única linha:
# without walrus
value = next_value()
while value is not None:
process(value)
value = next_value()
# with walrus
while (value := next_value()) is not None:
process(value)
As duas formas fazem a mesma coisa. Recorra a := quando a duplicação da atribuição prejudica genuinamente a legibilidade; não o use só para ser engenhoso. Os parênteses são obrigatórios na maioria das posições para manter a expressão sem ambiguidade.