匿名函數(shù) 簡單的需要用函數(shù)去解決的問題 匿名函數(shù)的函數(shù)體 只有一行 也叫l(wèi)ambda表達(dá)式
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!專注中小微企業(yè)官網(wǎng)定制,做網(wǎng)站、網(wǎng)站制作,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。
python 使用 lambda 來創(chuàng)建匿名函數(shù)。
lambda函數(shù)的語法只包含一個(gè)語句,如下:
等價(jià)于
在Python中,lambda函數(shù)是一個(gè)簡單的匿名函數(shù)。該函數(shù)沒有函數(shù)名,它可以有多個(gè)參數(shù),但函數(shù)只由一個(gè)表達(dá)式構(gòu)成。
lambda函數(shù)具體的格式如下:
lambda 參數(shù) : 表達(dá)式
其中, lambda 是關(guān)鍵字, 參數(shù) 是函數(shù)的參數(shù),可以有0至多個(gè)。冒號(hào)后面是表達(dá)式,也是該函數(shù)中的唯一的表達(dá)式,lambda函數(shù)會(huì)返回該表達(dá)式的返回值。
我們來看一個(gè)具體的例子。
在上述代碼中,number1, number2是lambda函數(shù)的參數(shù),number1**2+number**2是函數(shù)的表達(dá)式,該函數(shù)返回number1, number2兩個(gè)數(shù)的平方和。
上述代碼創(chuàng)建了一個(gè)lambda函數(shù)后將其賦值給變量sum_square, 在print函數(shù)中通過sum_square來調(diào)用這個(gè)lambda函數(shù)。
上述的lambda函數(shù)完全可用標(biāo)準(zhǔn)的函數(shù)來實(shí)現(xiàn),我們可以將上述代碼改寫成下面的代碼。
在代碼中,定義了函數(shù)sum_square,該函數(shù)包含兩個(gè)參數(shù),并執(zhí)行一條語句并將該語句的執(zhí)行結(jié)果作為函數(shù)返回值。通過上述代碼可以幫助我們更直觀地理解lambda函數(shù)。
lambda函數(shù)的可讀性較差,那么為什么要有這樣奇怪的匿名函數(shù)呢?這個(gè)要從lambda的使用場合說起。我們來看下面的代碼。
上述代碼定義了一個(gè)數(shù)值列表,調(diào)用python的內(nèi)置函數(shù)filter來生成一個(gè)新的迭代器。 filter函數(shù)的第一個(gè)參數(shù)為一個(gè)函數(shù),用于決定過濾的方法;第二個(gè)參數(shù)為一個(gè)可迭代的對(duì)象如列表、集合等。filter函數(shù)返回一個(gè)新的迭代器, 用于獲得滿足第一個(gè)函數(shù)為真的所有元素。在上述代碼中,我們給filter傳遞的第一個(gè)參數(shù)是一個(gè)匿名函數(shù):lambda number:number%3==0, 該函數(shù)在一個(gè)數(shù)整除3時(shí)為True,否則為False. filter函數(shù)會(huì)創(chuàng)建一個(gè)新的迭代器,通過調(diào)用上述匿名函數(shù)來判斷該元素是否滿足條件,得到所有3的倍數(shù)的數(shù)。
當(dāng)然,上述代碼也可以使用正常的函數(shù)方式來實(shí)現(xiàn),如下所示:
我們可以看到,所有匿名函數(shù)的功能都可以通過標(biāo)準(zhǔn)函數(shù)來實(shí)現(xiàn)。匿名函數(shù)常在調(diào)用其它函數(shù)(如filter, map等)時(shí)作為參數(shù)使用。使用匿名函數(shù)可以使代碼更為精簡。匿名函數(shù)主要用于完成簡單的任務(wù),如果匿名函數(shù)過于復(fù)雜,會(huì)導(dǎo)致可讀性較差,調(diào)試起來也比較困難,因此,強(qiáng)烈不建議使用lambda寫天書般的代碼。總之,要根據(jù)實(shí)際情況決定是否使用匿名函數(shù)。
在Python中使用lambda創(chuàng)建匿名函數(shù),所謂的匿名,是指不需要為這個(gè)函數(shù)指定一個(gè)名稱.
匿名函數(shù)lambda只是一個(gè)表達(dá)式,函數(shù)體比def簡單的多.
labmda arg1,arg2:expression
使用匿名函數(shù)創(chuàng)建常用的函數(shù)
無參數(shù)匿名函數(shù)
t = lambda : True
t() - True
等價(jià)于下面的def定義的函數(shù)
def func(): return True
func() - true
帶參數(shù)匿名函數(shù)
lambda x : x 3 求x的三次方
lambda x,y=2:x y 參數(shù)允許擁有默認(rèn)值
匿名函數(shù)的調(diào)用
直接賦值給一個(gè)變量,然后跟普通的函數(shù)一樣調(diào)用它
c = lambda x,y,z: x * y * z
c(2,3,4)
24
lambda返回一個(gè)元組
a = lambda *z : z
a('abc','def')
('abc','def')
返回一個(gè)字典
d = lambda **dict:dict
d({"a":2})
{"a":2}
lambda直接后面?zhèn)鲄?/p>
(lambda x,y:x+y)(100,200)#300
大量的實(shí)例
字符串聯(lián)合,有默認(rèn)值
x = (lambda x = 'boo',y='too',z='zoo':x+y+z)
x(abc)
和列表聯(lián)合使用
L = [lambda x : x 2,lambda x:x 3,lambda x:x**4]
for f in L;
print(f(2)) # 4,8,16
和字典結(jié)合使用
key = 'B'
dic = {'A':lambda:2 2,'B':lambda:2 4,'C':lambda:2 *8}
dic key # 8
求最小值
lower = lambda:x,y:x if x y else y
lower(2,5) # 2
和map以及l(fā)ist聯(lián)合使用
import sys
showall = lambda x : list(map(sys.stdout.write,x))
showall(['Jerry\n','Sherry\n','Alice\n'])
lambda和map聯(lián)合使用
out = lambda *x : sys.out.write(' '.join(map(str,x)))
out('This','is','a','book!\n')
This is a book!
判斷字符串是否以某個(gè)字母開頭
print(lambda x : x.startswith('b')('Bob')) # false
lambda 和 map,filter聯(lián)合使用
squares = map(lambda x : x**2,rang(10))
filters = filter(lambda x: x5 and x 50,squares)
lambda和sorted聯(lián)合使用
death = [('James',32),('Fioman',22),('Yasanlun',35)]
list = sorted(death,key=lambda x : x[1])
求2-50之間的素?cái)?shù)
nums = range(2,50 + 1)
for i in nums:
nums = filter(lambda x : x ==i or x %i,nums)
求兩個(gè)列表元素的和
a = [1,2,3,4]
b = [5,6,7,8]
sum = map(lambda x,y:x+y,a,b)
求字符串中每個(gè)單詞的長度
sentence = "Welcom To Beijing!"
words = sentence.split()
lengths = map(lambda x : len(x),words)