【问题标题】:How to iterate through a list object inside a class object如何遍历类对象内的列表对象
【发布时间】:2021-11-30 18:19:31
【问题描述】:

我正在编写一个玩二十一点的脚本,但无法解决我今晚遇到的一个缺陷。基本上,我试图遍历一个类中存在的列表对象。在我的测试用例中,我总是可以让它打印第一张卡片(即红心五),但不能打印剩下的两张。

以下是相关代码:

class Card:

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

    def __str__(self):
        return self.rank + " of " + self.suit

class Play_Pile:

    def __init__(self,pile_owner):
        self.pile_owner = pile_owner
        self.pile_cards = []
        self.pile_state = "NORM"

    def add_card(self,new_card):
        self.pile_cards.append(new_card)

    #THE FIRST IF STATEMENT AND ITS FOR LOOP ARE DEFECTIVE IN THE CONTEXT OF THE TEST CASE
    def __str__(self):
        if self.pile_owner == "HUMAN":
            for card in self.pile_cards:
                return card.rank + " of " + card.suit + "\n"
        elif self.pile_owner == "COMPY":
            return self.pile_cards[0].rank + " of " + self.pile_cards[0].suit

这是 Unittest 测试用例:

#module references
import unittest
import blackjack

class PlayPile_Display_Test(unittest.TestCase):
        playpile_instance = blackjack.Play_Pile("HUMAN")

        card_1 = blackjack.Card("Hearts", "Five")
        card_2 = blackjack.Card("Spades", "Five")
        card_3 = blackjack.Card("Spades", "Ace")

        playpile_instance.add_card(card_1)
        playpile_instance.add_card(card_2)
        playpile_instance.add_card(card_3)

        print(playpile_instance)

if __name__ == '__main__':
    unittest.main(verbosity = 2)

让我知道我在列表中缺少什么以及如何在类中遍历它们?

【问题讨论】:

    标签: python list loops class iterable


    【解决方案1】:

    您遍历列表,但立即返回值。 你需要把字符串累加,然后返回结果。

    str = ""
    for card in self.pile_cards:
        str += card.rank + " of " + card.suit + "\n"
    return str
    

    【讨论】:

    • 永远不要使用内置关键字作为变量名..
    【解决方案2】:

    你需要累积你为每张卡片构建的字符串,还要使用你定义的Card.__str__,而不是再次编写卡片表示逻辑(X of Y)

    def __str__(self):
        if self.pile_owner == "HUMAN":
            result = ""
            for card in self.pile_cards:
                result += str(card) + "\n"
            return result
        elif self.pile_owner == "COMPY":
            return str(self.pile_cards[0])
    

    "\n".join 也可以很好地做到这一点

    def __str__(self):
        if self.pile_owner == "HUMAN":
            return "\n".join(map(str, self.pile_cards))
        elif self.pile_owner == "COMPY":
            return str(self.pile_cards[0])
    

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多