當前位置:
首頁 > 知識 > 什麼時候使用 Lambda 函數?

什麼時候使用 Lambda 函數?

(點擊

上方藍字

,快速關注我們)




來源:伯樂在線/劉志軍 ,微信公號:Python之禪(ID:VTtalk)


foofish.net/lambda.html


如有好文章投稿,請點擊 → 這裡了解詳情




Python 中定義函數有兩種方法,一種是用常規方式 def 定義,函數要指定名字,第二種是用 lambda 定義,不需要指定名字,稱為 Lambda 函數。



Lambda 函數又稱匿名函數,匿名函數就是沒有名字的函數,函數沒有名字也行?當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。




好比電影裡面的群眾演員,往往他們的戲份很少,最多是襯托主演,跑跑龍套,他們需要名字嗎?不需要,因為他們僅僅只是臨時出鏡,下次可能就用不著了,所以犯不著費心思給他們每個人編個號取個名字,畢竟取個優雅的名字是很費勁的事情。




先來看個簡單 lambda 函數





>>>

lambda

x

,

y

:

x

+

y


<

function

<

lambda

>

at

0x102bc1c80

>




x 和 y 是函數的兩個參數,冒號後面的表達式是函數的返回值,你能一眼看出這個函數就是是在求兩個變數的和,但作為一個函數,沒有名字如何使用呢?這裡我們暫且給這個匿名函數綁定一個名字,這樣使得我們調用匿名函數成為可能





>>>

add

=

lambda

x

,

y

:

x

+

y


>>>

add


<

function

<

lambda

>

at

0x102bc2140

>


>>>

add

(

1

,

2

)


3




它等同於常規函數





>>>

def

add2

(

x

,

y

)

:


...

return

x

+

y


...


>>>

add2


<

function add2

at

0x102bc1c80

>


>>>

add2

(

1

,

2

)


3




如果定義匿名函數,還要給它綁定一個名字的話,有點畫蛇添足,通常是直接使用 lambda 函數。那麼 lamdba 函數的正確使用場景在哪呢?




1、函數式編程




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




請看題:一個整數列表,要求按照列表中元素的絕對值大小升序排列,你會怎麼做?思考一分鐘往下看





>>>

list1

=

[

3

,

5

,

-

4

,

-

1

,

0

,

-

2

,

-

6

]


>>>

sorted

(

list1

,

key

=

lambda

x

:

abs

(

x

))


[

0

,

-

1

,

-

2

,

3

,

-

4

,

5

,

-

6

]




排序函數 sorted 支持接收一個函數作為參數,該參數作為 sorted 的排序依據,這裡按照列表元素的絕對值進行排序,當然,我也可以用普通函數來實現:





>>>

def

foo

(

x

)

:


...

return

abs

(

x

)


...


>>>

sorted

(

list1

,

key

=

foo

)


[

0

,

-

1

,

-

2

,

3

,

-

4

,

5

,

-

6

]




只不過是這種方式代碼看起來不夠 Pythonic 而已。




2、閉包




閉包本身是一個晦澀難懂的概念,它可以專門單獨用一篇文章來介紹,不過在這裡我們可以簡單粗暴地理解為

閉包就是一個定義在函數內部的函數

,閉包使得變數即使脫離了該函數的作用域範圍也依然能被訪問到。




來看一個用 lambda 函數作為閉包的例子。





>>>

def

my_add

(

n

)

:


...

return

lambda

x

:

x

+

n


...


>>>

add_3

=

my_add

(

3

)


>>>

add_3

(

7

)


10




這裡的 lambda 函數就是一個閉包,在全局作用域範圍中,add_3(7) 可以正常執行且返回值為10,之所以返回10是因為在 my_add 局部作用域中,變數 n 的值在閉包的作用使得它在全局作用域也可以被訪問到。




換成常規函數也可以實現閉包,只不過是這種方式稍顯啰嗦。





>>>

def

my_add

(

n

)

:


...

def

wrapper

(

x

)

:


...

return

x

+

n


...

return

wrapper


...


>>>

add_5

=

my_add

(

5

)


>>>

add_5

(

2

)


7




那麼是不是任何情況 lambda 函數都要比常規函數更清晰明了呢?看這個例子:





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




這是一個返回某個集合的所有子集的 lambda 函數,你看明白了嗎?我是很難一眼看出來




zen of python 中有這樣一句話是 Explicit is better than implicit(明了勝於晦澀)。記住,如果用 lambda 函數不能使你的代碼變得更清晰時,這時你就要考慮使用常規的方式來定義函數。




看完本文有收穫?請轉

發分享給更多人


關注「P

ython開發者」,提升Python技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

想在AI界佔有一席之地,自然語言處理值得你好好學
Werkzeug 庫之 local 模塊
穿這件T恤寫代碼,被打擾的機率會不會降低?
PyPy v5.8 發布,有這些新亮點

TAG:Python開發者 |

您可能感興趣

什麼時候使用 CountDownLatch
如果Facebook告訴你 你的數據被Cambridge Analytica使用
為什麼使用 Web Services?
Nova Launcher 使用心得分享
我為什麼要使用Webpack?
不使用宏的情況 Multi-Stage Word 也可讓用戶中馬
如何讓您的舊iPhone儘可能長時間運行-使用SparkleComm的IOS用戶注意啦
Android為什麼推薦使用SparseArray來替代HashMap?
Photoshop詳細解析CameraRaw插件使用
使用 Python的urlliib.parse 庫解析 URL
使用 BenchmarkDotnet 測試代碼性能
Surface Laptop:從購買到使用
如何使用curl調試openstack的api
kali 使用apt-get update報錯GPG error的解決辦法
springboot:使用Spring Boot Actuator監控應用
調研:逾半數合作媒體不再使用 Facebook Instant Articles
剖析關於-ansible配置文件和命令中ad-hoc模式使用參數詳解
使用SQL查詢ElasticSearch
Google Pay支持綁定Paypal賬戶 可在Gmail等應用中直接使用Paypal支付
Luna mini2 一年使用心得