《流暢的python》讀書筆記(1)

第一章 Python數據模型

1.1一摞Python風格的紙牌

import collections
from random import choice
from functools import reduce
# 首先:什麼是collections
# Python中的基本數據結構有list,dict,tuple,set
# collection模塊額外提供了幾種高級數據類型:
# namedtuple():生成可以使用名字來訪問元素內容的tuple子類
# deque:雙端隊列,可以快速的從另外一側追加和推出對象
# counter:計數器
# ordereddict:有序字典
# defaultdict:帶有默認值的字典
# 本代碼用到的是nametuple tuple是不可變集合,nametuple用來創建一個自定義的
# tuple對象並且規定了tuple元素的個數,可通過屬性而不是索引來引用tuple的某個元素,
# 我們可以通過namedtuple很方便的自定義一個數據類型,
# 它具有tuple的不變屬性又可以根據屬性來引用


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


class FrenchDeck:
    # 創建一個列表  包含2-11的數字 以及 J Q K A四個字母 作爲撲克牌的數字
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    # 通過split生成一個花色列表
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        # 創建一個Card列表 每一個Card代表一張紙牌 通過for循環實現 rank 和 suit的賦值
        self.cards = [Card(rank, suit) for suit in self.suits
                      for rank in self.ranks]

    def __len__(self):
        # 重寫雙下方法__len__ 調用len()時 len調用該類的__len__
        return len(self.cards)

    def __getitem__(self, position):
        # 重寫__getitem__雙下方法
        return self.cards[position]


# 實現按照 2 - A 黑 紅 塊 花 進行排序的規則
# 創建一個字典 爲各花色賦權值
suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)
def spades_high(card):
    return_value = FrenchDeck.ranks.index(card.rank)
    # print(return_value)
    # print(return_value * len(suit_values) + suit_values[card.suit])
    #按照 rank * 字典長度 + 花色權值  的大小進行排序
    return return_value * len(suit_values) + suit_values[card.suit]


if __name__ == '__main__':
    beer_card = Card('7', 'diamonds')
    print(beer_card)
    deck = FrenchDeck()
    print(deck.ranks)
    print(deck.suits)
    # 輸出第一張紙牌
    print(deck[0])

    # 調用Python內置的方法從一個序列中隨機選出一個元素的函數 random.choice
    # 隨機抽取一張紙牌   重寫雙下方法可以更方便的使用Python的標準庫
    print(choice(deck))
    # __getitem__方法 將隊列表的操作交給了self.cards 可以這樣理解
    # 對deck進行類似列表的切片操作時 會調用__getitem__方法 而該方法
    # 進行了重寫 返回了self.cards[position]因此可以進行列表的操作
    print(deck[:3])

    # 先抽出索引是12的牌,然後每隔13張牌抽出一張 就取到了所有牌面是A的牌
    print(deck[12::13])

    # 僅僅實現了__getitem方法,這一摞牌就成爲可迭代的
    for card in deck:
        print(card)

    # 迭代是隱式的,若一個集合類型未實現__contains__方法
    # 那麼in運算 會隱式的進行迭代進行 搜索,
    # 而deck 是可迭代的 所以 in運算符 可以用於該對象
    print(Card('Q', 'hearts') in deck)

    # 此處有一個排序的知識點
    # sorted() 函數對所有可迭代的對象進行排序操作。sort 與 sorted 區別:
    # sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。
    # list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,
    # 而內建函數 sorted 方法返回的是一個新的 list,
    # 而不是在原來的基礎上進行的操作。
    # sorted 語法:
    # sorted(iterable, cmp=None, key=None, reverse=False)
    # iterable -- 可迭代對象。
    # cmp -- 比較的函數,這個具有兩個參數,參數的值都是從可迭代對象中取出,
    # 此函數必須遵守的規則爲,大於則返回1,小於則返回-1,等於則返回0。
    # key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序。
    # reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
    # 返回值 :返回重新排序的列表。
    # key = spades_high 是按照這個規則進行排序
    for card in sorted(deck, key=spades_high):
        print(card)


    #另有學lambda時 遇到的reduce函數
    foo = [1,2,3]
    #實現累加求和
    print(reduce(lambda x,y:x+y,foo))   #輸出6


關於lambda表達式的一位大佬所寫的博客
關於Python中的lambda,這篇閱讀量10萬+的文章可能是你見過的最完整的講解

發佈了35 篇原創文章 · 獲贊 6 · 訪問量 2637
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章