標籤:

第一章 Python數據模型

這一章的內容比較雜糅,作者開始介紹了Python內的特殊方法(魔法方法):n關於魔法方法,大家可以看看這裡:pyzh.readthedocs.io/en/

在第一章節中,作者強調了 「Python風格 無處不在」,n也就是說,寫出更加優雅、高效的Python代碼,是這本書的主要宗旨之一。

Python風格的紙牌

作者在第一章里,直接使用了魔法方法,n來建立一個 具有 「Python風格」的紙牌類型。

import collectionsnnCard = collections.namedtuple(Card, [rank, suit])nnnclass FrenchDeck():n ranks = [str(n) for n in range(2, 11)] + list(JQKA) # 生成紙牌的序號n suits = spades diamons clubs hearts.split()nn def __init__(self,):n n 初始化一整套法式紙牌n n self._cards = [Card(rank, suit) for suit in self.suitsn for rank in self.ranks]nn def __len__(self):n n 返回這一套卡組的長度n n return len(self._cards)nn def __getitem__(self, position):n n 返回卡組的位置n 方便Python對其進行切片的操作n 並且使得這個Card對象時一個可迭代的對象n n return self._cards[position]nnn# 表明不同花色的值nsuit_values = dict(spades=3, hearts=2, diamons=1, clubs=0)nnndef sort(card):n n 對card的順序,按照花色進行排序n n rank_value = FrenchDeck.ranks.index(card.rank)n return rank_value * len(suit_values) + suit_values[card.suit]n n# 生成一張黑桃2nCard(2,spade)nn# 生成一組法式紙牌ndeck = FrenchDeck()nn# 列印出所有的紙牌nprint(deck._cards)nn# 列印出紙牌的個數nprint(len(deck))nn# 迭代輸出紙牌nfor card in deck:n print(card)nn# 按照花色排序輸出紙牌nfor card in sorted(deck,key=sort):n print(card)n

這個例子里,作者使用了我們不常用的「命名元組」n實際上的效果也很棒,n如果對其中的語法看不太明白,可以嘗試自己動手測試一下。

第一章小結

  • 通過視線特殊的方法,自定義的數據類型就能表現的和內置類型一樣,n這就幫助我們寫出更具表達力的風格的代碼,也就是更加具有Python風格的代碼。
  • Python對象的一個基本要求就是他要有合理的字元串的表現形式。我們可以通過__repr__和__str__方法n來滿足這個需求,前者更方便我們調試和記錄日誌,而後者則是給終端用戶看的,
  • 對序列的數據類型模擬是特殊方法用的最多的地方,這一點我們在「Python風格的紙牌」中有所展示

總之,我們還是會在之後的章節里介紹和使用更多的魔法方法

推薦閱讀:

anaconda中如何安裝keras?
好像發現了一個不錯的小工具
python中如何使用requests模塊下載文件並獲取進度提示?
如何利用Python抓取PDF中的某些內容?

TAG:Python |