python学习-高阶函数(函数传参、返回函数(闭包)、匿名函数lambda)
文章目錄
- 高階函數(shù)
- 函數(shù)傳參
- 返回函數(shù)(閉包)
- 匿名函數(shù)lambda
高階函數(shù)
定義:
至少滿(mǎn)足下列一個(gè)條件:
- 接受一個(gè)或多個(gè)函數(shù)作為輸入
- 輸出一個(gè)函數(shù)
python里的高階函數(shù)有 filter、map、reduce、sorted、匿名函數(shù)lambda等
函數(shù)傳參
顧名思義就是把一個(gè)函數(shù)作為參數(shù)傳到另一個(gè)函數(shù)中,也不復(fù)雜,直接上代碼:
def test1(x, func):return func(x)print(test1([1, 2, 3, 4, 5], sum))這是一個(gè)很簡(jiǎn)單的示例,sum函數(shù)作為參數(shù)傳入test1函數(shù)。
返回函數(shù)(閉包)
在函數(shù)中定義了另一個(gè)函數(shù),并且把定義的函數(shù)作為返回值返回出去,在外部調(diào)用。
def mySum(*args):def sum():sum1 = 0for i in args:sum1 = sum1 + ireturn sum1return sumfunc1 = mySum(1, 2, 3, 4, 5) print(func1) print(func1())從代碼中能夠看出,如果直接調(diào)用func1,打印的是函數(shù)的地址。
所以需要像調(diào)用函數(shù)一樣去執(zhí)行 :func1(),才能打印結(jié)果。
匿名函數(shù)lambda
python使用lambda來(lái)創(chuàng)建匿名函數(shù)
- lambda 只是一個(gè)表達(dá)式,函數(shù)體比 def 簡(jiǎn)單很多。
- lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。
- 只能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
- lambda 函數(shù)擁有自己的命名空間,且不能訪問(wèn)自己參數(shù)列表之外或全局命名空間里的參數(shù)。
- 雖然lambda函數(shù)看起來(lái)只能寫(xiě)一行,卻不等同于C或C++的內(nèi)聯(lián)函數(shù),后者的目的是調(diào)用小函數(shù)時(shí)不占用棧內(nèi)存從而增加運(yùn)行效率。
lambda [arg1 [,arg2,…argn]]:expression
lambda 參數(shù)列表:return [表達(dá)式] 變量
由于lambda返回的是函數(shù)對(duì)象(構(gòu)建的是一個(gè)函數(shù)對(duì)象),所以需要定義一個(gè)變量去接收
劃重點(diǎn):
在Python3里,map返回的結(jié)果是迭代器(iterator),因此需要先轉(zhuǎn)換為列表list,再print輸出。
釋疑
有些文章里面說(shuō)lambda能夠提高運(yùn)行效率,一篇博文里面對(duì)此進(jìn)行了驗(yàn)證
我沒(méi)有進(jìn)行試驗(yàn),不過(guò)從結(jié)果看出來(lái),其實(shí)效率沒(méi)什么差別。
還有其他用法:
比如把lambda賦值給一個(gè)變量,然后像函數(shù)一樣調(diào)用。
對(duì)元組進(jìn)行排序,lambda結(jié)合sorted函數(shù)
運(yùn)行結(jié)果:
還有一些其他使用:
# 在tkinter中定義內(nèi)聯(lián)的callback函數(shù) import sys from tkinter import Button, mainloop# 這里可以彈出一個(gè)窗口,點(diǎn)擊按鈕,打印Hello,World! callBck = Button(text='Press', command=(lambda: sys.stdout.write('Hello,World!\n'))) callBck.pack() callBck.mainloop()另一段代碼:
str2 = ['123', '213', '2443425', '12324235', '123123', '234234', '434234'] strBegin = filter(lambda x: x.startswith('1'), str2) print(strBegin, type(strBegin)) print(list(strBegin))運(yùn)行結(jié)果:
打印結(jié)果時(shí),因?yàn)榻Y(jié)果需要轉(zhuǎn)換類(lèi)型才能打印出來(lái),所以,使用的是:print(list(strBegin))
總結(jié)
以上是生活随笔為你收集整理的python学习-高阶函数(函数传参、返回函数(闭包)、匿名函数lambda)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python学习-序列化对象(pickl
- 下一篇: jquery中怎样增加class(删除元