此代码生成52张牌。在此代码中,我不明白为什么他/她使用Deck类a
方法中的b
类在self.deck
列表中附加参数Card
和__init__
?
suits = ('Hearts', 'Diamonds', 'Spades', 'Clubs')
ranks = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Jack', 'Queen', 'King', 'Ace')
class Card():
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
def __repr__(self):
return self.rank + " of " + self.suit
class Deck():
def __init__(self):
self.deck = []
for a in suits:
for b in ranks:
self.deck.append(Card(a, b))
def __repr__(self):
deck_comp = ''
for card in self.deck:
deck_comp += "\n "+card.__repr__()
return "The deck has: " + deck_comp
deck = Deck()
print(deck)
让我们分解一下:
我们从嵌套循环开始:
for a in suits:
for b in ranks:
在这里,在每次迭代中,a
将从suits
列表中获取值,b
将从ranks
列表中获取值。
下一条是主线:
self.deck.append(Card(a, b))
[self.deck
是一个列表(定义为用[]
换行)。
append
是在该列表上工作的方法,并将您提供的参数添加到该方法。
在那种情况下,参数为Card(a, b)
,这是创建新的Card
对象的方式,其中参数a
将为西装,参数b
为等级。
简而言之,我们将所有可能的卡的Card
个对象添加到Deck
类内的列表中
变量名称对您没有帮助。代码在suits
和ranks
上迭代以获取它们的所有组合,Card
将使用2个参数创建一个新实例:西服和等级]
Hearts Two Hearts Three Hearts Four ... Diamonds Two Diamonds Three Diamonds Four ...
使用有意义的名称,您不能使用印刷品来更好地理解:
def __init__(self): self.deck = [] for suit in suits: print(suit) # for understanding only for rank in ranks: print(suit, rank) # for understanding only self.deck.append(Card(suit, rank))
这对应于两个列表之间的
itertools.product
,您可以映射到Card
实例并保留列表
def __init__(self):
self.deck = list(map(lambda x: Card(*x), product(suits, ranks)))