国产精品理论片_日韩激情视频一区_91免费版在线看_日韩专区在线_中文字幕国产一区_wwwjizz日本

您現(xiàn)在所在的位置:首頁(yè) >常見問題 > 課程問題 > 奇酷總結(jié):Python學(xué)習(xí)用得到的黑魔法!

奇酷總結(jié):Python學(xué)習(xí)用得到的黑魔法!

來源:奇酷教育 發(fā)表于:

Python用得到的黑魔法當(dāng)然是各種自省和動(dòng)態(tài)綁定了。

  Python用得到的黑魔法當(dāng)然是各種自省和動(dòng)態(tài)綁定了。

  舉個(gè)例子,Python可以重新綁定解釋器的excepthook,這樣當(dāng)程序異常結(jié)束時(shí)就可以做一些自定義的處理,我自己就一直拿這個(gè)配合ipdb進(jìn)行debug。用以下代碼聲明一個(gè)ExceptionHook:

  class ExceptionHook :

  instance = None

  def __call__(self, *args, **kwargs) :

  if self.instance is None:

  from IPython.core import ultratb

  self.instance = ultratb.FormattedTB(mode = "Plain", color_scheme = "Linux", call_pdb = 1)

  return self.instance(*args, **kwargs)

  然后

  import sys

  sys.exceptionhook = ExceptionHook()

  重設(shè)完exceptionhook后,一旦你的代碼拋出異常,整個(gè)解釋器的環(huán)境都會(huì)被ipdb接管,然后就可以像交互模式下那樣使用了。通常我會(huì)在里面查一下棧,把必要的對(duì)象pickle一下,這樣以后復(fù)現(xiàn)錯(cuò)誤也比較容易。

  由于IPython是非GUI的程序,所以即便在SSH里也可以使用這招,完美解決SSH缺少IDE難以debug的窘境。

  動(dòng)態(tài)綁定的另一個(gè)用處,就是當(dāng)程序依賴一個(gè)修改過的庫(kù)時(shí),可以把修改的部分剝離出來,在運(yùn)行時(shí)動(dòng)態(tài)綁定到對(duì)應(yīng)的庫(kù)上去就行。如果修改的是成員方法,需要這樣綁定:

  from types import MethodType

  def _foo(self, ...):

  pass

  obj.foo = MethodType(_foo, obj)

  順帶提一下,pickle也是個(gè)非常好用的工具,盡管序列化并不是python的專利。pickle可以用來保存各種運(yùn)行過程中的對(duì)象:

  import pickle

  pickle.dump(xxx, open("xxx.dump", "w"))

  yyy = pickle.load(open("yyy.dump"))

  pickle可以減少很多工作量,尤其是在復(fù)現(xiàn)bug時(shí),把正確部分的運(yùn)行結(jié)果pickle下來,這樣每次可以從pickle的位置開始運(yùn)行。跑多個(gè)相似的baseline時(shí)也有很好的效果。不足的是pickle比較吃硬盤,pickle一堆東西后很容易就十幾個(gè)G了,而且pickle不能序列化動(dòng)態(tài)生成的對(duì)象,比如lambda表達(dá)式或者上面提到的動(dòng)態(tài)綁定產(chǎn)生的成員方法。

  自省方面,Python可以通過dir()和help()函數(shù)分別取得對(duì)象下成員的列表和幫助,這個(gè)在找不到庫(kù)文檔的時(shí)候非常好用。只要開發(fā)者在函數(shù)下面寫了注釋,就能在help中看到。

  除了上面提到的這些特性,python還有一堆小trick,其他回答里也提到了一些。雖然其中很多是語(yǔ)法糖,不過用好它們可以讓程序更pythonic:

  1 類中用__slots__將成員靜態(tài)化,可以節(jié)省大量?jī)?nèi)存。

  2 裝飾器,常見用途如函數(shù)計(jì)時(shí),亦可用來產(chǎn)生新的函數(shù)簽名。函數(shù)簽名會(huì)影響傳參檢查和ide補(bǔ)全,對(duì)帶不定長(zhǎng)參數(shù)的函數(shù)非常有用。很多庫(kù)中都會(huì)用這種方法來兼容不同版本的API。

  3 生成器,對(duì)于只需遍歷的數(shù)據(jù)可以節(jié)省大量?jī)?nèi)存。

  4 *和**參數(shù)展開。典型的例子是zip(*list_x)和chain(*list_x),分別相當(dāng)于轉(zhuǎn)置和concatenate。

  5 if __name__ == "__main__": 檢查是否作為主程序調(diào)用,用multiprocessing并行時(shí)主程序得用這個(gè)框起來。

  6 enumerate,例如將一個(gè)list變成list2index可以用dict([(x, i) for i, x in enumerate(list_x)])

  7 namedtuple,生成類似于C語(yǔ)言的結(jié)構(gòu)體,同時(shí)支持tuple的所有語(yǔ)法。

  8 defaultdict,做統(tǒng)計(jì)時(shí)不用初始化的dict,可以用lambda實(shí)現(xiàn)嵌套構(gòu)造defaultdict(lambda : defaultdict(int)),甚至遞歸字典tree = lambda : defaultdict(tree)。

主站蜘蛛池模板: 超碰8 | 狠狠视频| 在线观看中文字幕一区二区 | 久久狼人天堂 | 欧美视频精品 | 日韩在线免费电影 | 日本一级淫片免费啪啪3 | 日韩成人 | 欧美一区二区视频 | 特级毛片 | av手机在线| 欧美日韩视频在线第一区 | 最新av在线网址 | 亚洲视频中文字幕 | 久草在线| 久久日韩精品一区二区三区 | 日韩欧美国产精品一区二区三区 | 男人天堂av网站 | 国产精品18hdxxxⅹ在线 | 午夜99 | 黄免费观看视频 | 国产三区在线观看视频 | 一区二区三区免费观看 | 久久久久国产精品免费免费搜索 | 成人一区二区视频 | 午夜免费电影 | 成人在线中文字幕 | 成人在线中文 | www.日本精品 | 97视频在线免费 | 欧美精品一区三区 | 久久9精品| 欧美一级全黄 | 国产精品入口麻豆www | 精品在线一区二区三区 | 色妹子综合网 | 中文字幕av一区 | 一呦二呦三呦国产精品 | h视频在线免费看 | 欧美日韩国产三级 | 欧美天堂在线 |