Python二十一点游戏字典访问出现TypeError的解决咨询
修复Python二十一点游戏中的字典访问TypeError问题
我来帮你搞定这个问题~你这段代码的bug其实很好找:你随机选了一张牌的键之后,立刻把它从字典里删掉了,之后再用deck.get(number)去拿它的值,这时候字典里已经没有这个键了,get方法就会返回None,你再把None转成int自然就会抛出TypeError了。
先看你原来的代码:
import random deck= {'K ♥':'10' ,'Q ♥':'10','J ♥':'10','10 ♥':'10','9 ♥':'9','8 ♥':'8','7 ♥':'7','6 ♥':'6','5 ♥':'5','4 ♥':'4','3 ♥':'3','2 ♥':'2','A ♥':'11','K◆':'10','Q◆':'10','J◆':'10','10◆':'10','9◆':'9','8◆':'8','7◆':'7','6◆':'6','5◆':'5','4◆':'4','3◆':'3','2◆':'2','A◆':'11','K ♣':'10','Q ♣':'10','J ♣':'10','10 ♣':'10','9 ♣':'9','8 ♣':'8','7 ♣':'7','6 ♣':'6','5 ♣':'5','4 ♣':'4','3 ♣':'3','2 ♣':'2','A ♣':'11','K ♠':'10','Q ♠':'10','J ♠':'10','10 ♠':'10','9 ♠':'9','8 ♠':'8','7 ♠':'7','6 ♠':'6', '5 ♠':'5','4 ♠':'4','3 ♠':'3','2 ♠':'2','A ♠':'11'} number= random.choice(list(deck.keys())) del deck[number] number2= random.choice(list(deck.keys())) print(number) print(number2) value1 = int(deck.get(number)) value2 =int(deck.get(number2)) print(value1+value2)
运行时抛出的错误:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
修复方案
最简单的解决思路是先拿到牌的数值,再删除对应的键,或者直接用字典的pop()方法——这个方法可以同时完成「获取键对应的值」和「删除该键」两个操作,非常适合你的场景。
下面是修改后的代码:
import random deck= {'K ♥':'10' ,'Q ♥':'10','J ♥':'10','10 ♥':'10','9 ♥':'9','8 ♥':'8','7 ♥':'7','6 ♥':'6','5 ♥':'5','4 ♥':'4','3 ♥':'3','2 ♥':'2','A ♥':'11','K◆':'10','Q◆':'10','J◆':'10','10◆':'10','9◆':'9','8◆':'8','7◆':'7','6◆':'6','5◆':'5','4◆':'4','3◆':'3','2◆':'2','A◆':'11','K ♣':'10','Q ♣':'10','J ♣':'10','10 ♣':'10','9 ♣':'9','8 ♣':'8','7 ♣':'7','6 ♣':'6','5 ♣':'5','4 ♣':'4','3 ♣':'3','2 ♣':'2','A ♣':'11','K ♠':'10','Q ♠':'10','J ♠':'10','10 ♠':'10','9 ♠':'9','8 ♠':'8','7 ♠':'7','6 ♠':'6', '5 ♠':'5','4 ♠':'4','3 ♠':'3','2 ♠':'2','A ♠':'11'} # 用pop方法同时获取值并删除键 number = random.choice(list(deck.keys())) value1 = int(deck.pop(number)) number2 = random.choice(list(deck.keys())) value2 = int(deck.pop(number2)) print(number) print(number2) print(value1 + value2)
为什么这样能解决问题?
原来的代码中,你执行del deck[number]之后,number这个键已经从字典里消失了,再调用deck.get(number)就只能得到None。而pop()方法会先返回该键对应的数值,然后再把键从字典中移除,这样我们既能拿到正确的数值,也保证了牌不会被重复抽到。
如果你不想用pop(),也可以先存值再删除,写法如下:
number = random.choice(list(deck.keys())) value1 = int(deck[number]) # 先拿值 del deck[number] # 再删除
效果和pop()是一样的,只是pop()更简洁高效。
内容的提问来源于stack exchange,提问作者Fiona Almeyda Wijaya
相关产品推荐
相关产品推荐

