Capítulo 15, Básico
Laços com for
O `for` percorre qualquer coleção. Quase sempre que você pensa em contar índices, existe uma forma melhor de escrever.
Código deste capítulo: basico/cap15_laco_for.py
for em qualquer iterável
O for do Python não conta: ele percorre os itens de qualquer objeto iterável (string, lista, arquivo, dicionário):
for letra in "abc":
print(letra)
for fruta in ["maçã", "pera"]:
print(fruta)
a
b
c
maçã
pera
range
Quando você precisa de uma sequência de números, use range. Ele aceita range(fim), range(inicio, fim) e range(inicio, fim, passo), e o fim nunca é incluído. Ele é preguiçoso: não cria a lista na memória. O list() abaixo serve só para mostrar o conteúdo:
print(list(range(5)))
print(list(range(1, 6)))
print(list(range(0, 10, 2)))
print(list(range(5, 0, -1)))
[0, 1, 2, 3, 4]
[1, 2, 3, 4, 5]
[0, 2, 4, 6, 8]
[5, 4, 3, 2, 1]
enumerate e zip
Não escreva for i in range(len(lista)) para obter a posição. O enumerate entrega posição e item juntos. O zip percorre duas sequências em paralelo:
nomes = ["Ana", "Bia", "Caio"]
for posicao, nome in enumerate(nomes, start=1):
print(posicao, nome)
notas = [9, 8, 7]
for nome, nota in zip(nomes, notas):
print(f"{nome}: {nota}")
1 Ana
2 Bia
3 Caio
Ana: 9
Bia: 8
Caio: 7
break, continue e else
O break encerra o laço. O continue pula para a próxima volta. O else do laço é pouco conhecido e muito útil: ele roda somente se o laço terminou sem break.
for numero in range(1, 11):
if numero == 3:
continue
if numero == 6:
break
print(numero)
else:
print("terminou sem break")
1
2
4
5
O else do laço brilha em buscas. Para saber se um número é primo, procure um divisor. Se achar, break. Se o laço acabar sem achar, o else confirma:
numero = 17
for divisor in range(2, numero):
if numero % divisor == 0:
print(f"{numero} não é primo")
break
else:
print(f"{numero} é primo")
17 é primo
Laços aninhados e padrões
Um laço dentro de outro executa o interno por completo a cada volta do externo. É a base de tabelas, matrizes e padrões desenhados com texto:
for linhas in range(1, 5):
print("*" * linhas)
*
**
***
****
for i in range(1, 4):
for j in range(1, 4):
print(f"{i} x {j} = {i * j}", end=" ")
print()
1 x 1 = 1 1 x 2 = 2 1 x 3 = 3
2 x 1 = 2 2 x 2 = 4 2 x 3 = 6
3 x 1 = 3 3 x 2 = 6 3 x 3 = 9
A multiplicação de uma string por um inteiro ("*" * 3) repete o texto, e é o truque que evita um segundo laço em muitos desenhos.
Exercício 1
Fatorial
Escreva fatorial(n) com um laço for. O fatorial de 0 é 1.
Exercício 2
Losango de asteriscos
Escreva diamante(n) que devolva uma lista de linhas. Para n = 3, o resultado deve ser [" *", " ***", "*****", " ***", " *"].
Exercício 3
Primos até n
Escreva primos_ate(n) com um laço dentro de outro e o else do for.