这是我从ThinkPython书中PokerHand
练习的官方解决方案中无法掌握的最后一段代码:
和
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()
操作的类方法。
字典的值是类对象。
那个代码只是在该类的对象上执行该类的方法吗?它是一个非常简洁的代码表达式,对我来说有点难以理解。
答案 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()
实例。这样可以更容易地测试是否存在同花顺,同一套装中的一系列有序卡片。