溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python中如何定義函數(shù)

發(fā)布時(shí)間:2021-12-28 17:45:05 來(lái)源:億速云 閱讀:165 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要為大家展示了“Python中如何定義函數(shù)”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Python中如何定義函數(shù)”這篇文章吧。

Python 中定義函數(shù)有兩種方法,一種是用常規(guī)方式 def 定義,函數(shù)要指定名字,第二種是用lambda定義,不需要指定名字,稱(chēng)為 Lambda 函數(shù)。

Lambda 函數(shù)又稱(chēng)匿名函數(shù),匿名函數(shù)就是沒(méi)有名字的函數(shù),函數(shù)沒(méi)有名字也行?當(dāng)然可以啦。有些函數(shù)如果只是臨時(shí)一用,而且它的業(yè)務(wù)邏輯也很簡(jiǎn)單時(shí),就沒(méi)必要非給它取個(gè)名字不可。

好比電影里面的群眾演員,往往他們的戲份很少,最多是襯托主演,跑跑龍?zhí)?,他們需要名字嗎?不需要,因?yàn)樗麄儍H僅只是臨時(shí)出鏡,下次可能就用不著了,所以犯不著費(fèi)心思給他們每個(gè)人編個(gè)號(hào)取個(gè)名字,畢竟取個(gè)優(yōu)雅的名字是很費(fèi)勁的事情。

先來(lái)看個(gè)簡(jiǎn)單 lambda 函數(shù)

>>> lambda x, y : x+y
<function <lambda> at 0x102bc1c80>

x 和 y 是函數(shù)的兩個(gè)參數(shù),冒號(hào)后面的表達(dá)式是函數(shù)的返回值,你能一眼看出這個(gè)函數(shù)就是是在求兩個(gè)變量的和,但作為一個(gè)函數(shù),沒(méi)有名字如何使用呢?這里我們暫且給這個(gè)匿名函數(shù)綁定一個(gè)名字,這樣使得我們調(diào)用匿名函數(shù)成為可能

>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3

它等同于常規(guī)函數(shù)

>>> def add2(x, y):
...     return x+y
...
>>> add2
<function add2 at 0x102bc1c80>
>>> add2(1,2)
3

如果定義匿名函數(shù),還要給它綁定一個(gè)名字的話(huà),有點(diǎn)畫(huà)蛇添足,通常是直接使用 lambda 函數(shù)。那么 lamdba 函數(shù)的正確使用場(chǎng)景在哪呢?

1、函數(shù)式編程

盡管 Python 算不上是一門(mén)純函數(shù)式編程語(yǔ)言,但它本身提供了很多函數(shù)式編程的特性,像 map、reduce、filter、sorted 這些函數(shù)都支持函數(shù)作為參數(shù),lambda 函數(shù)就可以應(yīng)用在函數(shù)式編程中。

請(qǐng)看題:一個(gè)整數(shù)列表,要求按照列表中元素的絕對(duì)值大小升序排列,你會(huì)怎么做?思考一分鐘往下看

>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函數(shù) sorted 支持接收一個(gè)函數(shù)作為參數(shù),該參數(shù)作為 sorted 的排序依據(jù),這里按照列表元素的絕對(duì)值進(jìn)行排序,當(dāng)然,我也可以用普通函數(shù)來(lái)實(shí)現(xiàn):

>>> def foo(x):
...     return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]

只不過(guò)是這種方式代碼看起來(lái)不夠 Pythonic 而已。

2、閉包

閉包本身是一個(gè)晦澀難懂的概念,它可以專(zhuān)門(mén)單獨(dú)用一篇文章來(lái)介紹,不過(guò)在這里我們可以簡(jiǎn)單粗暴地理解為閉包就是一個(gè)定義在函數(shù)內(nèi)部的函數(shù),閉包使得變量即使脫離了該函數(shù)的作用域范圍也依然能被訪(fǎng)問(wèn)到。

來(lái)看一個(gè)用 lambda 函數(shù)作為閉包的例子。

>>> def my_add(n):
...     return lambda x:x+n
...
>>> add_3 = my_add(3)
>>> add_3(7)
10

這里的 lambda 函數(shù)就是一個(gè)閉包,在全局作用域范圍中,add_3(7) 可以正常執(zhí)行且返回值為10,之所以返回10是因?yàn)樵?my_add 局部作用域中,變量 n 的值在閉包的作用使得它在全局作用域也可以被訪(fǎng)問(wèn)到。

換成常規(guī)函數(shù)也可以實(shí)現(xiàn)閉包,只不過(guò)是這種方式稍顯啰嗦。

>>> def my_add(n):
...     def wrapper(x):
...         return x+n
...     return wrapper
...
>>> add_5 = my_add(5)
>>> add_5(2)
7

那么是不是任何情況 lambda 函數(shù)都要比常規(guī)函數(shù)更清晰明了呢?看這個(gè)例子:

f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]

這是一個(gè)返回某個(gè)集合的所有子集的 lambda 函數(shù),你看明白了嗎?我是很難一眼看出來(lái)

Python之禪中有這樣一句話(huà): Explicit is better than implicit(明了勝于晦澀)記住,如果用 lambda 函數(shù)不能使你的代碼變得更清晰時(shí),這時(shí)你就要考慮使用常規(guī)的方式來(lái)定義函數(shù)。

以上是“Python中如何定義函數(shù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI