以下Python行如何正常工作? d.setdefault(c.suit,PokerHand())。add_card(c)

时间:2017-10-27 09:42:32

标签: python

这是我从ThinkPython书中PokerHand练习的官方解决方案中无法掌握的最后一段代码:

card.py

PokerHandSoln.py

def has_straightflush(self):
    """Checks whether this hand has a straight flush.

    Better algorithm (in the sense of being more demonstrably
    correct).
    """
    # partition the hand by suit and check each
    # sub-hand for a straight
    d = {}
    for c in self.cards:
        d.setdefault(c.suit, PokerHand()).add_card(c)
        print '\n', c.suit, '\n', d[c.suit]
    wait = raw_input()

    # see if any of the partitioned hands has a straight
    for hand in d.values():
        if len(hand.cards) < 5:
            continue
        hand.make_histograms()
        if hand.has_straight():
            return True
    return False
打印和等待是我的,试图找出它的作用。

我写了自己的解决方案,但当然它与作者的解决方案不同。 我的解决方案经过一些调试后仍有效,但我正在研究作者的官方解决方案。自我启动和Python新手在这里

我了解setdefault的工作原理,但不是add_card方法。 add_card方法是执行append()操作的类方法。 字典的值是类对象。

那个代码只是在该类的对象上执行该类的方法吗?它是一个非常简洁的代码表达式,对我来说有点难以理解。

1 个答案:

答案 0 :(得分:0)

dict.setdefault() 返回给定键的值(如果缺少键,则可选择首先设置默认值)。

d.setdefault(c.suit, PokerHand()).add_card(c)表达式确保c.suit键有值,并返回该值。默认值为PokerHand(),是定义add_card()方法的类的实例。

将其拆分为两个语句,如果这样可以更容易阅读:

hand_for_suit = d.setdefault(c.suit, PokerHand())
hand_for_suit.add_card(c)

最后,你将卡片分组到手中;所有钻石卡,所有心形,所有俱乐部和所有黑桃都分为一个单独的PokerHand()实例。这样可以更容易地测试是否存在同花顺,同一套装中的一系列有序卡片。