如何从字典更新计数器 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_hand
、player_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)
我是 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_hand
、player_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)