Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2019 21:45:39

bynikk
Зарегистрирован: 2019-04-27
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

Написать функцию 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(“не верная дата”)

Прикреплённый файлы:
attachment Screenshot_1.png (93,6 KБ)

Офлайн

#2 Апрель 27, 2019 23:24:47

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

Пытаюсь решить эту задачу:

 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 ищет вхождение среди ключей словаря, а не “входит ли один словарь в другой”. Тут правильнее проверять именно наличие ключа и соответствие значения по этому ключу.

Отредактировано Egorro13 (Апрель 27, 2019 23:25:39)

Офлайн

#3 Апрель 28, 2019 00:29:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9867
Репутация: +  853  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

Проверка на високосность года
Пример
Пример



Офлайн

#4 Апрель 28, 2019 12:22:05

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

 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, то решение простое

Офлайн

#5 Апрель 28, 2019 15:01:23

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

panama555
Такой пустяк, да и через обработчик исключений?



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Офлайн

#6 Апрель 28, 2019 15:45:14

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

А что не так?

Офлайн

#7 Апрель 28, 2019 15:52:43

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

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

Офлайн

#8 Апрель 28, 2019 20:29:40

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

Для того, чтобы “юзер не юзанул ctrl+c” нужно предусмотреть проверку в месте ввода данных.
Без этого никак.
А насчёт “такая конструкция крайне ненадежна” - вы о чём???
Этот вариант работает и будет работать без проблем.
Если в этот момент компьютер зависнет по какой-либо причине, то при чём тут “надёжность конструкции”???

Офлайн

#9 Март 14, 2021 06:29:56

Ocean
Зарегистрирован: 2021-03-14
Сообщения: 131
Репутация: +  9  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

Мне среди прочих попалась задача, которую вы тут уже разбирали.
Решение 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)

Офлайн

#10 Март 14, 2021 07:01:43

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Пытаюсь решить эту задачу:

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

 import datetime
import calendar
datetime.__file__
calendar.__file__



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version