我使用python tutor逐步遍历代码,发现user_current_score()中有一个bug。对于cards.get(card),它正在抽取"10";但将其视为1,然后返回None,因为没有1牌。为什么在字典里没有1的时候会看到1呢?我知道我可以做得不同,但我还是想知道为什么它会拉上"10"字。关键字为"1"并返回& None"。如果我注释"10"字典键值对输出,代码到目前为止没有问题。如果它取出一个10,我得到这个错误:
10
None
Traceback (most recent call last):
File "main.py", line 146, in <module>
user_current_score()
File "main.py", line 133, in user_current_score
user_score += cards.get(card)
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
或
K
10
10
None
Traceback (most recent call last):
File "main.py", line 146, in <module>
user_current_score()
File "main.py", line 133, in user_current_score
user_score += cards.get(card)
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
代码:
import random
cards = {
"A":11,
"2":2,
"3":3,
"4":4,
"5":5,
"6":6,
"7":7,
"8":8,
"9":9,
"10":10,
"J":10,
"Q":10,
"K":10
}
user_hand = []
comp_hand = []
comp_score = 0
temp_hand = []
translation = {39: None}
def deal_card():
temp_hand = []
temp_hand = random.choice(list(cards))
print(temp_hand) #for testing, needs removed
return temp_hand
def user_current_score():
user_score = 0
for card in user_hand:
print(cards.get(card)) #for testing, needs removed
user_score += cards.get(card)
print("Your cards:", str(user_hand).translate(translation) + f", current score: {user_score}")
return user_score
def comp_current_score():
comp_score = 0
for card in comp_hand:
comp_score += cards.get(card)
return comp_score
while len(user_hand) < 5:
user_hand += deal_card()
print(" ")
user_current_score()
问题是您将卡片名称连接为字符串。因此,如果你手中的牌是2,10,7,那么user_hand
的值将是字符串"2107"
。
然后你做
for card in user_hand:
这遍历字符串中的字符,因此第二张牌将是1
,而不是10
。由于cards
字典中没有键1
,因此您会得到一个错误。
你应该让user_hand
成为一个列表而不是一个字符串,或者使用一个1个字符的名称作为10,例如T
,这样user_hand
中的每个字符将对应于一张卡。
您还应该使用cards[card]
而不是cards.get(card)
。None
的默认值是没有用的,所以如果有东西传递了一个无效的卡片,你也可以得到一个KeyError
。
您应该使用append
方法来添加值到您的列表
当您尝试使用str(超过1个字符)的+=
列表时,您实际上是将此str拆分为字符并按顺序附加它们。
试试这个:
while len(user_hand) < 5:
user_hand.append(deal_card())