如何解决Python中TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'错误
解决石头剪刀布游戏的TypeError问题
嘿,我来帮你搞定这个错误!首先咱们先弄明白为什么会出现TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType':
这个错误的根源是当玩家输入的内容不是steen、papier或者schaar的时候,dictionary.get(p1)和dictionary.get(p2)会返回None——因为字典里找不到对应的键嘛!这时候你去做a - b,就相当于用两个None做减法,Python肯定不允许,所以就报错了。
你之前看到的“把print改成return”的建议,应该是其他代码场景(比如函数返回值)的解决方案,和你的问题完全不相关,别被带偏啦~你的核心问题是没有对玩家的输入做合法性校验,再加上几个小的代码细节问题,咱们一步步修正:
具体修正步骤
- 添加输入校验:确保玩家必须输入字典里存在的选项,否则一直提示重新输入
- 统一输入方法:你用的是Python 2,
raw_input是正确获取字符串输入的方式,后面的input改成raw_input(Python 2里input会尝试执行输入的内容,很容易出问题) - 修正拼写错误:代码里的
spelem是笔误,应该改成spelen - 简化重复逻辑:把“是否继续游戏”的代码抽出来,避免重复写三次
修正后的完整代码
while True: dictionary = {"steen": 1, "papier": 2, "schaar": 3} # 校验玩家1的输入,确保输入合法 while True: p1 = raw_input("Maak een keuze: steen, papier of schaar: ") if p1 in dictionary: break print("Ongeldige keuze! Probeer opnieuw.") # 校验玩家2的输入,确保输入合法 while True: p2 = raw_input("Maak een keuze: steen, papier of schaar: ") if p2 in dictionary: break print("Ongeldige keuze! Probeer opnieuw.") a = dictionary[p1] # 因为已经校验过,直接用[]取值就行,不用get了 b = dictionary[p2] dif = a - b if dif in [1, -2]: print("Speler 1 heeft gewonnen") elif dif in [-1, 2]: print("Speler 2 heeft gewonnen") else: print("Gelijkspel") # 统一的继续游戏逻辑 while True: play_again = raw_input("Wilt u nog een keer spelen, ja of nee? ").strip().lower() if play_again in ["ja", "nee"]: break print("Voer alstublieft 'ja' of 'nee' in.") if play_again != "ja": print("Game over") break
改动说明
- 新增的嵌套
while循环会一直提示玩家输入,直到输入合法的选项为止,这样a和b就永远不会是None,减法运算自然不会报错 - 因为已经做了输入校验,所以可以直接用
dictionary[p1]取值,不用再用get(get是在不确定键是否存在时用的,现在确定存在,直接取值更直接) - 把重复的“继续游戏”逻辑抽出来,代码更简洁,也避免了拼写错误
- 对
play_again的输入做了小写处理,不管玩家输入"Ja"、"JA"还是"ja"都能正确识别
这样修改后,你的游戏就能正常运行,再也不会出现那个TypeError啦!
内容的提问来源于stack exchange,提问作者Jem
相关产品推荐
相关产品推荐

