python容許用lambda來建立匿名函數,匿名是由於不須要以標準的方式來聲明,而def建立的方法是有名稱的,它們主要有2個地方不同 python
1.lambda表達式返回可調用的函數對象.但不會把這個函數對象賦給一個標識符,而def則會把函數對象賦值給一個變量. shell
2.lambda 它只是一個表達式,而def是一個語句 app
對於一些抽象的,不會別的地方再複用的函數,有時候給函數起個名字也是個難題,使用lambda不須要考慮命名的問題。 dom
lambda語句中,冒號前是參數,能夠有多個,用逗號隔開,冒號右邊的返回值 函數
>>> lambda :True <function <lambda> at 0x7f77371277d0> >>> true = lambda :True >>> true() True >>> def add(x,y): ... return x + y ... >>> add(3,2) 5
看來用lambda賦值很是有用,因爲它只是一個表達式,它能夠直接做爲python 列表和元組,字典的成員. spa
sum = lambda x: x**2
等價於 code
def sum(x): return x ** 2
在lambda這裏沒有辦法用def語句直接代替,由於def是語句,不是表達式不能嵌套在裏面,lambda表達式在":"後只能有一個表達式。也就是說,在def中,用return能夠返回的也能夠放在lambda後面,不能用return返回的也不能定義lambda後面.所以,像if或for或print這種語句就不能用於lambda中,lambda通常只用來定義簡單的函數。 對象
另外lambda函數能夠很好和python中內建filter(),map(),reduce()函數的應用程序結合起來,由於它們都帶了一個可執行的函數對象. get
1filter(...) string
filter(function or None, sequence) -> list, tuple, or string
給定一個'過濾函數'和一個對象的序列,每一個序列元素都經過這個過濾器進行篩選,保留函數返回爲真的對象.filter函數爲已知的序列的每一個元素調用給定布爾函數.每一個filter返回的非零(true)值元素添加到一個列表中.
例如使用filter()來得到任意奇數的列表腳本.
#!/usr/bin/python2.5 from random import randint allNums = [] for eachNum in range(10): allNums.append(randint(1,100)) print filter(lambda x: x%2,allNums) #使用filter()來移除全部偶數
root@10.1.6.200:~# ./getOdd.py [89, 45, 41, 29, 5, 29, 85]
2.map(...)
map(function, sequence[, sequence, ...]) -> list
map()內建函數與filter()類似,由於它也能經過函數來處理序列,但map()將函數調用'映射'到每一個序列的元素上,並返回一個含有全部返回值的列表。
例如,映射函數是給每一個進入的數字加10,而且將這個函數和一個數字的列表傳給map().
>>> map(lambda x:x+10,[0,1,2,3,4,5,6,7,8,9]) [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
3.reduce(...)
reduce(function, sequence[, initial]) -> value
它經過取出序列的頭兩個元素.將他們傳入二元函數來得到一個單一的值來實現.而後又用這個值和序列的下一個元素來得到又一個值,而後繼續直到整個序列的內容都遍歷完畢之後最後的值會被計算出來爲止.
reduce(func,[1,2,3]) 等同於 func(func(1,2),3)
例如:計算從1加到10的和
>>> print 'the total is:',reduce((lambda x,y:x+y),range(1,11)) the total is: 55