日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python何時應(yīng)該使用Lambda函數(shù)

系統(tǒng) 1696 0

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

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

好比電影里面的群眾演員,往往他們的戲份很少,最多是襯托主演,跑跑龍?zhí)祝麄冃枰謫幔坎恍枰驗樗麄儍H僅只是臨時出鏡,下次可能就用不著了,所以犯不著費心思給他們每個人編個號取個名字,畢竟取個優(yōu)雅的名字是很費勁的事情。

先來看個簡單 lambda 函數(shù)

            
>>> lambda x, y : x+y

            
              
                 at 0x102bc1c80>
              
            
          

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

            
>>> add = lambda x, y : x+y
>>> add

            
              
                 at 0x102bc2140>
>>> add(1,2)
3
              
            
          

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

            
>>> def add2(x, y):
... return x+y
...
>>> add2

            
              
>>> add2(1,2)
3
            
          

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

1、函數(shù)式編程

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

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

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

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

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

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

2、閉包

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

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

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

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

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

            
>>> 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ù)更清晰明了呢?看這個例子:

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 双辽市| 东至县| 千阳县| 五家渠市| 通化县| 互助| 饶河县| 巩义市| 三台县| 安泽县| 永嘉县| 依安县| 厦门市| 资兴市| 麟游县| 南岸区| 资溪县| 瑞昌市| 马鞍山市| 贡嘎县| 木兰县| 横峰县| 商城县| 大名县| 永定县| 新龙县| 垣曲县| 罗山县| 吴川市| 洛隆县| 社会| 高碑店市| 永修县| 兴安盟| 舒兰市| 澎湖县| 平谷区| 游戏| 河东区| 名山县| 卢氏县|