1. 程式人生 > >fluent Python 讀書筆記(一)

fluent Python 讀書筆記(一)

從今天開始閱讀這本Python中幾乎是必讀的進階書籍。

第一章:資料模型

1.1 一摞Python風格的紙牌

在這一章中,主要有以下知識點:

1.如何快速利用collections模組建立一個沒有方法的class

import collections
Card = collections.namedtuple('Card',['rank','suit'])
 

這樣就建立了一個叫Card的類,後面的list對應屬性名,

a = Card('7','hearts')

a.rank = 7

a.suit = hearts

2.用2個for迴圈建立一個listcomprehension

class FrenchDeck:
    ranks = [str(n) for n in range(2,11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

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

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]
當出現2個for時 指標應該先遍歷所有的self.suits 再 取下一個rank。

3.怎樣造一個類,它能迭代,能choice,能用len()求長度

class FrenchDeck:
    ranks = [str(n) for n in range(2,11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

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

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]

deck = FrenchDeck()
for card in deck:
    print(card)

4.in 也是一個迭代

可以輸入類似

Card('Q','hearts') in deck , idle 會給True

5.__getitem__() 賦予你這個例項能訪問資料的能力,也同時就能切片了

6.這個類就像一個list一樣,可以被sorted, 甚至加了key方法的sorted。

def spades_high(card):
    rank_value = FrenchDeck.ranks.index(card.rank)
    return rank_value*len(suit_values) + suit_values[card.suit]

for card in sorted(deck, key=spades_high):
    print(card)