如何定义通用函数以检查是否允许输入

时间:2017-08-08 13:00:22

标签: python loops global

允许的输入检查器
我正在尝试定义一个泛型函数,可以调用该函数来检查用户输入是否与有效选项列表匹配。

  • valid1和valid2:选项
  • var:输入变量名称
  • text:使用输入
  • 显示的字符串
  • var_out:这应该是包含有效选项的输出的变量名称

必须针对不同的问题更改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

这是为什么?我该如何解决?

1 个答案:

答案 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循环。我还建议你阅读更多有关函数,循环和递归的内容,因为你似乎得到的问题非常基础。