Pular para o conteúdo

    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):

    basico/cap15_laco_for.pylinhas 10 a 14
    for letra in "abc":
        print(letra)
    
    for fruta in ["maçã", "pera"]:
        print(fruta)
    
    Saída
    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:

    basico/cap15_laco_for.pylinhas 19 a 22
    print(list(range(5)))
    print(list(range(1, 6)))
    print(list(range(0, 10, 2)))
    print(list(range(5, 0, -1)))
    
    Saída
    [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:

    basico/cap15_laco_for.pylinhas 27 a 33
    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}")
    
    Saída
    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.

    basico/cap15_laco_for.pylinhas 38 a 45
    for numero in range(1, 11):
        if numero == 3:
            continue
        if numero == 6:
            break
        print(numero)
    else:
        print("terminou sem break")
    
    Saída
    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:

    basico/cap15_laco_for.pylinhas 47 a 53
    numero = 17
    for divisor in range(2, numero):
        if numero % divisor == 0:
            print(f"{numero} não é primo")
            break
    else:
        print(f"{numero} é primo")
    
    Saída
    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:

    basico/cap15_laco_for.pylinhas 58 a 59
    for linhas in range(1, 5):
        print("*" * linhas)
    
    Saída
    *
    **
    ***
    ****
    
    basico/cap15_laco_for.pylinhas 61 a 64
    for i in range(1, 4):
        for j in range(1, 4):
            print(f"{i} x {j} = {i * j}", end="  ")
        print()
    
    Saída
    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.