我决定给Python一个旋转,并建立一个虚假的数据验证器。好像我的代码总是输出错误,我认为这是因为我滥用了布尔值。
'''
Date_Validation_Testing
'''
year_conditional = False
day_conditional = False
def valid_year(year):
if (year.isdigit()):
year = int(year)
if (year < 2030 and year > 1899):
year_conditional = True
return year_conditional
def valid_day(day):
if (day.isdigit()):
day = int(day)
if (day <= 31 and day > 0):
day_conditional = True
return day_conditional
day = raw_input("Enter a day: ")
year = raw_input("Enter a year: ")
valid_day(day)
valid_year(year)
if (year_conditional and day_conditional):
print("woooo!")
else:
print("boooo!")
答案 0 :(得分:2)
您的valid_day
和valid_year
函数正在返回一个值,但您从未将其分配给任何内容。您已将验证day_conditional
和year_conditional
命名为与根级别相同,但它们不同,因为它们位于不同的范围内。
你有两个选择,一个比另一个好得多。更糟糕的选择是定义global day_conditional
中的valid_day
和global year_conditional
中的valid_year
。然后,您可以忽略return
次调用,因为它会修改您已构建的条件。
你真正应该做的是:
day_conditional = valid_day(day)
year_conditional = valid_year(year)
而不是
valid_day(day)
valid_year(year)
当您致电day_conditional = valid_day(day)
时,它会将day_conditional
设置为valid_day
返回的任何内容。
答案 1 :(得分:0)
您没有分配返回的值。你的代码应该是
day_conditional = valid_day(day)
year_conditional = valid_year(year)
这是因为命名空间在python中的工作方式。在大多数编程语言中,当找不到局部变量时,会在全局命名空间中查找它。但是在python中,如果要更改全局变量,则必须首先声明它:
def valid_day(day):
global day_conditional
...
然而,这通常被认为是不好的做法。通过使用例如return来避免这种情况会更加方便和有效。
方便 - 因为在代码中清楚地知道全局变量何时以及如何被更改,而不通读函数声明。
高效 - 因为堆栈和全局变量的工作方式。访问全局变量通常比访问本地变量要长一点。
答案 2 :(得分:0)
使用全球关键字。
Global Python
year_conditional= False
day_conditional= False
def valid_year(year):
if (year.isdigit()):
year = int(year)
if (year < 2030 and year > 1899):
global year_conditional
year_conditional = True
return year_conditional
def valid_day(day):
if (day.isdigit()):
day = int(day)
if (day <= 31 and day > 0):
global day_conditional
day_conditional = True
return day_conditional
day = raw_input("Enter a day: ")
year = raw_input("Enter a year: ")
valid_day(day)
valid_year(year)
if (year_conditional and day_conditional):
print("woooo!")
else:
print("boooo!")