亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
python(21): 匿名函數(shù)及l(fā)ambda(14.1)
[打印本頁]
作者:
newsim
時間:
2006-03-04 22:29
標題:
python(21): 匿名函數(shù)及l(fā)ambda(14.1)
在python中使用lambda來創(chuàng)建匿名函數(shù)。lambda來源于LISP語言。lambda的形式如下:
lambda arg1,arg2...:
lambda會創(chuàng)建一個函數(shù)對象,但不會把這個函數(shù)對象賦給一個標識符,而def則不同,它在創(chuàng)建函數(shù)對象的同時會進行這種操作。這是lambda的第一個特點。lambda的第二個特點是,它只是一個表達式,而不是一個語句。如果單獨使它成為了一個語句,比如:
lambda x: print x
如果你在你的python程序中寫下了這么一行,那么毫無意義,這一行代碼會創(chuàng)建一個函數(shù)對象,但馬上又給丟棄了,因為你沒有使用它的返回值,即那個函數(shù)對象。也正是由于lambda只是一個表達式,它可以直接作為list或dictionary的成員,比如:
L = [lambad x: x**2, lambda x: x**3]
在這個地方?jīng)]有辦法用def語句直接代替。第三,lambda表達式在“:”后只能有一個表達式。也就是說,在def中,可以放在return后的也可以放在lambda,不能放在return后也不能放在這里。更本質(zhì)地說,后面的表達式是能夠返回一個值的,不能返回值的不能放在這里。因此,像if或for或print這種語句就不能用于lambda中,lambda一般只用來定義簡單的函數(shù)。當然,通過一些技巧,可以在lambda中實現(xiàn)與if或for相同的功能。比如:if語句可以利用and和or這兩個邏輯操作符的“短路”特性來模擬,比如:
((test and [x]) or [y])[0]
這樣的話,如果test為真,那么就會計算[x],當然得到的就是[x],由于在or操作符的左邊已經(jīng)得到真值,or的右邊就不會被計算,因此得到的是[x][0],最后的結(jié)果是x。如果test為假,那么根據(jù)and的特性,左邊已經(jīng)為假,右邊不會被計算。這時or的左邊為假那么就得到[y][0],最后的結(jié)果是y。注意在這里不能寫成如下的形式:
(test and x) or y
在x為真值時,這種形式與上面這種形式是等價的。但設(shè)想這種情況,“如果test為真,則取0,如果test為假,則取[]”,也就是說x本身是一個假值,用上面的形式書寫就是:
(test and 0) or []
顯然不能達到目的,這個式子永遠只會取到[]。因此應(yīng)該改寫成:
((test and [0]) or [[]])[0]
在lambda中循環(huán)語句也是可以模擬的,用的是map函數(shù)。比如:
F=lambda x: map((lambda y: y**2), x)
當然,這種東西看起來就很復(fù)雜,如果可能最好不要嵌套使用lambda。print也是可以模擬的:
import sys
pp = lambda x: sys.stdout.write(str(x)+'\n')
pp(8) ===> 8
本文來自ChinaUnix博客,如果查看原文請點:
http://blog.chinaunix.net/u/2809/showart_81032.html
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2