Python 中定義函數有兩種方法,一種是用常規方式 def 定義,函數要指定名字,第二種是用 lambda 定義,不需要指定名字,稱為 Lambda 函數。
Lambda 函數又稱匿名函數,匿名函數就是沒有名字的函數,函數沒有名字也行?當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。
好比電影里面的群眾演員,往往他們的戲份很少,最多是襯托主演,跑跑龍套,他們需要名字嗎?不需要,因為他們僅僅只是臨時出鏡,下次可能就用不著了,所以犯不著費心思給他們每個人編個號取個名字,畢竟取個優雅的名字是很費勁的事情。
先來看個簡單 lambda 函數
>>> lambda x, y : x+yat 0x102bc1c80>
x 和 y 是函數的兩個參數,冒號后面的表達式是函數的返回值,你能一眼看出這個函數就是是在求兩個變量的和,但作為一個函數,沒有名字如何使用呢?這里我們暫且給這個匿名函數綁定一個名字,這樣使得我們調用匿名函數成為可能
>>> add = lambda x, y : x+y >>> addat 0x102bc2140> >>> add(1,2) 3
它等同于常規函數
>>> def add2(x, y): ... return x+y ... >>> add2>>> 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 函數不能使你的代碼變得更清晰時,這時你就要考慮使用常規的方式來定義函數。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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