允许的输入检查器
我正在尝试定义一个泛型函数,可以调用该函数来检查用户输入是否与有效选项列表匹配。
必须针对不同的问题更改define语句中的var_out参数,但也需要是全局的,以允许设置变量然后在外部使用。这会导致错误:
名称' VAR_OUT'是参数和全局
如何避免这种情况,但仍然可以更改输出变量的名称?
def valid_check(valid1,valid2,var,text,var_out):
global var_out
valid = [valid1,valid2]
var = input(text)
var = var.lower()
if var not in valid:
print ("Try again")
valid_check(valid1,valid2,var,text,var_out)
else:
print("Good")
var_out = var
print(var_out)
valid_check("yes","no",'Play_again',"Do you want to play agian: Yes or no","Question_1")
print (var_out)
编辑:意识到这将永远不会奏效。我改为
def valid_check(valid1,valid2,var,text):
valid = [valid1,valid2]
var = input(text)
var = var.lower()
if var not in valid:
print ("Try again")
valid_check(valid1,valid2,var,text)
else:
print(var+" was accepted")
return str(var)
Q2 = valid_check("a","b","Q2","a or b:")
print (Q2)
但如果答案在第一次输出有效时有效
a or b:a
a was accepted
a
如果你先输入错误,那么输入正确的第二次输出是'无'
a or b:INVALID
Try again
a or b:a
a was accepted
None
这是为什么?我该如何解决?
答案 0 :(得分:1)
将值记录到全局变量中以便以后使用它们并不是一个好主意。相反,最好使用return
关键字:
def some_method(input):
return input + 1
然后,您可以将方法的结果分配给变量并使用它,如下所示:
a = some_method(5)
// a == 6
此外,对于像你这样的任务,使用递归是非常不明智的,因为至少它会打印Good
多次,因为用户给出了错误的输入!我建议使用一个简单的while
循环,如下所示:
def valid_check(valid1, valid2, text):
valid = [valid1, valid2]
var = input(text).lower()
while var not in valid:
print("Try again")
var = input(text).lower()
print("Good")
return var
var_out = valid_check("yes", "no", "Do you want to play agian: Yes or no")
print(var_out)
请注意,您不需要传递变量来将结果存储为参数,也不需要传输中间结果。希望这有帮助!
编辑OP编辑:
这就是我建议你使用while循环的原因。在您的代码中,当输入不正确时,您再次调用您的函数:
def valid_check(valid1,valid2,var,text):
valid = [valid1,valid2]
var = input(text)
var = var.lower()
if var not in valid:
print ("Try again")
valid_check(valid1,valid2,var,text) // <--- Here
else:
print(var+" was accepted")
return str(var)
Q2 = valid_check("a","b","Q2","a or b:")
print (Q2)
这称为recursion。当您再次调用方法时,它会使用相同的值重新运行它,然后返回到原始方法调用。但是,调用它的方式 - 不分配给变量,会导致return
未使用的值,因此原始方法调用无需返回 - 它将退出if else
块并退出没有返回任何值 - 因此你得到None
。
再次建议您使用我在我的示例中给出的while
循环。我还建议你阅读更多有关函数,循环和递归的内容,因为你似乎得到的问题非常基础。