發現了一本關於Python精通知識點的好書《Python Tips》,關於Python的進階的技巧。摘錄一些比較有價值的內容做爲分享。html
在函數定義的時候咱們常常看到*args和 **kwargs這兩個定義對象。*args表明了函數定義中全部non-keyworded(這個詞實在很難翻譯)的傳入參數,而**kwargs表明的全部帶有keyworded的傳入參數,舉個栗子:python
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}
經過這個栗子咱們能夠清晰地區分keyworded和non-keyworded的區別了。本質上來講,args是一個數組,kwargs是一個字典。
args and *kwargs 最經常使用於裝飾器,也能夠用於monkey patching(猴子補丁),用來在運行時動態修改已有的代碼,而不須要修改原始代碼。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在該模塊中被完美替換,這個方法也能夠用來作單元測試使用。數組
首先區分Iterable、Iterator和Iteration三個概念:任何具備__iter__()或__getitem__()方法的對象,Python就認爲它是一個iterable;使用內置的iter()函數來生成iterator,iterator能夠經過__next__()方法來獲取下一個元素。iterator遍歷元素的過程能夠認爲iteration。
生成器一樣是可迭代對象,可是你只能讀取一次,由於它並無把全部值存放內存中,它動態的生成值。
Yield是關鍵字, 用起來像return,yield在告訴程序,要求函數返回一個生成器,舉個栗子:數據結構
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(function_to_apply, list_of_inputs)app
例如:異步
items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))
當時這二者還能夠經過lambda表達式進行多個函數處理同一個輸入的狀況,這是一個很是美妙的轉換,栗子以下:socket
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]
神奇的事情發生了,兩個函數對於同一個輸入參數都進行處理,並返回在告終果中。函數
filter(function_to_apply, list_of_inputs)單元測試
在大部分的狀況下map和filter均可以經過list/dict/tuple Comprehensions來實現。
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作運算後,繼續循環,expr運算獲得的值賦給變量L
map
map(function_to_apply, list_of_inputs)
經過函數對於結果進行處理,並返回彙集結果。例如:
from functools import reduce product = reduce((lambda x, y: x * y), [1, 2, 3, 4]) # Output: 24
Collections包括幾個經常使用的數據結構: