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

also1
Спасибо это то что надо. Работает отлично!!!
AD0DE412
 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
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