Форум сайта python.su
Написать функцию date, принимающую 3 аргумента — день, месяц и год. Вернуть True, если такая дата есть в нашем календаре, и False иначе.
—PROGRAM–
#ввод данных пользвателся
users_day = int(input('Введите день :'))
users_month = int(input('Введите месяц :'))
users_year = int(input('Введите год :'))
user_date = {users_day:users_month}
print (date(users_day,users_month,users_year))
def date (day,month,year):
#создаем месяца с количеством дней {m,d}
month_day = { 1:31 , 2:28 , 3:31 , 4:30 , 5:31 ,
6:30 , 7:31 , 8:31 , 9:30 , 10:31,
11:30 , 12:31
}
real_year = (range(2020))
#меняем значения февраля, если он високосный
if year % 4 == 0:
month_day = 29
if year % 4 == 0 and year % 100 == 0:
month_day = 28
if year % 4 == 0 and year % 100 == 0 and year % 400 == 0:
month_day = 29
if user_date in month_day:
print(“Верная дата”)
else:
print(“не верная дата”)
Прикреплённый файлы:
Screenshot_1.png (93,6 KБ)
Офлайн
print (date(users_day,users_month,users_year)) def date (day,month,year):
if year % 4 == 0 and year % 100 == 0:
if user_date in month_day:
Отредактировано Egorro13 (Апрель 27, 2019 23:25:39)
Офлайн
Офлайн
import datetime d=int(input("Введите день"))# предположим - 29 m=int(input("Введите месяц"))# предположим - 2 y=int(input("Введите год"))# предположим - 2020 try: data=datetime.date(y,m,d) print(data) print("Дата существующая") except: print("Такой даты нет")
Офлайн
panama555Такой пустяк, да и через обработчик исключений?
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Офлайн
А что не так?
Офлайн
panama555Все так, просто такая конструкция крайне ненадежна. Исключение надо указывать точное, а вдруг юзер ctrl+c юзнет, ему “Такой даты нет вернет”. А если RuntimeError, MemoryError, OSError. Лучше тогда уж узнать, какое исключение может выбросить date() и его в except поставить
А что не так?
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Офлайн
Для того, чтобы “юзер не юзанул ctrl+c” нужно предусмотреть проверку в месте ввода данных.
Без этого никак.
А насчёт “такая конструкция крайне ненадежна” - вы о чём???
Этот вариант работает и будет работать без проблем.
Если в этот момент компьютер зависнет по какой-либо причине, то при чём тут “надёжность конструкции”???
Офлайн
Мне среди прочих попалась задача, которую вы тут уже разбирали.
Решение panama555 с использованием модуля datetime очень хорошее и короткое, но на собеседованиях часто просят решать без импорта модулей, а самостоятельно писать, поэтому снова поднимаю этот топик.
Моя программа работает и работает верно, но выглядит громоздкой и много ветвлений.
Подскажите, можно ли как-то упростить и улучшить ее читаемость? Можно ли как-то избегать такого количества if / else в коде?
Я еще не умею определять вычислительную сложность того или иного решения. Правильно ли, что я выделила проверку високосности года в отдельную функцию или это избыточно и надо было все делать в рамках основной функции?
Вроде так читаемость кода немного повышается, а так же в реальных условиях будет проще повторно использовать код с проверкой високосности года при необходимости, но я не знаю , сделает ли это программу плохой с точки зрения производительности.
Буду признательна за любые указания на мои ошибки и плохой codestyle
# Написать функцию date , принимающую 3 аргумента — день, месяц и год. # Вернуть True, если такая дата есть в нашем календаре, и False иначе. def is_year_leap(year): """ Принимает аргумент: порядковый номер года Возвращает значение: если високосный год - True, иначе - False """ if year % 4 != 0: return False elif year % 100 == 0: if year % 400 == 0: return True else: return False else: return True def date(day, month, year): """ Принимает аргументы: день, месяц, год Возвращает значение: если дата правильная - True, иначе - False """ # Задаем количество дней в месяцах невисокосного года set_months = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31} # Проверяем заданы ли верно год и месяц if year > 0 and (month >= 1 and month <= 12): # Изменяем количество дней для февраля в високосных годах if month == 2 and is_year_leap(year) == True: set_months[2] = 29 # Проверяем задан ли верно день if day in range(1, set_months[month]+1): return True else: return False else: return False # Тест кейсы print(date(31, 12, 2020)) # Правильная дата print(date(1, 0, 2000)) # Месяц вне диапазона print(date(1, 1, 0)) # Год вне диапазона print(date(29, 2, 2000)) # 29 февраля високосный год print(date(29, 2, 1900)) # 29 февраля невисокосный год
Отредактировано Ocean (Март 14, 2021 06:31:02)
Офлайн
гляньте как это там ->
import datetime import calendar datetime.__file__ calendar.__file__
Офлайн