Oi Caio, Tudo bem?
Essa parte do código realmente costuma gerar dúvida, principalmente porque a regra de ano bissexto não é tão intuitiva à primeira vista. Vou explicar a lógica usada no gabarito de forma mais direta.
Analisando o código:
if ano % 4 == 0 and (ano % 400 == 0 or ano % 100 != 0):
dias_fevereiro = 29
else:
dias_fevereiro = 28
Para um ano ser bissexto, ele precisa passar por um "filtro" de três regras:
Regra Básica: Deve ser divisível por 4.
A Exceção: Se for divisível por 100, ele não é bissexto...
A Exceção da Exceção: ...a menos que ele também seja divisível por 400.
Agora vamos interpretar a condição.
ano % 4 == 0
Verifica se o ano é divisível por 4. O operador % retorna o resto da divisão. Se o resto é 0, significa que o número é divisível.
Depois vem:
(ano % 400 == 0 or ano % 100 != 0)
Aqui temos duas possibilidades:
- O ano é divisível por 400
ou - O ano não é divisível por 100
E tudo isso está ligado ao primeiro teste com and, ou seja, todas essas regras precisam ser respeitadas ao mesmo tempo.
Alguns exemplos ajudam bastante:
2024
- Divisível por 4 ✔️
- Não divisível por 100 ✔️
→ Bissexto
1900
- Divisível por 4 ✔️
- Divisível por 100 ✔️
- Não divisível por 400 ❌
→ Não é bissexto
2000
- Divisível por 4 ✔️
- Divisível por 100 ✔️
- Divisível por 400 ✔️
→ Bissexto
Ou seja, o código está apenas transformando a regra matemática em uma expressão lógica com and e or.
Se te ajudar a visualizar melhor, essa mesma lógica poderia ser escrita separando as condições:
div4 = ano % 4 == 0
div100 = ano % 100 == 0
div400 = ano % 400 == 0
if div4 and (div400 or not div100):
dias_fevereiro = 29
else:
dias_fevereiro = 28
Fica exatamente igual em funcionamento, apenas coloquei em partes separadas para ajudar na compreensão.
Espero ter ajudado.
Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!