不支持的操作数类型 - :'NoneType'和'int'

时间:2017-11-03 16:07:08

标签: python types typeerror nonetype

我用python写了摇滚纸剪刀游戏,我有一些我无法解决的错误。请帮忙。

 import random 
p1 = random.randint(0, 2)
def choosing():
    p = int(input("Rock: 0; Paper: 1; scissor: 2:"))
    if p < 0 or p > 2:
       print("\nPlease enter valid value")
       choosing()
    else:
      return int(p)
p2 = choosing()

print ("\n" + str(p1))
if p1 == p2:
  print("DRAW!!")
elif p2 - p1 == 1 or p1 - p2 == 2:
  print("YOU WON!!")
elif p1 - p2 == 1 or p2 - p1 == 2:
  print("YOU LOSE!!")

错误说

> Traceback (most recent call last):
  File "python", line 15, in <module>
TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'

并且只有在输入无效值

后输入有效值时才会出现错误

3 个答案:

答案 0 :(得分:2)

当您再次致电choosing()时,您不会返回其值,因此会返回None。改变这一行:

choosing()

为:

return choosing()

在我看来,这会像循环一样好,而不是递归调用。

答案 1 :(得分:0)

在Python中,如果您没有显式返回值,它将返回默认值None类型。您可以通过添加返回函数调用choosing()

来解决此问题
def choosing():
    p = int(input("Rock: 0; Paper: 1; scissor: 2:"))
    if p < 0 or p > 2:
       print("\nPlease enter valid value")
       return choosing()
    else:
      return int(p)

另外,我同意@Kindall,这里的递归对于简单地要求输入来说似乎有些过分。

答案 2 :(得分:0)

将非数字输入转换为int

时发生错误
p = int(input("Rock: 0; Paper: 1; scissor: 2:"))

可以使用try-catch处理。在selection()函数中使用递归我也很奇怪。我会做这个功能

def choosing():
    while True:
        try:
            p = int(input("Rock: 0; Paper: 1; scissor: 2:"))
            if p < 0 or p > 2:
                print("\nPlease enter valid value")
            else:
                return p
        except ValueError:
            print("\nPlease enter valid value")