Подпрограмма не работает, сообщение об ошибке говорит о том, что переменная не определена

я использую подпрограмму, и я думаю, что это причина моей проблемы, вот мой код:

def sub1():
    dob=input('Please enter the date of the person (dd) : ')
    while dob not in ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']:
        print('you have entered an incorrect day')
        dob=input('Please enter the date of the person (dd) : ')
sub1()
if month == '02' :
    if dob == ['30','31'] :
        print('You have entered incorrecty')
        sub1()

Переменный месяц просто 01,02,03,04,05,06,07,08,09,10,11,12

Сообщение об ошибке: Файл «C:/Users/Akshay Patel/Documents/TASK 2/task two month dob.py», строка 13, в if dob == ['30','31']:

NameError: имя «доб» не определено


person ap306    schedule 26.02.2014    source источник
comment
исправьте свой отступ... это имеет значение в python. Ваше сообщение об ошибке звучит так, как будто ваш отступ правильный в исходном источнике. dob определяется только внутри sub1, поэтому, когда вы используете его за пределами sub1, он вам не нужен.   -  person Wolf    schedule 27.02.2014


Ответы (1)


Переменная dob является локальной для sub1, поэтому вы не можете видеть ее в глобальной области видимости.

Возможно, вы захотите вернуть его:

def sub1():
    dob=input('Please enter the date of the person (dd) : ')
    while dob not in ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']:
        print('you have entered an incorrect day')
        dob=input('Please enter the date of the person (dd) : ')
    return dob ###########
dob = sub1() ########
if month == '02' :
    if dob in ['30','31'] : ######### in not ==
        print('You have entered incorrecty')
        dob = sub1() ##############

Лично я бы немного реорганизовал ваш код:

def inputDay (month):
    #february doesn't respect leap years
    maxDay = [42, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] [month]
    dob = 0
    while dob > maxDay or dob < 1:
        dob = int(input('Please enter day of month: '))
    return dob

month = 2 #change this value accordingly
day = inputDay(month)
print('{}/{}'.format(month, day))

Если в какой-то момент вы хотите ввести целую дату, вы можете использовать это:

from datetime import datetime

def inputDate():
    while True:
        try: return datetime.strptime(input('Enter date (m/d/yyyy): '), '%m/%d/%Y')
        except ValueError: pass

a = inputDate()
print(a.day, a.month, a.year)
person Hyperboreus    schedule 26.02.2014
comment
так что мне делать? - person ap306; 27.02.2014
comment
@ ap306 Смотрите остальную часть моего ответа. - person Hyperboreus; 27.02.2014
comment
Также необходимо сделать отступ после цикла while - person advert2013; 27.02.2014
comment
@advert2013 Спасибо. Копипаста из оригинального поста. - person Hyperboreus; 27.02.2014
comment
спасибо, я попробую и отпишусь о результатах, если это сработает или не сработает - person ap306; 27.02.2014
comment
поэтому, если доб в ['30','31']: вы имеете в виду, что я должен ввести, если доб в не == ['30','31'] : - person ap306; 27.02.2014
comment
@ ap306 Правильная строка гласит if dob in ['30', '31']. Пока in проверяет условия содержания. Вы также можете использовать кортеж вместо списка. - person Hyperboreus; 27.02.2014
comment
пожалуйста, объясните 3-ю строку вашего кода?. (максДень и т. д.) - person ap306; 27.02.2014
comment
@ ap306 Определяет максимальный день данного месяца month. 31 января, 31 июля, 30 сентября и т. д. Високосные годы не учитываются. Если вам нужна поддержка високосных лет, посмотрите мое последнее редактирование. - person Hyperboreus; 27.02.2014