[Python]使用 lambda 函数
From:http://woodpecker.org.cn/diveintopython/power_of_introspection/lambda_functions.html
4.7.?使用 lambda 函數(shù)
- 4.7.1. 真實(shí)世界中的 lambda 函數(shù)
Python 支持一種有趣的語(yǔ)法,它允許你快速定義單行的最小函數(shù)。這些叫做 lambda 的函數(shù),是從 Lisp 借用來(lái)的,可以用在任何需要函數(shù)的地方。
例?4.20.?lambda 函數(shù)介紹
>>> def f(x):... return x*2
... >>> f(3)
6
>>> g = lambda x: x*2
>>> g(3)
6
>>> (lambda x: x*2)(3)
6
| 這是一個(gè) lambda 函數(shù),完成同上面普通函數(shù)相同的事情。注意這里的簡(jiǎn)短的語(yǔ)法:在參數(shù)列表周圍沒(méi)有括號(hào),而且忽略了return 關(guān)鍵字 (隱含存在,因?yàn)檎麄€(gè)函數(shù)只有一行)。而且,該函數(shù)沒(méi)有函數(shù)名稱,但是可以將它賦值給一個(gè)變量進(jìn)行調(diào)用。 | |
| 使用 lambda 函數(shù)時(shí)甚至不需要將它賦值給一個(gè)變量。這可能不是世上最有用的東西,它只是展示了lambda 函數(shù)只是一個(gè)內(nèi)聯(lián)函數(shù)。 |
總的來(lái)說(shuō),lambda 函數(shù)可以接收任意多個(gè)參數(shù) (包括可選參數(shù)) 并且返回單個(gè)表達(dá)式的值。lambda 函數(shù)不能包含命令,包含的表達(dá)式不能超過(guò)一個(gè)。不要試圖向lambda 函數(shù)中塞入太多的東西;如果你需要更復(fù)雜的東西,應(yīng)該定義一個(gè)普通函數(shù),然后想讓它多長(zhǎng)就多長(zhǎng)。
| lambda 函數(shù)是一種風(fēng)格問(wèn)題。不一定非要使用它們;任何能夠使用它們的地方,都可以定義一個(gè)單獨(dú)的普通函數(shù)來(lái)進(jìn)行替換。我將它們用在需要封裝特殊的、非重用代碼上,避免令我的代碼充斥著大量單行函數(shù)。 | |
4.7.1.?真實(shí)世界中的 lambda 函數(shù)
apihelper.py 中的 lambda 函數(shù):
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)注意這里使用了 and-or 技巧的簡(jiǎn)單形式,它是沒(méi)問(wèn)題的,因?yàn)?lambda 函數(shù)在布爾環(huán)境中總是為真。(這并不意味這lambda 函數(shù)不能返回假值。這個(gè)函數(shù)對(duì)象的布爾值為真;它的返回值可以是任何東西。)
還要注意的是使用了沒(méi)有參數(shù)的 split 函數(shù)。你已經(jīng)看到過(guò)它帶一個(gè)或者兩個(gè)參數(shù)的使用,但是不帶參數(shù)它按空白進(jìn)行分割。
例?4.21.?split 不帶參數(shù)
>>> s = "this is\na\ttest">>> print s
this is
a test
>>> print s.split()
['this', 'is', 'a', 'test']
>>> print " ".join(s.split())
'this is a test'
| 這是一個(gè)多行字符串,通過(guò)使用轉(zhuǎn)義字符的定義代替了三重引號(hào)。\n 是一個(gè)回車,\t 是一個(gè)制表符。 | |
| 不帶參數(shù)的 split 按照空白進(jìn)行分割。所以三個(gè)空格、一個(gè)回車和一個(gè)制表符都是一樣的。 | |
| 通過(guò) split 分割字符串你可以將空格統(tǒng)一化;然后再以單個(gè)空格作為分隔符用join 將其重新連接起來(lái)。這也就是 info 函數(shù)將多行doc string 合并成單行所做的事情。 |
那么 info 函數(shù)到底用這些 lambda 函數(shù)、split 函數(shù)和and-or 技巧做了些什么呢?
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)processFunc 現(xiàn)在是一個(gè)函數(shù),但是它到底是哪一個(gè)函數(shù)還要取決于 collapse 變量。如果 collapse 為真,processFunc(string) 將壓縮空白;否則processFunc(string) 將返回未改變的參數(shù)。
在一個(gè)不很健壯的語(yǔ)言中實(shí)現(xiàn)它,像 Visual Basic,你很有可能要?jiǎng)?chuàng)建一個(gè)函數(shù),接受一個(gè)字符串參數(shù)和一個(gè)collapse 參數(shù),并使用 if 語(yǔ)句確定是否壓縮空白,然后再返回相應(yīng)的值。這種方式是低效的,因?yàn)楹瘮?shù)可能需要處理每一種可能的情況。每次你調(diào)用它,它將不得不在給出你所想要的東西之前,判斷是否要壓縮空白。在Python 中,你可以將決策邏輯拿到函數(shù)外面,而定義一個(gè)裁減過(guò)的 lambda 函數(shù)提供確切的 (唯一的) 你想要的。這種方式更為高效、更為優(yōu)雅,而且很少引起那些令人討厭 (哦,想到那些參數(shù)就頭昏) 的錯(cuò)誤。
lambda 函數(shù)進(jìn)一步閱讀
- Python Knowledge Base 討論了使用lambda 來(lái)間接調(diào)用函數(shù)。
- Python Tutorial 演示了如何從一個(gè)lambda 函數(shù)內(nèi)部訪問(wèn)外部變量。(PEP 227 解釋了在Python 的未來(lái)版本中將如何變化。)
- The Whole Python FAQ 有關(guān)于令人模糊的使用lambda 單行語(yǔ)句的例子。
總結(jié)
以上是生活随笔為你收集整理的[Python]使用 lambda 函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中short、int、long、
- 下一篇: linux系统安装红蜘蛛,在linux