在类之间迭代print()

2024-05-14 18:44:47 发布

您现在位置:Python中文网/ 问答频道 /正文

21点游戏。 我定义了以下类:

class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
    def __str__(self):
        return ('{} of {},'
                .format(self.rank,self.suit))
class Deck:
    def __init__(self):
        self.deck = []  # starting with empty list
        for suit in suits:
            for rank in ranks:
                self.deck.append(Card(suit,rank))
    def deal(self):
        return self.deck.pop(0) //I'm dealing a card and taking
                                  him out of the deck
class Hand:
    def __init__(self):
        self.cards = []  //start with emptpy list and add Cards objects

    def add_card(self,card):
        self.cards.append(card)

    def __str__(self):
        for i in self.cards:
            return (f"{i}")

我正在创建一个新的牌组,希望使用deal()方法附加到庄家的手上并打印庄家的手:

GameDeck = Deck()
DealerHand = Hand()
DealerHand.add_card(GameDeck.deal())

我正在打印经销商的手很好:

print(DealerHand)

输出:5个♥

当我从牌组中处理另一张牌时,问题开始了:

DealerHand.add_card(GameDeck.deal())
print(DealerHand)

我得到了同样的结果:5个♥.

解包后,它看起来像self.hand(我正试图打印的内容)由2个卡片类组成(没关系),但是管理只打印第一个,因为它将返回到card类中的str方法,而不会移动到self.cards列表中的第二个iterable I:

从手工课,没能移动到下一个i并打印出来

def __str__(self):
        for i in self.cards:
            return (f"{i}")

你知道为什么它只打印self.cards列表中的第一个对象吗


Tags: inselfaddforreturndefcardclass
2条回答

您的__str__函数在for循环内返回,它只在一次迭代后终止循环。相反,您希望返回整个卡片列表的字符串表示形式。像这样的

def __str__(self):
    return ", ".join(self.cards)

return语句立即返回给定的表达式,因此退出函数。因此,这样的事情不会产生预期的效果:

def __str__(self):
    for i in self.cards:
        return (f"{i}")

__str__方法需要返回单个字符串。例如,如果您想返回一个卡片字符串,所有卡片都在自己的行中,您可以先创建该字符串,然后返回它:

def __str__(self):
    return_value = ""
    for card in self.cards:
        return_value += card + "\n"

或者用一个单一的、惯用的表达加入卡片str.join将给定的iterable字符串与给定的字符串连接起来(在本例中,是换行符:\n):

def __str__(self):
    return "\n".join(self.cards)

相关问题 更多 >

    热门问题