如何从字典更新计数器 Python

How to update a counter from dictionary Python

我是 Python 的新手,一般来说是编码,我正在尝试在 Python 中创建二十一点游戏,但我无法更新计分器 point_selection根据玩家手中的牌值:

deck_points = {2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6, 7 : 7, 8 : 8, 9 : 9, 10 : 10, 'J' : 10, 'Q' 
: 10, 'K' : 10, 'A' : 11 }

dealer_hand = []
player_hand = []

dealer_points = 0
player_points = 0

def deal_initial_cards(hand, point_selection):
    for i in range(2):
        i = random.choice(list(deck_points))
        hand.append(i)
    for card in hand:
        point_selection += deck_points[card]

deal_initial_cards(dealer_hand, dealer_points)
print(dealer_points)

使用上面的代码,计数器永远不会更新到“0”之后,我不确定我做错了什么。感谢任何帮助。

Python 整数是不可变的,这意味着 dealer_points 不会更新。最初它们具有相同的 id(使用 id()),但是当您更改函数内的变量时,它会创建一个新变量。要修复您的代码,您需要执行类似

的操作
deck_points = {2 : 2, 3 : 3, 4 : 4, 5 : 5, 6 : 6, 7 : 7, 8 : 8, 9 : 9, 10 : 10, 'J' : 10, 'Q' 
: 10, 'K' : 10, 'A' : 11 }

dealer_hand = []
player_hand = []

dealer_points = 0
player_points = 0

def deal_initial_cards(hand, point_selection):
    for i in range(2):
        i = random.choice(list(deck_points))
        hand.append(i)
    for card in hand:
        point_selection += deck_points[card]
    return point_selection

dealer_points = deal_initial_cards(dealer_hand, dealer_points)
print(dealer_points)

而您可能注意到的列表是可变的。这意味着函数内的列表即使在编辑时也保持不变(保持其 ID)。

这里有一个更 Pythonic 的解决方案,它修复了函数 deal_initial_cards() 在其(不可变)int 参数 point_selection 的副本上运行然后丢弃结果的主要错误,因为它没有 return point_selection(或将结果存储在 class 成员 self.points 中)。 (另外,我把你所有的 dict keys strings: '2','3',...... ]

但是由于您实际上是在声明一个 Hand class,然后实例化它的两个对象(dealer_handplayer_hand)。 deal_initial_cards() 本质上是变相的 Hand._init__(),因此我们有一个数据成员 cards(最好不要也称它为 hand)。看看 ph = Hand() 是多么简单干净;不需要全局变量。此外,我们 可以 静态计算 __init__() 函数内部的 points 和 return 它(或者,更好的是,将其存储在 self.points 内部each hand object),但这将是一个糟糕的分解,因为如果我们随后将卡片添加到 self.cards,点将不会更新。所以,更多的 Pythonic 是使 points 成为 class 的 property。然后我们访问它 没有括号:dh.points,而不是 dh.points()。最后,请注意使用列表理解(而不是 for 循环追加)来生成 self.hand。在 points() 中,请注意生成器表达式 deck_points[card] for card in self.cards 的使用,再次 Pythonic 比 for 循环计数器更多。所以这个小例子很好地展示了 Python 习语和分解。我们可以给 Hand 添加一个 __str__() 方法。 (你也可以有一个 Card class,但真的太过分了。)

import random

deck_points = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'T': 10, 'J' : 10, 'Q'
: 10, 'K' : 10, 'A' : 11 }

# No globals, so no need to initialize anything

class Hand:

    def __init__(self):
        self.cards = [random.choice(list(deck_points)) for _ in range(2)]

    @property
    def points(self):
        return sum(deck_points[card] for card in self.cards)

    def __str__(self, join_char=''):
        return join_char.join(card for card in self.cards)

#deal_initial_cards(dealer_hand, dealer_points)
ph = Hand()
dh = Hand()
print('Dealer: ', end='')
print(dh.points)
print('Player: ', end='')
print(ph.points)