无法转换' NoneType'隐含的对象

时间:2017-03-12 13:31:08

标签: python python-3.x typeerror

因此,我正在创建一个简单的石头剪刀游戏,我遇到了一个小障碍,我已经为用户选择了一个功能,我只允许他们选择游戏的三个有效选项。但是,每当他们选择不允许的内容时,我会遇到一个奇怪的问题这是我的功能,

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;

我知道如果你没有给函数返回一个值,它会返回默认值'无'这是我遇到的类型错误。然而,我不明白的是,为什么第二次在第一次错误的值之后运行时,我将正确的值放入其中仍然需要值'无'而不是我指定的新的正确值?

有关为何会发生这种情况以及如何解决问题的任何帮助?

谢谢,

利安

3 个答案:

答案 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)强制转换了变量。您可以按照自己的方式进行投射。现在,指向空的变量的值将在转换时开始指向无。而且异常会消失