我正在尝试使用以下代码检查raw_input
是否是三个选项中的一个选项:
def selectDiff():
upperbound = 0
difficulty = ['easy', 'medium', 'hard']
diff = raw_input(' or '.join(difficulty)).lower()
if diff in difficulty:
if diff == 'easy':
upperbound = 20
elif diff == 'medium':
upperbound = 25
elif diff == 'hard':
upperbound = 30
else:
print "Please select easy, medium or hard\n"
selectDiff()
return upperbound
如果用户从难度列表['easy','medium','hard']
输入值,则该函数按照我的意愿运行,但如果用户首先输入未包含在列表中的值,则当他们最终输入在在列表中,变量upperbound
返回0.我尝试移动return语句,但结果是相同的,或者由于在变量被拒绝之前引用变量而得到错误。
是否有可能改变我的方法以产生所需的行为,还是应该使用其他方法?
答案 0 :(得分:5)
我同意在这里使用循环可能更有意义,但是如果你想继续使用递归,只需将upperbound
分配给内部selectDiff
的结果。
def selectDiff():
difficulty = ['easy', 'medium', 'hard']
diff = raw_input(' or '.join(difficulty)).lower()
if diff in difficulty:
if diff == 'easy':
upperbound = 20
elif diff == 'medium':
upperbound = 25
elif diff == 'hard':
upperbound = 30
else:
print "Please select easy, medium or hard\n"
upperbound = selectDiff() # Use the returned value
return upperbound
在旁注中,您还可以使用dict
替换elif
链,并使其更容易扩展。
def selectDiff():
difficulty = {
'easy': 20,
'medium': 25,
'hard': 30,
}
diff = raw_input(' or '.join(difficulty)).lower()
try:
return difficulty[diff]
except KeyError:
print "Please select easy, medium or hard\n"
return selectDiff()
答案 1 :(得分:4)
使用while
循环继续输入,直到用户输入正确的输入。
def selectDiff():
difficulty = ['easy', 'medium', 'hard']
while True:
diff = raw_input('easy, medium or hard').lower()
if diff in difficulty:
if diff == 'easy':
return 20
elif diff == 'medium':
return 25
elif diff == 'hard':
return 30
else:
print "Please select easy, medium or hard\n"
答案 2 :(得分:3)
您在自己内部调用selectDiff()
,然后忽略返回值。你最好使用循环而不是无限递归。
比如说:
def selectDiff():
while True:
diff = raw_input('easy, medium or hard').lower()
if diff=='easy':
return 20
if diff=='medium':
return 25
if diff=='hard':
return 30
print "Please select easy, medium or hard\n"
答案 3 :(得分:0)
我认为你希望在这里做的是使upperbound
成为一个动态范围的闭包变量,即使你可能不知道这些单词是什么意思。这不会起作用,因为Python不进行动态范围设定(大多数其他现代语言也不做),而且在3.x Python封闭变量分配给它们之前不起作用。
但是,您可以通过仔细使用全局变量或(更好)一个词法范围的变量来模拟您想要的范围,并且您可以通过将变量存储在另一个可变变量中来模拟赋值。所以:
def selectDiff():
upperbound = [0]
def realSelectDiff():
difficulty = ['easy', 'medium', 'hard']
diff = raw_input(' or '.join(difficulty)).lower()
if diff in difficulty:
if diff == 'easy':
upperbound[0] = 20
elif diff == 'medium':
upperbound[0] = 25
elif diff == 'hard':
upperbound[0] = 30
else:
print "Please select easy, medium or hard\n"
realSelectDiff()
realSelectDiff()
return upperbound[0]
现在,每次拨打realSelectDiff
都没有设置自己的upperbound
本地副本,他们都设置了外selectDiff
份副本upperbound
值。
所有这一切,这几乎都不是一个好主意。如果你想使用递归,你几乎总是想要在堆栈中传递值,并且你不想首先使用递归来模拟循环。但值得了解这是如何运作的。