Python 隨筆

1 函數(shù)默認(rèn)參數(shù)的陷阱

代碼示例:

def defaultPara(item, l=[]):
    l.append(item)
    print l
    
defaultPara('1')
# ['1']

defaultPara('2', ['4', '5'])
# ['4', '5', '2']

defaultPara('3')
# ['1', '3']

上面的第三次調(diào)用,函數(shù)不是使用一個(gè)空數(shù)組作為參數(shù)旱物,而是使用了與第一次調(diào)用時(shí)相同的數(shù)組宵呛。簡(jiǎn)言之,在Python里函數(shù)的默認(rèn)參數(shù)是在函數(shù)定義時(shí)就定義了,而不是在每次調(diào)用函數(shù)時(shí)新生成码秉,因此當(dāng)默認(rèn)參數(shù)為可變參數(shù)時(shí)转砖,其行為可能與我們想象得有出入鲸伴,需要注意。
更加詳細(xì)的討論:Python函數(shù)參數(shù)默認(rèn)值的陷阱和原理深究](http://cenalulu.github.io/python/default-mutable-arguments/)姓赤。

2. GIL

GIL(Global Interpreter Lock)仲吏,是在實(shí)現(xiàn)Python解析器(CPython)時(shí)所引入的一個(gè)概念裹唆。(也就是說它不是python語言的特性,而是實(shí)現(xiàn)解析器(CPython)時(shí)引入的一個(gè)坑)
GIL的存在讓Python看起來只是一個(gè)偽多線程岖食,因?yàn)樗皃revents multiple native threads from executing Python bytecodes at once”舞吭。
Python的多線程在多核CPU上,只對(duì)于IO密集型計(jì)算產(chǎn)生正面效果蔑穴;而當(dāng)有至少有一個(gè)CPU密集型線程存在存和,那么多線程效率會(huì)由于GIL而大幅下降。
更加詳細(xì)的討論:Python的GIL是什么鬼捐腿,多線程性能究竟如何

3. 變長(zhǎng)參數(shù)

當(dāng)函數(shù)的參數(shù)不確定時(shí)茄袖,可以使用*args 和**kwargs嘁锯,如:def myfun1(username, *keys)或def myfun2(username, **keys)等聂薪。
* 用來傳遞任意個(gè)無名字參數(shù)蝗羊,這些參數(shù)會(huì)一個(gè)Tuple的形式訪問;
**用來處理傳遞任意個(gè)有名字的參數(shù)翔悠,這些參數(shù)用dict來訪問涯呻。

4. 類的繼承

MRO:Method Resolution Order
目前采用的是C3算法,它保證了兩點(diǎn):

  • 單調(diào)性
    C繼承B涝登,B繼承A胀滚,則MRO鏈應(yīng)符合C->B->A的順序
  • 重寫問題
# 新式類
class A(object):
    def foo(self):
        print 'A'

class B(A):
    pass
    
class C(A):
    def foo(self):
        print 'C'

class D(B, C):
    pass
    
d = D()
d.foo()
# C

可見C3算法保持了DFS和BFS的優(yōu)點(diǎn)乱投。
C3算法:

  • L[object] = [object]
  • L[C(B1…BN)] = [C] + merge(L[B1]…L[BN], [B1]…[BN])

merge過程:

  • 檢查第一個(gè)列表的頭元素(如 L[B1] 的頭)戚炫,記作 H。
  • 若 H 未出現(xiàn)在其它列表的尾部施掏,則將其輸出茅糜,并將其從所有列表中刪除蔑赘,然后回到步驟1;否則耙箍,取出下一個(gè)列表的頭部記作 H酥馍,繼續(xù)該步驟。
  • 重復(fù)上述步驟卤材,直至列表為空或者不能再找出可以輸出的元素扇丛。如果是前一種情況帆精,則算法結(jié)束;如果是后一種情況卓练,說明無法構(gòu)建繼承關(guān)系襟企,Python 會(huì)拋出異常狮含。

super()
Python的多繼承類是通過MRO的方式來保證各個(gè)父類的函數(shù)被逐一調(diào)用,而且保證每個(gè)父類函數(shù)只調(diào)用一次(如果每個(gè)類都使用super)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市映胁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌解孙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穷遂,死亡現(xiàn)場(chǎng)離奇詭異蚪黑,居然都是意外死亡中剩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郊愧,“玉大人,你說我怎么就攤上這事眠寿。” “怎么了盒发?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)奢浑。 經(jīng)常有香客問我雀彼,道長(zhǎng)详羡,這世上最難降的妖魔是什么实柠? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任水泉,我火速辦了婚禮,結(jié)果婚禮上窒盐,老公的妹妹穿的比我還像新娘草则。我一直安慰自己,他們只是感情好蟹漓,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布炕横。 她就那樣靜靜地躺著,像睡著了一般葡粒。 火紅的嫁衣襯著肌膚如雪份殿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天嗽交,我揣著相機(jī)與錄音卿嘲,去河邊找鬼。 笑死夫壁,一個(gè)胖子當(dāng)著我的面吹牛拾枣,可吹牛的內(nèi)容都是我干的司蔬。 我是一名探鬼主播葱她,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼黔寇!你這毒婦竟也來了颊郎?” 一聲冷哼從身側(cè)響起姆吭,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤昆淡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后眨补,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吊履,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虹脯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歇拆,到底是詐尸還是另有隱情谐区,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布盗迟,位于F島的核電站,受9級(jí)特大地震影響黔衡,放射性物質(zhì)發(fā)生泄漏夜牡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胀溺。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壹若,卻和暖如春啊犬,著一層夾襖步出監(jiān)牢的瞬間语御,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工骨田, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悠汽。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓慨亲,卻偏偏與公主長(zhǎng)得像蛉签,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 一揭朝、Python有很好的開源模塊慎式,但是模塊能做什么事情,可以使用dir()去查看模塊下包含什么方法 例如 引入 i...
    小小看護(hù)閱讀 174評(píng)論 0 0
  • 先上一段代碼,來源是github。 上面這一段代碼盔沫,乍看挺神奇的谴忧,Borg 的各個(gè)實(shí)例共享了state等脂。實(shí)現(xiàn)起來也...
    辰辰沉沉沉閱讀 9,476評(píng)論 2 6
  • 首先要將linux源轉(zhuǎn)換為國內(nèi)辣恋,自選為阿里云的源。 然后安裝python3 apt-get install pyt...
    GypsyDanger閱讀 638評(píng)論 0 0
  • 從SocketServer 講起 整個(gè)模塊的結(jié)構(gòu)大概是這樣的,由BaseServer衍生出TCPServer,UD...
    辰辰沉沉沉閱讀 444評(píng)論 0 1
  • 最近在學(xué)習(xí)Python单默,說來慚愧耕皮,工作幾年后才發(fā)現(xiàn)對(duì)編程也挺感興趣粱年,上學(xué)時(shí)候也有一些零星的編程基礎(chǔ),現(xiàn)在學(xué)起來也不...
    kevin282閱讀 224評(píng)論 0 1