《流暢的python之數(shù)據(jù)模型》

《流暢的python》一書是python入門之后進階的一本好書险胰。它不是一本完備的python手冊弦悉,而是強調(diào)python作為編程語言獨有的特性夕凝。這些特性或者是python獨有的噪沙,或者是其它編程語言里很少見的昂芜。在接下來的一段時間别伏,我會整理這本書的筆記蹄衷,大家相互學習,共同進步厘肮。

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

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

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

$a = 100;

$b = 200;

$c = $a;

$b = $a;

$a = $c;

echo $a,$b;#200100

$a 與$b交換值类茂,需要借助臨時$c來實現(xiàn)耍属。如果是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()方法用以構(gòu)建只有少數(shù)屬性沒有方法的對象,例如數(shù)據(jù)庫條目。在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]

再次使用列表生成式將花色與點數(shù)組合起來刨仑。其實三行代碼已經(jīng)將撲克牌定義完了郑诺,列表生成式的優(yōu)點就在于可以用極短的代碼,完成列表的創(chuàng)建杉武。假設使用迭代的方式定義這副撲克牌辙诞,很顯然,代碼就不會是三行了轻抱。

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

#1.紙牌數(shù)量

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

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

#而應該使用len(my_obj),在執(zhí)行l(wèi)en(my_obj)的時候,如果my_obj是你自己定義的對象蘸秘,那么python會去

#調(diào)用由你實現(xiàn)的__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__這些帶雙下劃線的方法醋虏,我們稱之為特殊方法寻咒,特殊方法的存在是為了被解釋器調(diào)用的,你自己并不需要調(diào)用它們颈嚼。很多時候仔涩,特殊方法的調(diào)用是隱式的,例如循環(huán)語句粘舟,for i in x:這個語句熔脂,背后其實使用的是iter(x),而這個函數(shù)的背后是x.__iter__()方法,當然柑肴,前提是__iter__這個方法被實現(xiàn)了霞揉。

通常來說,代碼無需直接使用特殊方法晰骑。除非有大量的元編程存在适秩,直接調(diào)用特殊方法的頻率應該遠遠低于你去實現(xiàn)它們的次數(shù)绊序。唯一例外的可能是__init__方法,你的代碼里可能經(jīng)常會用到它秽荞,目的是在你自己的子類的__init__方法中調(diào)用超類的構(gòu)造器骤公。

此外,不要自己想當然的隨意添加特殊方法扬跋,比如__foo__之類阶捆。因為雖然現(xiàn)在這個名字沒有被python內(nèi)部使用,以后就不一定了钦听。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洒试,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朴上,更是在濱河造成了極大的恐慌垒棋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痪宰,死亡現(xiàn)場離奇詭異叼架,居然都是意外死亡,警方通過查閱死者的電腦和手機衣撬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門乖订,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淮韭,你說我怎么就攤上這事√欤” “怎么了靠粪?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毫蚓。 經(jīng)常有香客問我占键,道長,這世上最難降的妖魔是什么元潘? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任畔乙,我火速辦了婚禮,結(jié)果婚禮上翩概,老公的妹妹穿的比我還像新娘牲距。我一直安慰自己,他們只是感情好钥庇,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布牍鞠。 她就那樣靜靜地躺著,像睡著了一般评姨。 火紅的嫁衣襯著肌膚如雪难述。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音胁后,去河邊找鬼店读。 笑死,一個胖子當著我的面吹牛攀芯,可吹牛的內(nèi)容都是我干的屯断。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼敲才,長吁一口氣:“原來是場噩夢啊……” “哼裹纳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起紧武,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤剃氧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阻星,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朋鞍,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年妥箕,在試婚紗的時候發(fā)現(xiàn)自己被綠了滥酥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡畦幢,死狀恐怖坎吻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宇葱,我是刑警寧澤瘦真,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站黍瞧,受9級特大地震影響诸尽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜印颤,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一您机、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧年局,春花似錦际看、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兴喂,卻和暖如春蔼囊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酱酬。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工膳沽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挑社,地道東北人巡揍。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像阱当,于是被迫代替她去往敵國和親糜工。 傳聞我的和親對象是個殘疾皇子弊添,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

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