Форум сайта python.su
Написал вроде элементарную програмку для ввода даты с проверкой на правильность ввода.
Почему после заведомо неверного ввода программа как и положено стартует заново, но в выводе выводит и неправильно введенные данные или стартует еще раз с какого либо места на пример с ввода года???
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()
Офлайн
also1Ваши
ввода программа как и положено стартует заново
if day > 31 or day < 0:
print('Хрень ввели')
vvod_dat()
Офлайн
Спасибо, с этим понятно, тогда как-же сделать простой перезапуск функции, без рекурсии??
Офлайн
while True: print("принт")
Офлайн
Если можно поподробнее.
while True куда вставлять?
Офлайн
ну идея в том что бы (как я понимаю вам нужно снова и снова зпускать вашу функцию) использвать бесконечный цикл
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()
Отредактировано AD0DE412 (Янв. 25, 2021 11:31:30)
Офлайн
Идея была несколько в другом: Это именно функция, она должна вызываться из другого кода. Там нужно вводить дату начала и дату конца периода. И она должна запускаться заново, только в том случае, если ввод не правильный.
Как-бы эту “while True:” внедрить внутрь и без "
if input("\nпроверить? \nесли нет введи n\nда "\ "введи любой символ\n>> ") == "n":
Офлайн
# функция возвращает 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)
Онлайн
Спасибо это то что надо. Работает отлично!!!
Офлайн
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
Офлайн