lambda--整理的部分网络博文
lambda很靈活,可以用在任何需要函數的地方:
>>>def f(x):
… return x*2
…
>>> f(2)
4
定義一個函數f(x),f(x)=x*2. 用lambda來表達就是:
>>> f=lambda x: x*2
>>> f(2)
4
這個函數沒有函數名,lambda的結果被賦值給變量f調用。
?
---------------------------
python lambda 是在python 中使用lambda來創建匿名函數,而用def創建的方法是有名稱的,除了從表面上的方法名不一樣外,python lambda還有哪些和def不一樣呢?
1 python lambda會創建一個函數對象,但不會把這個函數對象賦給一個標識符,而def則會把函數對象賦值給一個變量。
2 python lambda它只是一個表達式,而def則是一個語句。
下面是python lambda的格式,看起來好精簡阿。
lambda x: print x
如果你在python 列表解析 里用到python lambda,我感覺意義不是很大,因為python lambda它會創建一個函數對象,但馬上又給丟棄了,因為你沒有使用它的返回值,即那個函數對象。也正是由于lambda只是一個表達式,它可以直接作為python 列表 或python 字典 的成員,比如:
info = [lamba a: a**3, lambda b: b**3]
在 這個地方沒有辦法用def語句直接代替。因為def是語句,不是表達式不能嵌套在里面,lambda表達式在“:”后只能有一個表達式。也就是說,在 def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定義在python lambda后面。因此,像if或for或print這種語句就不能用于lambda中,lambda一般只用來定義簡單的函數。
下面舉幾個python lambda的例子吧
1單個參數的:
g = lambda x:x*2
print g(3)
結果是6
2多個參數的:
m = lambda x,y,z: (x-y)*z
print m(3,1,2)
結果是4
--------------------------------------
lambda提供了一個運行時動態創建函數的方法
--------------------------------------------------------
在python中使用lambda來創建匿名函數。lambda來源于LISP語言。lambda的形式如下:
- lambda arg1,arg2... : <expression>
lambda會創建一個函數對象,但不會把這個函數對象賦給一個標識符,而def則不同,它在創建函數對象的同時會進行這種操作。這是lambda的第一個特點。lambda的第二個特點是,它只是一個表達式,而不是一個語句。如果單獨使它成為了一個語句,比如:
- lambda x: print x
如果你在你的python程序中寫下了這么一行,那么毫無意義,這一行代碼會創建一個函數對象,但馬上又給丟棄了,因為你沒有使用它的返回值,即那個函數對象。也正是由于lambda只是一個表達式,它可以直接作為list或dictionary的成員,比如:
- L = [lamba x: x**2, lambda x: x**3]
在這個地方沒有辦法用def語句直接代替。第三,lambda表達式在“:”后只能有一個表達式。也就是說,在def中, 可以放在return后的也可以放在lambda,不能放在return后也不能放在這里。更本質地說,后面的表達式是能夠返回一個值的,不能返回值的不 能放在這里。因此,像if或for或print這種語句就不能用于lambda中,lambda一般只用來定義簡單的函數。當然,通過一些技巧,可以在 lambda中實現與if或for相同的功能。比如:if語句可以利用and和or這兩個邏輯操作符的“短路”特性來模擬,比如:
- ((test and [x]) or [y])[0]
這樣的話,如果test為真,那么就會計算[x],當然得到的就是[x],由于在or操作符的左邊已經得到真值,or的右 邊就不會被計算,因此得到的是[x][0],最后的結果是x。如果test為假,那么根據and的特性,左邊已經為假,右邊不會被計算。這時or的左邊為 假那么就得到[y][0],最后的結果是y。注意在這里不能寫成如下的形式:
- (test and x) or y
在x為真值時,這種形式與上面這種形式是等價的。但設想這種情況,“如果test為真,則取0,如果test為假,則取[]”,也就是說x本身是一個假值,用上面的形式書寫就是:
- (test and 0) or []
顯然不能達到目的,這個式子永遠只會取到[]。因此應該改寫成:
- ((test and [0]) or [[]])[0]
在lambda中循環語句也是可以模擬的,用的是map函數。比如:
- F=lambda x: map((lambda y: y**2), x)
當然,這種東西看起來就很復雜,如果可能最好不要嵌套使用lambda。print也是可以模擬的:
總結
以上是生活随笔為你收集整理的lambda--整理的部分网络博文的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给自己扫盲之URL
- 下一篇: import _winreg:用pyth