【问题标题】:unsupported operand type(s) for -: 'NoneType' and 'int'- 不支持的操作数类型:“NoneType”和“int”
【发布时间】:2018-04-16 10:28:50
【问题描述】:

我用 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'

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

【问题讨论】:

  • 你错过了第 7 行的回报
  • 对于询问输入来说,递归似乎有点矫枉过正。
  • 我还有另一个问题,当代码在在线解释器中运行时一切正常,但是在 linux 终端中运行时出现错误./paper.py: line 2: syntax error near unexpected token '(' ./paper.py: line 2: 'p1 = random.randint(0, 2)'

标签: python types typeerror nonetype


【解决方案1】:

当你再次调用choosing() 时,你没有返回它的值,所以它返回None。换行:

choosing()

到:

return choosing()

在我看来,循环调用比递归调用更好。

【讨论】:

  • 不仅在 Python 中更好,而且可能适当,因为大多数(全部?)Python 解释器都缺乏尾调用优化,而且堆栈很小。
  • 如果有人尝试了 1,000 次才能输入有效响应,则生成的 RecursionError 并非完全不值得。 :-)
【解决方案2】:

在 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 的观点,这里的递归对于简单地询问输入似乎有点过头了。

【讨论】:

    【解决方案3】:

    将非数字输入转换为 int 时发生错误

    p = int(input("Rock: 0; Paper: 1; scissor: 2:"))
    

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

    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")
    

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2017-12-27
      • 2014-03-31
      • 2021-05-23
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 2016-08-25
      相关资源
      最近更新 更多