Pular para o conteúdo

    Capítulo 16, Básico

    Laços com while

    Use `for` quando você sabe o que vai percorrer e `while` quando você só sabe a condição de parada.

    Código deste capítulo: basico/cap16_laco_while.py

    while

    O while repete enquanto a condição for verdadeira. A condição precisa, em algum momento, virar falsa, caso contrário o programa nunca termina:

    basico/cap16_laco_while.pylinhas 10 a 14
    contagem = 3
    while contagem > 0:
        print(contagem)
        contagem -= 1
    print("Fogo!")
    
    Saída
    3
    2
    1
    Fogo!
    

    Laço infinito

    Se você esquecer de atualizar a variável da condição, o programa fica preso para sempre. No terminal, Ctrl+C interrompe. Antes de rodar um while, pergunte: o que muda a cada volta e faz a condição virar falsa?

    while True com break

    Quando você não sabe quantas vezes vai repetir, o padrão while True com um break na saída é o mais claro. Ele é o jeito certo de validar entrada:

    basico/cap16_laco_while.pylinhas 19 a 24
    while True:
        texto = input("Digite um número positivo: ")
        if texto.isdigit() and int(texto) > 0:
            break
        print("Valor inválido, tente de novo.")
    print(f"Você digitou {int(texto)}")
    
    Saída
    Digite um número positivo: abc
    Valor inválido, tente de novo.
    Digite um número positivo: -3
    Valor inválido, tente de novo.
    Digite um número positivo: 42
    Você digitou 42
    

    Dígitos de um número

    A combinação de while com divmod(n, 10) extrai um dígito por vez, do último para o primeiro. É a base de somar dígitos, inverter números e testar palíndromos numéricos:

    basico/cap16_laco_while.pylinhas 29 a 32
    numero = 1234
    while numero > 0:
        numero, digito = divmod(numero, 10)
        print(digito)
    
    Saída
    4
    3
    2
    1
    
    basico/cap16_laco_while.pylinhas 34 a 39
    original = 12345
    invertido = 0
    while original > 0:
        original, digito = divmod(original, 10)
        invertido = invertido * 10 + digito
    print(invertido)
    
    Saída
    54321
    

    Um jogo de adivinhação

    O módulo random sorteia números. O randint(1, 100) inclui os dois extremos:

    basico/cap16_laco_while.pylinhas 44 a 46
    import random
    
    print(random.randint(1, 100) in range(1, 101))
    
    Saída
    True
    

    No jogo abaixo eu fixei o segredo em 63 para a saída ser previsível. Troque por random.randint(1, 100) para jogar de verdade:

    basico/cap16_laco_while.pylinhas 48 a 59
    segredo = 63
    tentativas = 0
    while True:
        palpite = int(input("Seu palpite: "))
        tentativas += 1
        if palpite < segredo:
            print("Muito baixo")
        elif palpite > segredo:
            print("Muito alto")
        else:
            print(f"Acertou em {tentativas} tentativas")
            break
    
    Saída
    Seu palpite: 50
    Muito baixo
    Seu palpite: 75
    Muito alto
    Seu palpite: 63
    Acertou em 3 tentativas
    

    Exercício 1

    Soma dos dígitos

    Escreva soma_digitos(n) com while. Para 1234 o resultado é 10.

    Exercício 2

    Conjectura de Collatz

    Parta de n. Se for par, divida por 2. Se for ímpar, multiplique por 3 e some 1. Conte quantos passos levam até 1. Escreva collatz(n).