打印出存储在列表中的对象

时间:2019-11-30 10:36:09

标签: python list loops object

我是Python的新手,正忙着制作二十一点游戏。我几乎可以正确打印出纸牌了,但是似乎无法遍历列表中存储的所有纸牌。

suits = ['Hearts','Diamonds','Spades','Clubs']
ranks = ['Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten','Jack','Queen','King','Ace']
values = {'Two':2, 'Three':3,'Four':4,'Five':5,'Six':6,'Seven':7,'Eight':8,'Nine':9,'Ten':10,'Jack':10,'Queen':10,'King':10,'Ace':(1,11)}

playing = True

class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        print(f"{self.rank} of {self.suit}")

class Deck:

    def __init__(self):
        self.deck = []
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit, rank))

    def __str__(self):
        for card in self.deck:
            return f"{card.rank} of {card.suit}"

deck = Deck()

print(deck)

带返回的输出:

Two of hearts

打印输出:

Two of Hearts
Three of Hearts
Four of Hearts
Five of Hearts
Six of Hearts
Seven of Hearts
Eight of Hearts
Nine of Hearts
Ten of Hearts
Jack of Hearts
Queen of Hearts
King of Hearts
Ace of Hearts etc...plus error

所以我知道 str 的正确语法是使用return而不是打印。但是,如果我使用打印,那么我会得到我想要的一切,所有我的卡片都在牌组中,除了以下错误: str 返回的非字符串(类型NoneType)。如果我使用return,这是正确的语法,那么当我打印纸牌时,所有打印出的就是第一张牌,即两张心。为什么会这样?

2 个答案:

答案 0 :(得分:3)

在一个方法中,return只能执行一次,然后控制返回到调用代码,因此循环内不能有return。一种解决方案是构建要打印的整个字符串,然后将其返回。

如果您将类Deck中的代码更改为:

def __str__(self):
    return "\n".join(f"{card.rank} of {card.suit}" for card in self.deck)

它将返回一个包含整个纸牌的字符串,以便您的打印正常运行。

答案 1 :(得分:1)

您可以使用列表理解来获得所需的纸牌印刷。

[f"{card.rank} of {card.suit}" for card in deck]

此语句将创建一个python列表,其中包含卡组中卡的字符串表示形式。现在,我们可以使用string.join()方法将此字符串列表转换为一个字符串,该方法将列表中的字符串连接起来,并用前面要连接的字符串定界。

"\n".join([f"{card.rank} of {card.suit}" for card in deck])

如果打印出来,您将得到:

Two of Hearts
Three of Hearts
Four of Hearts
Five of Hearts
Six of Hearts
Seven of Hearts
Eight of Hearts
Nine of Hearts
Ten of Hearts
Jack of Hearts
Queen of Hearts
King of Hearts
Ace of Hearts
Two of Diamonds
Three of Diamonds
Four of Diamonds
Five of Diamonds
Six of Diamonds
Seven of Diamonds
Eight of Diamonds
Nine of Diamonds
Ten of Diamonds
Jack of Diamonds
Queen of Diamonds
King of Diamonds
Ace of Diamonds
Two of Spades
Three of Spades
Four of Spades
Five of Spades
Six of Spades
Seven of Spades
Eight of Spades
Nine of Spades
Ten of Spades
Jack of Spades
Queen of Spades
King of Spades
Ace of Spades
Two of Clubs
Three of Clubs
Four of Clubs
Five of Clubs
Six of Clubs
Seven of Clubs
Eight of Clubs
Nine of Clubs
Ten of Clubs
Jack of Clubs
Queen of Clubs
King of Clubs
Ace of Clubs

现在您的完整代码是:

suits = ['Hearts','Diamonds','Spades','Clubs']
ranks = ['Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten','Jack','Queen','King','Ace']
values = {'Two':2, 'Three':3,'Four':4,'Five':5,'Six':6,'Seven':7,'Eight':8,'Nine':9,'Ten':10,'Jack':10,'Queen':10,'King':10,'Ace':(1,11)}

playing = True

class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        print(f"{self.rank} of {self.suit}")

class Deck:
    def __init__(self):
        self.deck = []
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit, rank))

    def __str__(self):
        return "\n".join([f"{card.rank} of {card.suit}" for card in self.deck])

deck = Deck()

print(deck)