Найти - Пользователи
Полная версия: Пытаюсь решить эту задачу:
Начало » Python для новичков » Пытаюсь решить эту задачу:
1 2 3
bynikk
Написать функцию 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(“не верная дата”)
Egorro13
 print (date(users_day,users_month,users_year))
def date (day,month,year):
Как я понимаю, в Питоне нельзя вызывать еще не объявленные методы - язык интерпретируемый, а не компилируемый, порядок выполнения строк очень важен.

  if year % 4 == 0 and year % 100 == 0:
Не влияет на работоспособность, но какой смысл проверять 2 раза одно и то же: если число делится на 100, может ли оно не делиться на 4?

  if user_date in month_day:
Насколько знаю, in ищет вхождение среди ключей словаря, а не “входит ли один словарь в другой”. Тут правильнее проверять именно наличие ключа и соответствие значения по этому ключу.
py.user.next
Проверка на високосность года
Пример
Пример
panama555
 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("Такой даты нет")

если использовать модуль datetime, то решение простое
DamMercul
panama555
Такой пустяк, да и через обработчик исключений?
panama555
А что не так?
DamMercul
panama555
А что не так?
Все так, просто такая конструкция крайне ненадежна. Исключение надо указывать точное, а вдруг юзер ctrl+c юзнет, ему “Такой даты нет вернет”. А если RuntimeError, MemoryError, OSError. Лучше тогда уж узнать, какое исключение может выбросить date() и его в except поставить
panama555
Для того, чтобы “юзер не юзанул ctrl+c” нужно предусмотреть проверку в месте ввода данных.
Без этого никак.
А насчёт “такая конструкция крайне ненадежна” - вы о чём???
Этот вариант работает и будет работать без проблем.
Если в этот момент компьютер зависнет по какой-либо причине, то при чём тут “надёжность конструкции”???
Ocean
Мне среди прочих попалась задача, которую вы тут уже разбирали.
Решение 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 февраля невисокосный год


AD0DE412
гляньте как это там ->

 import datetime
import calendar
datetime.__file__
calendar.__file__
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB