因此,我正在创建一个简单的石头剪刀游戏,我遇到了一个小障碍,我已经为用户选择了一个功能,我只允许他们选择游戏的三个有效选项。但是,每当他们选择不允许的内容时,我会遇到一个奇怪的问题这是我的功能,
def userChoice():
choice = input("Rock (R), Paper (P), Scissors (S)? ")
if choice.upper() == 'R' or choice.lower() == 'rock':
choice = 'Rock'
return choice
elif choice.upper() == 'P' or choice.lower() == 'paper':
choice = 'Paper'
return choice
elif choice.upper() == 'S' or choice.lower() == 'scissors':
choice = 'Scissors'
return choice
else:
print("This was an invalid option, please try again.")
userChoice()
user = userChoice()
print("Your choice is: " + user)
我遇到的问题是,当用户选择他们不应该做的事情时,例如' L'它显示错误消息并重新启动该功能,允许他们再次选择。但是,当他们下一次选择(正确的值)时,我会收到以下错误。
" Traceback(最近一次调用最后一次): 文件" python",第23行,in TypeError:无法转换' NoneType'隐含地反对str#34;
我知道如果你没有给函数返回一个值,它会返回默认值'无'这是我遇到的类型错误。然而,我不明白的是,为什么第二次在第一次错误的值之后运行时,我将正确的值放入其中仍然需要值'无'而不是我指定的新的正确值?
有关为何会发生这种情况以及如何解决问题的任何帮助?
谢谢,
利安
答案 0 :(得分:3)
以递归方式调用方法时,需要返回该值:
def userChoice():
choice = input("Rock (R), Paper (P), Scissors (S)? ")
if choice.upper() == 'R' or choice.lower() == 'rock':
choice = 'Rock'
return choice
elif choice.upper() == 'P' or choice.lower() == 'paper':
choice = 'Paper'
return choice
elif choice.upper() == 'S' or choice.lower() == 'scissors':
choice = 'Scissors'
return choice
else:
print("This was an invalid option, please try again.")
# return this!
return userChoice()
user = userChoice()
print("Your choice is: " + user)
如果你没有返回,那么该函数的结果永远不会一直返回。因此,返回的结果为None,您将看到错误。
其他一些说明。没有确切的理由在choice
中存储更正的选项。您还可以通过在收到值时坚持choice
一次,坚持使用并一直使用该值来简化您正在进行的检查:
def userChoice():
choice = input("Rock (R), Paper (P), Scissors (S)? ").lower()
if choice == 'r' or choice == 'rock':
return 'Rock'
elif choice == 'p' or choice == 'paper':
return 'Paper'
elif choice == 's' or choice == 'scissors':
return 'Scissors'
else:
print("This was an invalid option, please try again.")
return userChoice()
答案 1 :(得分:0)
我知道我回复有点迟,但是@Jamie Counsell是正确的,因为你需要将递归调用返回给userChoice();但是,您可以通过使用正则表达式进一步增强您的程序,以便它不需要这样的特定条目。作为奖励,在使用upper()或lower()的相等检查上使用它更有效。以下是
的示例from re import match
def userChoice():
choice = ""
while len(choice) < 1:
choice = input("Rock (R), Paper (P), or Scissors (S)?\n")
if match(r"(?i)^p(aper)?\Z", choice) is not None:
return "Paper"
elif match(r"(?i)^r(ock)?\Z", choice) is not None:
return "Rock"
elif match(r"(?i)^s(cissors)?\Z", choice) is not None:
return "Scissors"
else:
print(choice + " is not a valid option, please try again.")
return userChoice()
user = userChoice()
print("Your choice is: " + user)
这是一个关于它如何运作的速成课程:
match(r"", str) is not None
如果匹配则返回True
(?i)
表示检查不区分大小写
^
表示str的开头
(str)?
表示str的0-1
\Z
表示str的结尾
答案 2 :(得分:0)
简单的解决方案是将变量转换为字符串。 我已经使用str(variable)强制转换了变量。您可以按照自己的方式进行投射。现在,指向空的变量的值将在转换时开始指向无。而且异常会消失