Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 24, 2021 20:31:33

also1
Зарегистрирован: 2019-12-06
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять почему так?

Написал вроде элементарную програмку для ввода даты с проверкой на правильность ввода.
Почему после заведомо неверного ввода программа как и положено стартует заново, но в выводе выводит и неправильно введенные данные или стартует еще раз с какого либо места на пример с ввода года???

 import datetime
def vvod_dat():  # Ввод даты
    try:
        day = int(input('Введите день: '))
        if day > 31 or day < 0:
            print('Хрень ввели')
            vvod_dat()
        month = int(input('Введите месяц: '))
        if month > 12 or month < 0:
            print('Хрень ввели')
            vvod_dat()
        year = int(input('Введите год: '))
        if year < 2021 or year > 2050:
            print('Хрень ввели')
            vvod_dat()
        date1 = datetime.date(year,month,day)
        print(date1)
    except:
        print('Хрень ввели')
        vvod_dat()
vvod_dat()

Офлайн

#2 Янв. 24, 2021 22:09:51

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Помогите понять почему так?

also1
ввода программа как и положено стартует заново
Ваши
if day > 31 or day < 0:
print('Хрень ввели')
vvod_dat()
это не старт ТОЙЖЕ программы заново а рекурсивный вызов НОВОЙ функции. Посмотрите что такое функции и рекурсия.



Офлайн

#3 Янв. 25, 2021 07:42:16

also1
Зарегистрирован: 2019-12-06
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять почему так?

Спасибо, с этим понятно, тогда как-же сделать простой перезапуск функции, без рекурсии??

Офлайн

#4 Янв. 25, 2021 08:11:34

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

Помогите понять почему так?

 while True:
    print("принт")



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

есчщо

Офлайн

#5 Янв. 25, 2021 09:21:58

also1
Зарегистрирован: 2019-12-06
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять почему так?

Если можно поподробнее.
while True куда вставлять?

Офлайн

#6 Янв. 25, 2021 11:19:55

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

Помогите понять почему так?

ну идея в том что бы (как я понимаю вам нужно снова и снова зпускать вашу функцию) использвать бесконечный цикл

 import datetime
def vvod_dat():  # Ввод даты
    try:
        day = int(input('Введите день: '))
        if day > 31 or day < 0:
            raise
        month = int(input('Введите месяц: '))
        if month > 12 or month < 0:
            raise
        year = int(input('Введите год: '))
        if year < 2021 or year > 2050:
            raise
        date1 = datetime.date(year,month,day)
        print(date1)
    except:
        print('это ерунда')
        
        
while True:
    if input("\nпроверить? \nесли нет введи n\nда "\
             "введи любой символ\n>> ") == "n":
        break
    else:
        vvod_dat()



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

есчщо

Отредактировано AD0DE412 (Янв. 25, 2021 11:31:30)

Офлайн

#7 Янв. 25, 2021 18:44:49

also1
Зарегистрирован: 2019-12-06
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять почему так?

Идея была несколько в другом: Это именно функция, она должна вызываться из другого кода. Там нужно вводить дату начала и дату конца периода. И она должна запускаться заново, только в том случае, если ввод не правильный.
Как-бы эту “while True:” внедрить внутрь и без "

 if input("\nпроверить? \nесли нет введи n\nда "\
             "введи любой символ\n>> ") == "n":
"

Офлайн

#8 Янв. 25, 2021 18:58:26

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1371
Репутация: +  121  -
Профиль   Отправить e-mail  

Помогите понять почему так?

 # функция возвращает int число в заданом диапазоне из консоли
def get_number_in_range_from_cmd(low_th,height_th,title=''):
    num = None
    while True:
        new_str = input(f'{title}')
        if new_str.lstrip('-').isdigit():
            num = int(new_str)
            if low_th > num or height_th < num:
                print(f"Значение не может быть меньше {low_th} или больше {height_th}")
                continue
            else:
                return num
        else:
            print("В строке должны быть только цифры (допускается знак \"-\" у отрицательного числа)")
            continue
# функция возвращает datetime из введенных год,месяц,день,в консоли
def get_date_from_cmd():
    import datetime as dt
    y = get_number_in_range_from_cmd(1900,2021,"Введите год: ")
    m = get_number_in_range_from_cmd(1,12,"Введите месяц: ")
    if m in [1,3,5,7,8,10,12]:
        d = get_number_in_range_from_cmd(1,31,"введите день: ")
    elif m in [4,6,9,11]:
        d = get_number_in_range_from_cmd(1, 30, "введите день: ")
    elif m == 2 and y%4 != 0:
        d = get_number_in_range_from_cmd(1,28,"введите день: ")
    elif m == 2 and y%4 == 0:
        d = get_number_in_range_from_cmd(1, 29, "введите день: ")
    date = dt.date(y,m,d)
    return date
date = get_date_from_cmd()
print(date)

Отредактировано xam1816 (Янв. 25, 2021 18:58:42)

Онлайн

#9 Янв. 25, 2021 19:18:32

also1
Зарегистрирован: 2019-12-06
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять почему так?

Спасибо это то что надо. Работает отлично!!!

Офлайн

#10 Янв. 25, 2021 19:44:13

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

Помогите понять почему так?

 import datetime
flag = 1
def run(fink):
    global flag
    while True:
        if flag:
            fink()
        else:
            break
@run
def vvod_dat():  # Ввод даты
    try:
        day = int(input('Введите день: '))
        if day > 31 or day < 0:
            raise
        month = int(input('Введите месяц: '))
        if month > 12 or month < 0:
            raise
        year = int(input('Введите год: '))
        if year < 2021 or year > 2050:
            raise
        global flag
        flag = 0
        print(datetime.date(year,month,day))
    except:
        print('это ерунда')
try:
    vvod_dat()
except TypeError:
    pass



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

есчщо

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version