这是你的问题:
if guess == 'rock' or 'paper' or 'scissors':
这条线在is_valid_guess
并没有按照你的想法去做。相反,它总是返回True
。你正在寻找的是这样的:
if guess == 'rock' or guess == 'paper' or guess == 'scissors':
或者更简洁地说:
if guess in ('rock', 'paper', 'scissors'):
问题是你总是会得到回报True
因为 Python 如何在布尔上下文中计算字符串。线路if guess == 'rock' or 'paper' or 'scissors':
评估为:
if (guess == 'rock') or ('paper') or ('scissors'):
这意味着 Python 检查是否guess == 'rock'
。如果这是真的,则条件评估为True
。如果为假,解释器会尝试评估bool('paper')
。这总是评估为True
因为所有非空字符串都是“true”。因此,你的整个条件总是True
,并且每个字符串都是“有效的”。
因此,您的代码将所有字符串视为“有效”,然后在无法为实际不支持的猜测分配数字时崩溃。
最后一点,您的is_valid_guess
方法可以稍微修剪一下,因为您只是返回布尔表达式的结果。而不是使用status
变量作为中间体,您可以计算表达式并立即返回它。我也用lower()
字符串对象的方法,以允许不区分大小写的猜测,以防万一您想要允许这样做。
def is_valid_guess(guess):
return guess.lower() in ('rock', 'paper', 'scissors')
您还有另一个问题,您在评论中提到:您已经实施了user_guess
以递归方式,以便在用户输入无效猜测时调用自身。但是,在这种情况下,它不会返回递归调用的结果。您需要通过更改最后一行来返回递归结果user_guess
to:
return user_guess()
否则,您应该使该函数使用循环而不是递归,这就是我要做的,因为该函数本质上不是递归的。你可以这样做:
def user_guess():
# get first guess
guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")
# If that guess is invalid, loop until we get a valid guess.
while not is_valid_guess(guess):
print('That response is invalid.')
guess = input("Choose 'rock', 'paper', or 'scissors' by typing that word. ")
# Now assign the (valid!) guess a number
# This dictionary is just shorthand for your if/elif chain.
guess_table = {
'rock' : 1,
'paper' : 2,
'scissors' : 3
}
# Return the number associated with the guess.
return guess_table[guess.lower()]