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!