Помогите исправить код Python
Вот сама задача Год делится на четыре сезона: зима, весна, лето и осень. Хотя даты смены сезонов каждый год могут меняться из-за особенностей календаря, мы в данном упражнении примем допущения, перечисленные в табл. 2.9.
Таблица 2.9. Даты смены сезонов
Сезон Первый день
Весна 20 марта
Лето 21 июня
Осень 22 сентября
Зима 21 декабря
Разработайте программу, запрашивающую у пользователя день и месяц – сначала месяц в текстовом варианте, затем номер дня. На выходе программа должна выдать название сезона, которому принадлежит выбранная дата.
mon=input('Введите мясяц с большой буквы')
if mon=='Январь':
mon=1
elif mon=='Февраль':
mon=2
elif mon=='Март':
mon=3
elif mon=='Апрель':
mon=4
elif mon=='Май':
mon=5
elif mon=='Июнь':
mon=6
elif mon=='Июль':
mon=7
elif mon=='Август':
mon=8
elif mon=='Сентябрь':
mon=9
elif mon=='Октябрь':
mon=10
elif mon=='Ноябрь':
mon=11
elif mon=='Декабрь':
mon=12
day=int(input('Введите номерь дня'))
if mon>=3 and day>=20:
print('Весна')
elif mon==4:
print('Весна')
elif mon==5:
print('Весна')
elif mon==6 and day<=20:
print('весна')
elif mon>=6 and day>=21:
print('Лето')
elif mon==7:
print('Лето')
elif mon==8:
print('Лето')
elif mon==9 and day<=21:
print('Лето')
elif mon>=9 and day>=22:
print('Осень')
elif mon==10:
print('Осень')
elif mon==11:
print('Осень')
elif mon==12 and day<=20:
print('Осень')
elif mon==12 and day>=21:
print('Зима')
elif mon==1:
print('Зима')
elif mon==2:
print('Зима')
elif mon==3 and day<=19:
print('Зима')
Ответы (3 шт):
months = {
'Январь': 1,
'Февраль': 2,
'Март': 3,
'Апрель': 4,
'Май': 5,
'Июнь': 6,
'Июль': 7,
'Август': 8,
'Сентябрь': 9,
'Октябрь': 10,
'Ноябрь': 11,
'Декабрь': 12
}
mon = input('Введите месяц с большой буквы: ')
mon_num = months[mon]
day = int(input('Введите номер дня: '))
if mon_num in [12, 1, 2] or (mon_num == 3 and day < 20):
season = 'Зима'
elif mon_num in [3, 4, 5] or (mon_num == 6 and day <= 20):
season = 'Весна'
elif mon_num in [6, 7, 8] or (mon_num == 9 and day <= 22):
season = 'Лето'
else:
season = 'Осень'
print('Сезон:', season)
Оптимизировал код.
if mon>=3 and day>=20:
print('Весна')
...
elif mon>=6 and day>=21: # никогда не сработает!
print('Лето')
...
elif mon>=9 and day>=22: # никогда не сработает!
print('Осень')
...
elif mon==12 and day>=21: # никогда не сработает!
print('Зима')
Основная проблема с таким кодом в том, что в случаях, когда должны сработать второй, третий или четвёртый if, они никогда не сработают, потому что при этих условиях сработает первый if и до них очередь просто не дойдёт. Эту проблему можно решить либо проверяя в каждом if оба конца интервала, а не только нижнюю границу. Либо переставить проверки так, чтобы месяца проверялись сначала старшие, а потом уже младшие.
С проверками, где day<=, примерно всё тоже самое.
x = int(input("Введите дату: "))
y = str(input("Введите месяц: "))
y = y.lower()
m = {"январь": 31,
"февраль": 28,
"март": 31,
"апрель": 30,
"май": 30,
"июнь": 30,
"июль": 31,
"август": 31,
"сентябрь": 30,
"октябрь": 30,
"ноябрь": 30,
"декабрь": 31}
vesna = [20, "март"]
leto = [21, "июнь"]
osen = [22, "сентябрь"]
zima = [21, "декабрь"]
#--------------------------------------------------------------------------
def raschet(x, y):
a = 0
for key in m:
# print(x)
a = a + m[key] # Кол-во дней с начала года
b = a - m[key] + x # Кол-во дней с начала года + x
if y == key:
return a, key, b, m[key]
#-------------------------------------------------------------------------
if y in m:
vesna_b = raschet(vesna[0], vesna[1])
leto_b = raschet(leto[0], leto[1])
osen_b = raschet(osen[0], osen[1])
zima_b = raschet(zima[0], zima[1])
rez_b = raschet(x, y)
if x <= rez_b[3]:
if vesna_b[2] <= rez_b[2] and leto_b[2] > rez_b[2]:
print("Весна")
if leto_b[2] <= rez_b[2] and osen_b[2] > rez_b[2]:
print("Лето")
if osen_b[2] <= rez_b[2] and zima_b[2] > rez_b[2]:
print("Осень")
if vesna_b[2] > rez_b[2] and zima_b[2] > rez_b[2]:
print("Зима")
else:
print("Неправильно введена дата!")
else:
print("Неправильно введен месяц!")