《流暢的python之數據模型》

《流暢的python》一書是python入門之后進階的一本好書。它不是一本完備的python手冊,而是強調python作為編程語言獨有的特性。這些特性或者是python獨有的,或者是其它編程語言里很少見的。在接下來的一段時間,我會整理這本書的筆記,大家相互學習,共同進步。

一、pythonic風格的代碼是什么樣的?

最簡單的兩個變量a,b交換value:

其它語言大部分需要用到臨時變量,例如:

$a = 100;

$b = 200;

$c = $a;

$b = $a;

$a = $c;

echo $a,$b;#200100

$a 與$b交換值,需要借助臨時$c來實現。如果是python呢?

a,b = 100,200

a,b = b,a

print(a,b)#200 100

對,這就是pythonic的代碼,是不是很簡單易讀?來個更直觀的栗子:

定義一副撲克牌

import collections

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

class FrenchDeck:

rank = [str(i) for i in range(2,11)]+'JQKA'

suit = 'spades diamonds clubs hearts'.split()

def __init__(self):

self._cards = [Card(rank,suit) for suit in self.suit for card in self.rank]

def __len__(self):

return len(self._cards)

def __getitem__(self,position):

return self._cards[position]

短短十來行代碼就定義 了一副撲克牌,是不是覺得很輕松呢?

注意:collections.namedtuple()方法用以構建只有少數屬性沒有方法的對象,例如數據庫條目。在python2中定義一個類需要顯式的繼承object,定義類名時需要FrenchDeck(object)繼承的父類,python3則默認繼承object不用再寫object了。

python定義列表的特別之處莫過于它的列表生成式了,簡單明了, 敲起來也方便。其中:

rank = [str(i) for i in range(2,11)]+'JQKA'

使用列表生成式定義了撲克牌中的2~A

suit = 'spades diamonds clubs hearts'.split()

定義了撲克牌的四種花色

self._cards = [Card(rank,suit) for suit in self.suit for card in self.rank]

再次使用列表生成式將花色與點數組合起來。其實三行代碼已經將撲克牌定義完了,列表生成式的優點就在于可以用極短的代碼,完成列表的創建。假設使用迭代的方式定義這副撲克牌,很顯然,代碼就不會是三行了。

好了,既然有了一副撲克牌,那我們就要來賭點大的了。

#1.紙牌數量

#因為我們重新定義了特殊方法__len__,當我們需要紙牌數量的時候直接使用len()方法就可以。

#特殊方法的存在是給python解釋器使用的,你不需要調用它們,也就是說沒有my_obj.__len__()這種寫法,

#而應該使用len(my_obj),在執行len(my_obj)的時候,如果my_obj是你自己定義的對象,那么python會去

#調用由你實現的__len__方法

deck = FrenchDeck()

print(len(deck))#52

#抽取第一張或者最后一張

deck[0]或deck[-1]

#隨機抽取一張

from random import choice

choice(deck)

#由于__getitem__方法把[]操作交給了self._cards列表,所以deck支持切片和迭代操作

#取出四張A(切片)

deck[12::13]

#迭代

for card in deck:

print(card)

#反向迭代

for card in reversed(deck):

print(card)

#排序(升序)

suit_value = dict(spades=3,hearts=2,diamonds=1,clubs=0)

def spades_high(card):

rank_value = FrenchDeck.rank.index(card.rank)

return rank_value * len(suit_value) + suit_value[card.suit]

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

print(card)

二、python中的特殊方法

如__getitem__這些帶雙下劃線的方法,我們稱之為特殊方法,特殊方法的存在是為了被解釋器調用的,你自己并不需要調用它們。很多時候,特殊方法的調用是隱式的,例如循環語句,for i in x:這個語句,背后其實使用的是iter(x),而這個函數的背后是x.__iter__()方法,當然,前提是__iter__這個方法被實現了。

通常來說,代碼無需直接使用特殊方法。除非有大量的元編程存在,直接調用特殊方法的頻率應該遠遠低于你去實現它們的次數。唯一例外的可能是__init__方法,你的代碼里可能經常會用到它,目的是在你自己的子類的__init__方法中調用超類的構造器。

此外,不要自己想當然的隨意添加特殊方法,比如__foo__之類。因為雖然現在這個名字沒有被python內部使用,以后就不一定了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • The Python Data Model If you learned another object-orien...
    plutoese閱讀 1,750評論 0 51
  • 讀《傳習錄》書正憲扇感悟 今人病痛大斷只是傲,千罪百惡皆從傲上來。 傲則自高自是不肯屈下人 那么我們想一想,我們自...
    拾貳樓閱讀 135評論 0 0
  • 孩子,是上天賜予每個母親最甜蜜的禮物,懷孕時的焦慮,不適,生產時的苦痛折磨,產子后的種種心酸,可這些都抵不過孩子...
    云隱霧輕閱讀 205評論 0 0
  • 我旅行是因為喜歡到處走動,我享受旅行給我的自由感覺,我很高興擺脫羈絆、責任和義務,我喜愛未知事物;我結識一些不...
    苦苦掙扎著閱讀 215評論 0 2