Python Tips閱讀摘要

發(fā)現(xiàn)了一本關于Python精通知識點的好書《Python Tips》截碴,關于Python的進階的技巧汹胃。摘錄一些比較有價值的內(nèi)容作為分享鸟妙。

*args and **kwargs

在函數(shù)定義的時候我們經(jīng)撑铮看到*args和 *kwargs這兩個定義對象。*args代表了函數(shù)定義中所有non-keyworded(這個詞實在很難翻譯)的傳入?yún)?shù)芍锚,而*kwargs代表的所有帶有keyworded的傳入?yún)?shù),舉個栗子:

def test_var_args(*args, **kwargs):
    print("args:{0}, kwargs:{1}".format(args,kwargs))
test_var_args(1,2,3)
>>>args:(1, 2, 3), kwargs:{}
test_var_args(a=1,b=2,c=3)
>>>args:(), kwargs:{'a': 1, 'c': 3, 'b': 2}

通過這個栗子我們可以清晰地區(qū)分keyworded和non-keyworded的區(qū)別了蔓榄。本質(zhì)上來說并炮,args是一個數(shù)組,kwargs是一個字典甥郑。
args and *kwargs 最常用于裝飾器逃魄,也可以用于monkey patching(猴子補丁)澜搅,用來在運行時動態(tài)修改已有的代碼伍俘,而不需要修改原始代碼。

  • monkey patching
    monkey patch指的是在運行時動態(tài)替換,一般是在startup的時候.
    用過gevent就會知道,會在最開頭的地方gevent.monkey.patch_all();把標準庫中的thread/socket等給替換掉.這樣我們在后面使用socket的時候可以跟平常一樣使用,無需修改任何代碼,但是它變成非阻塞的了.
    應用場景包括店展,一個已經(jīng)定義好的函數(shù)被大量的引用养篓,如果后面需要替換這個函數(shù)的話,直接在函數(shù)入口處進行替換即可赂蕴。舉個栗子柳弄,將ujson代替json:
main.py

import json  
import ujson  
def monkey_patch_json():  
    json.__name__ = 'ujson'  
    json.dumps = ujson.dumps  
    json.loads = ujson.loads  

monkey_patch_json()  
print 'main.py',json.__name__  
import sub  

======================
sub.py

import json  
print 'sub.py',json.__name__

可以看到json在該模塊中被完美替換,這個方法也可以用來做單元測試使用概说。

Generators生成器

首先區(qū)分Iterable碧注、Iterator和Iteration三個概念:任何具有iter()或getitem()方法的對象,Python就認為它是一個iterable糖赔;使用內(nèi)置的iter()函數(shù)來生成iterator萍丐,iterator可以通過next()方法來獲取下一個元素。iterator遍歷元素的過程可以認為iteration放典。
生成器同樣是可迭代對象逝变,但是你只能讀取一次基茵,因為它并沒有把所有值存放內(nèi)存中,它動態(tài)的生成值壳影。
Yield是關鍵字拱层, 用起來像return,yield在告訴程序宴咧,要求函數(shù)返回一個生成器根灯,舉個栗子:

def createGenerator():
    my_list=range(3)
    for  i in my_list:
        yield i*i
gen= createGenerator() 
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen)) #StopIteration

Map, Filter and Reduce

  • map
    Map的定義是將某函數(shù)處理所有輸入?yún)?shù),其定義為:

map(function_to_apply, list_of_inputs)

例如:

items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
當時這兩者還可以通過lambda表達式進行多個函數(shù)處理同一個輸入的情況掺栅,這是一個非常美妙的轉(zhuǎn)換烙肺,栗子如下:

def multiply(x):
    return (x*x)
def add(x):
    return (x+x)

funcs = [multiply, add]
for i in range(5):
    value = list(map(lambda x: x(i), funcs))
    print(value)

# Output:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]

神奇的事情發(fā)生了,兩個函數(shù)對于同一個輸入?yún)?shù)都進行處理氧卧,并返回在了結果中桃笙。

  • filter

filter(function_to_apply, list_of_inputs)

在大部分的情況下map和filter都可以通過list/dict/tuple Comprehensions來實現(xiàn)。
List Comprehensions語法:[expr for iter_var in iterable] 或 [expr for iter_var in iterable if cond_expr]
L = [expr for iter_var in iterable]:for iter_var in iterable的作用是依次取 iterable賦值給iter_var假抄,而expr for iter_var in iterable的作用就是依次取值給iter_var怎栽,expr做運算后,繼續(xù)循環(huán)宿饱,expr運算得到的值賦給變量L

map

map(function_to_apply, list_of_inputs)

通過函數(shù)對于結果進行處理熏瞄,并返回聚集結果。例如:

from functools import reduce
product = reduce((lambda x, y: x * y), [1, 2, 3, 4])

# Output: 24

Collections

Collections包括幾個常用的數(shù)據(jù)結構:

  • defaultdict : 是dict的子類谬以,實現(xiàn)了dict的所有方法强饮,功能使用上與dict.setdefault()類似,但是defaultdict構建時給出默認值为黎。
  • orderdict:dict自排序邮丰。
  • counter:計數(shù)器,可以對iterator計數(shù)铭乾,也可以對list計數(shù)剪廉。
  • deque:隊列。
  • nametuple:繼承自tuple炕檩,我認為本質(zhì)上是快速創(chuàng)建僅包括屬性的類對象斗蒋,從這個角度上看非常實用。
  • enum:枚舉類型笛质,但是必須注意泉沾,枚舉成員本身類型就是枚舉類型,因此如果需要將枚舉成員用以讀寫及比較操作將會報錯妇押。
    這篇教程中還講了一些協(xié)程coroutine跷究、異步IO的概念,但都屬于技巧性的內(nèi)容敲霍,講的不透徹就不再一一分享俊马。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丁存,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柴我,更是在濱河造成了極大的恐慌柱嫌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屯换,死亡現(xiàn)場離奇詭異,居然都是意外死亡与学,警方通過查閱死者的電腦和手機彤悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來索守,“玉大人晕窑,你說我怎么就攤上這事÷逊穑” “怎么了杨赤?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長截汪。 經(jīng)常有香客問我疾牲,道長,這世上最難降的妖魔是什么衙解? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任阳柔,我火速辦了婚禮,結果婚禮上蚓峦,老公的妹妹穿的比我還像新娘舌剂。我一直安慰自己,他們只是感情好暑椰,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布霍转。 她就那樣靜靜地躺著,像睡著了一般一汽。 火紅的嫁衣襯著肌膚如雪避消。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天角虫,我揣著相機與錄音沾谓,去河邊找鬼。 笑死戳鹅,一個胖子當著我的面吹牛均驶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枫虏,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼妇穴,長吁一口氣:“原來是場噩夢啊……” “哼爬虱!你這毒婦竟也來了?” 一聲冷哼從身側響起腾它,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤跑筝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞒滴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曲梗,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年妓忍,在試婚紗的時候發(fā)現(xiàn)自己被綠了虏两。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡世剖,死狀恐怖定罢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旁瘫,我是刑警寧澤祖凫,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站酬凳,受9級特大地震影響惠况,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宁仔,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一售滤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧台诗,春花似錦完箩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粱快,卻和暖如春秩彤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背事哭。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工漫雷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳍咱。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓降盹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谤辜。 傳聞我的和親對象是個殘疾皇子蓄坏,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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