[使用另一个类在一个类的列表中添加参数?

问题描述 投票:0回答:1

此代码生成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) 
python blackjack
1个回答
0
投票

让我们分解一下:

我们从嵌套循环开始:

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类内的列表中


0
投票

变量名称对您没有帮助。代码在suitsranks上迭代以获取它们的所有组合,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)))
© www.soinside.com 2019 - 2024. All rights reserved.