Python新手,我想创建一个提示用户输入的函数,并检查它是否是可接受的输入(有一个ok输入列表)。如果可接受 - 返回输入。如果不是 - 再次提示用户,直到他提供可接受的输入。
这就是我使用的:
def get_choice():
possible_choices = ["option1","option2","option3","option4"]
choice = raw_input("Please enter your choice: ").lower()
if choice not in possible_choices:
print "Sorry, please try again"
return get_choice() # if not an acceptable answer - run the function again
return choice
现在,这有效。 我想知道的是if条件为True时的return命令。 直觉上我没有返回那里,只是再次调用该函数,如果用户没有输入可接受的条目,它确实会再次运行它。但是,函数本身将返回用户输入的原始值,可接受或不可接受。只有当我在再次调用函数之前添加return时,它才开始正常工作。
任何人都可以解释为什么会这样吗? “有意义的是”当再次调用该函数时,选择现在将指向新的用户输入,而不是第一个。
我有一个想法是从Abrixas2回答这个问题来添加回报:
Python getting user input errors
然而,在这里:Continually prompting user for input in Python,audionautics的部分回答与类似的问题有关,他建议这个功能:
def get_input_number():
num = int(raw_input("Enter a positive integer no greater than 42 "))
if num <= 0 or num > 42:
print "Invalid input. Try again "
get_input_number()
else:
return num
显然,输入需要通过除我以外的其他标准进行验证,但是你会发现问题的本质是相同的。在再次调用函数之前,他没有返回语句。我尝试运行此代码以及:
test = get_input_number()
print test
打印结果,但没有返回任何内容。我提出它的原因是它仍然有3个upvotes(这个问题的大多数赞成票)所以我不想在我研究这个问题时一起解雇它。
无论如何,最重要的是,有人可以解释一下正确的方法是什么,为什么没有if条件中的return语句的函数返回了用户输入的第一个值?
谢谢:D
答案 0 :(得分:2)
你正在使用递归;你再次调用函数本身。每个函数调用都有自己的独立名称;递归调用获取 new choice
变量,当前正文中的变量不会改变。
if choice not in possible_choices:
print "Sorry, please try again"
return get_choice()
该函数递归调用返回一些东西,如果你没有返回任何返回的递归调用,你就会忽略它;无论嵌套的get_choice()
返回什么都没有。
在该调用之前设置的choice
变量仍然是旧的错误值,因为它与递归调用中的choice
值无关。
你也可以这样做:
if choice not in possible_choices:
print "Sorry, please try again"
choice = get_choice()
return choice
e.g。将当前choice
设置为返回值,因此本地choice
现在将反映递归调用返回的内容。
但是,您不应该使用递归来请求用户输入。请改用循环。循环可以无限期地继续,而递归调用最终会耗尽堆栈空间。顽固的用户会破坏你的程序:
def get_choice():
while True:
possible_choices = ["option1","option2","option3","option4"]
choice = raw_input("Please enter your choice: ").lower()
if choice in possible_choices:
return choice
print "Sorry, please try again"
此处return
将结束循环,退出该函数。如果你不返回,循环就会继续,用户必须做出正确的选择。