成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

什么時候使用Lambda函數(shù)?

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

什么時候使用Lambda函數(shù)?

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

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

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

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

  1. >>> lambda x, y : x+y 
  2.  
  3. <function <lambda> at 0x102bc1c80>  

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

  1. >>> add = lambda x, y : x+y 
  2.  
  3. >>> add 
  4.  
  5. <function <lambda> at 0x102bc2140> 
  6.  
  7. >>> add(1,2) 
  8.  
  9.  

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

  1. >>> def add2(x, y): 
  2.  
  3. ... return x+y 
  4.  
  5. ... 
  6.  
  7. >>> add2 
  8.  
  9. <function add2 at 0x102bc1c80> 
  10.  
  11. >>> add2(1,2) 
  12.  
  13.  

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

1、函數(shù)式編程

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

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

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

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

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

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

2、閉包

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

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

  1. >>> def my_add(n): 
  2.  
  3. ... return lambda x:x+n 
  4.  
  5. ... 
  6.  
  7. >>> add_3 = my_add(3) 
  8.  
  9. >>> add_3(7) 
  10.  
  11. 10  

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

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

  1. >>> def my_add(n): 
  2.  
  3. ... def wrapper(x): 
  4.  
  5. ... return x+n 
  6.  
  7. ... return wrapper 
  8.  
  9. ... 
  10.  
  11. >>> add_5 = my_add(5) 
  12.  
  13. >>> add_5(2) 
  14.  
  15.  

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

  1. 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ù)。 

責(zé)任編輯:龐桂玉 來源: Python開發(fā)者
相關(guān)推薦

2022-05-19 10:27:34

機器學(xué)習(xí)人工智能

2022-07-12 10:12:37

面試箭頭函數(shù)前端

2021-08-13 11:31:23

HTTP

2020-01-05 23:28:51

MQ消息進(jìn)程

2017-04-05 21:43:08

MQ互聯(lián)網(wǎng)架構(gòu)

2012-07-26 10:27:31

PHP

2020-05-12 11:25:50

MySQLES數(shù)據(jù)庫

2017-05-15 09:55:07

2015-07-08 15:55:01

NSStringcopystrong

2013-09-29 17:13:59

PowerShell工作流

2012-09-24 10:20:39

JavaScriptJS

2013-11-28 16:03:24

2025-02-28 09:04:08

2020-07-24 09:20:44

MapObject前端

2009-06-19 16:29:47

EJBXML

2010-11-09 13:58:03

SQL Server鎖

2024-08-05 01:22:16

2020-06-17 10:35:16

機器學(xué)習(xí)AI人工智能

2020-09-06 09:57:34

Node框架開發(fā)

2021-01-30 19:59:37

性能項目開源
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美精品91爱爱 | 91久久国产综合久久 | 日韩视频在线免费观看 | 欧美一区二区三区在线播放 | 狠狠的日 | 97超碰成人 | 在线国产一区二区 | 久久999 | 亚洲精品一区二区三区蜜桃久 | 黄色免费网站在线看 | 国产精品99久久久久久久vr | 亚洲免费人成在线视频观看 | 国产91在线 | 亚洲 | 精精国产视频 | 99久久精品免费看国产小宝寻花 | 精品国产欧美一区二区三区成人 | 亚洲综合中文字幕在线观看 | 久久久免费电影 | 久久亚洲欧美日韩精品专区 | 久久久www成人免费无遮挡大片 | 草久久免费视频 | 中文字幕97| 成人精品一区二区三区中文字幕 | 欧洲一区二区视频 | 国产中文字幕在线 | 欧美国产日韩一区 | www免费视频 | 色综合一区二区三区 | 精品视频在线免费观看 | 天堂一区二区三区 | 亚洲日韩中文字幕一区 | 69av在线视频 | 四季久久免费一区二区三区四区 | 91久久精品日日躁夜夜躁欧美 | 在线国产一区二区 | 91香蕉| 91久久网站| 超碰美女在线 | 日韩一区二区三区在线视频 | 午夜视频导航 | 中文字幕亚洲视频 |