1. 程式人生 > >fs = [(lambda n, i=i : i + n) for i in range(10)]

fs = [(lambda n, i=i : i + n) for i in range(10)]

看Python中的lambda表示式,不免有很多人對一些文章中的這句不能理解。
相關連結

參考

我也困惑了一下,這裡是我對它的理解。

>>>[a for a in range(5)]
[0,1,2,3,4]
#這個大家都能理解就是for每次遍歷將其結果作為列表的輸出
>>>a
4
#這種方式使用的變數可是全域性變數,a=4
#因此這個表示式fs[3][8]=13我們能夠理解了
#要記住此時生成的列表中都是函式,函式的引數是動態繫結的,執行時傳入


#為什麼這個可以?
fs = [(lambda n, i=i : i + n) for i in range(10
)] #另一個知識:預設引數在函式定義段被解析,且只解析一次 >>>i = 5 >>>def f(arg=i): >>> print arg >>>i = 6 >>>f() 5 #因此我們知道了,fs中的i在生成時綁定了迴圈中的i,不受最後的影響!

順手補充下map/reduce/filter/sort這幾個Python的常用函式

#map 對每個變數操作
>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
['1', '2', '3', '4'
, '5', '6', '7', '8', '9'] >>> map(lambda x:x**3,[x for x in range(5)]) [0, 1, 8, 27, 64] #reduce把一個函式作用在一個序列[x1, x2, x3...]上,這個函式必須接收兩個引數 >>> def fn(x, y): ... return x * 10 + y ... >>> def char2num(s): ... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6'
: 6, '7': 7, '8': 8, '9': 9}[s] ... >>> reduce(fn, map(char2num, '13579')) 13579 #filter()把傳入的函式依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。 >>> filter(lambda x:x%2 !=0 and x%3 !=0,range(2,25)) [5, 7, 11, 13, 17, 19, 23] #lambda表示式在“:”後只能有一個表示式。也就是說,在def中,用return可以返回的也可以放在lambda後面,不能用return返回的也不能定義在python lambda後面。因此,像if或for或print這種語句就不能用於lambda中,lambda一般只用來定義簡單的函式。