Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Contagem Regressiva

segundos = 10

for i in range(segundos):
    if segundos % 2 == 0:
        print(f"Faltam apenas {segundos} segundos - Não perca essa oportunidade!")
    else:
        if segundos == 1:
            print(f"A contagem continua: {segundos} segundo restante.")
        else:
            print(f"A contagem continua: {segundos} segundos restantes.")
    segundos -= 1

print("Aproveite a promoção agora!")
1 resposta

Olá, Paulo. Como vai?

O seu código para o desafio da contagem regressiva ficou muito bom! A ideia de personalizar as mensagens de acordo com o tempo (separando números pares para mensagens de urgência e tratando o plural/singular para quando resta apenas 1 segundo) foi uma excelente sacada de lógica e experiência do usuário.

Embora o programa funcione e entregue o resultado esperado, há um detalhe sutil na estrutura do seu laço que vale a pena analisarmos do ponto de vista de engenharia de software. Vamos dar uma olhada na anatomia do seu código:

O comportamento oculto entre o for e a variável segundos

No seu código, você utilizou a estrutura for i in range(segundos):. Em Python, a função range(10) cria uma sequência interna fixa de 10 passos (do 0 ao 9).

O que acontece aqui é que, dentro do laço, você está decrementando manualmente a variável segundos (segundos -= 1). O programa roda perfeitamente porque o range dita quantas vezes o bloco vai se repetir, enquanto a sua variável controla o que é exibido.

No entanto, misturar o controle manual de uma variável externa dentro de um laço for pode confundir outros programadores que forem ler o seu código no futuro. A boa prática do Python prega que:

  • Se você quer que o próprio laço controle a contagem decrescente de forma automática, usamos os parâmetros do range().
  • Se você prefere diminuir a variável manualmente passo a passo, a estrutura ideal é o laço while.

Veja como o seu código pode ser reescrito de forma mais limpa utilizando essas duas abordagens nativas:

Abordagem 1: O "Jeito Pythônico" com for e range decrescente

A função range(start, stop, step) pode contar de trás para frente se passarmos um passo negativo (-1). Dessa forma, o próprio Python cuida do decremento e nós eliminamos a linha segundos -= 1:

# Contar de 10 até 1 (o stop é exclusivo, por isso usamos 0 para parar no 1)
for segundos in range(10, 0, -1):
    if segundos % 2 == 0:
        print(f"Faltam apenas {segundos} segundos - Não perca essa oportunidade!")
    else:
        if segundos == 1:
            print(f"A contagem continua: {segundos} segundo restante.")
        else:
            print(f"A contagem continua: {segundos} segundos restantes.")

print("Aproveite a promoção agora!")

Abordagem 2: Utilizando o laço while

Se a sua intenção original era manter o controle manual diminuindo o valor a cada rodada, o while é a estrutura perfeita, pois ele repete o bloco enquanto a condição for verdadeira:

segundos = 10

while segundos > 0:
    if segundos % 2 == 0:
        print(f"Faltam apenas {segundos} segundos - Não perca essa oportunidade!")
    else:
        if segundos == 1:
            print(f"A contagem continua: {segundos} segundo restante.")
        else:
            print(f"A contagem continua: {segundos} segundos restantes.")
    
    segundos -= 1  # No while, o decremento manual é obrigatório para evitar loop infinito

print("Aproveite a promoção agora!")

Ambas as alterações tornam o seu código mais alinhado com as convenções de mercado, facilitando a legibilidade e a manutenção do software. Parabéns pela criatividade nas mensagens do desafio!

Espero que possa ter lhe ajudado!