激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python3中lambda表達式與函數式編程講解

Python3中lambda表達式與函數式編程講解

2021-05-15 00:28youzhouliu Python

今天小編就為大家分享一篇關于Python3中lambda表達式與函數式編程講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

簡單來說,編程中提到的 lambda 表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。其一般有如下幾種使用方式:

1、lambda的一般形式是關鍵字lambda后面跟一個或多個參數,緊跟一個冒號,以后是一個表達式。lambda是一個表達式而不是一個語句。它能夠出現在Python語法不允許def出現的地方。作為表達式,lambda返回一個值(即一個新的函數)。lambda用來編寫簡單的函數,而def用來處理更強大的任務。例如:

?
1
2
3
4
f = lambda x,y,z : x+y+z
print f(1,2,3)
g = lambda x,y=2,z=3 : x+y+z
print g(1,z=4,y=5)<br>

結果:


10

2、lambda表達式常用來編寫跳轉表(jump table),就是行為的列表或字典。例如:

?
1
2
3
4
5
6
7
8
L = [(lambda x: x**2),
  (lambda x: x**3),
  (lambda x: x**4)]
print L[0](2),L[1](2),L[2](2)
D = {'f1':(lambda: 2+3),
  'f2':(lambda: 2*3),
  'f3':(lambda: 2**3)}
print D['f1'](),D['f2'](),D['f3']()

結果:

4 8 16 
5 6 8

3、lambda表達式可以嵌套使用,但是從可讀性的角度來說,應盡量避免使用嵌套的lambda表達式。

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

1、函數式編程

盡管Python算不上是一門純函數式編程語言,但它本身提供了很多函數式編程的特性,Python中,也有幾個定義好的全局函數方便使用的,像map、reduce、filter、sorted這些函數都支持函數作為參數,lambda函數就可以應用在函數式編程中。如下:

?
1
2
3
4
5
6
7
8
from functools import reduce
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print (list(filter(lambda x: x % 3 == 0, foo)))
#[18, 9, 24, 12, 27]
print (list(map(lambda x: x * 2 + 10, foo)))
#[14, 46, 28, 54, 44, 58, 26, 34, 64]
print (reduce(lambda x, y: x + y, foo))
#139

2、閉包

閉包本身是一個晦澀難懂的概念,在這里我們以簡單粗暴地理解為閉包就是一個定義在函數內部的函數,閉包使得變量即使脫離了該函數的作用域范圍也依然能被訪問到。lambda函數作為閉包的例子:

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

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

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

?
1
2
3
4
5
6
7
8
>>> def my_add(n):
...   def wrapper(x):
...     return x+n
...   return wrapper
...
>>> add_5 = my_add(5)
>>> add_5(2)
7

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

?
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函數,相信你要看一會兒才能看明白。

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://blog.csdn.net/youzhouliu/article/details/78948140

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 最近免费观看高清韩国日本大全 | 免费观看三级毛片 | 一区在线免费视频 | 天天舔天天插 | 国产一区二区成人在线 | 久久成人视屏 | 91精品国产91久久久久久 | 亚洲资源在线播放 | 在线高清中文字幕 | 最近免费观看高清韩国日本大全 | 在线播放免费视频 | 免费在线观看毛片 | 九九黄色 | 午夜精品老牛av一区二区三区 | 欧美成a人片在线观看久 | 91九色蝌蚪国产 | 国产成年人视频网站 | 99精品在线观看 | 免费一及片 | 视频在线中文字幕 | 99久久久精品视频 | 毛片118极品美女写真 | 鲁丝片一区二区三区免费入口 | 国产精品午夜小视频观看 | 香蕉久久久久久 | 免费在线观看毛片 | 国产一级二级在线播放 | 久久亚洲精品国产一区 | 欧美一级毛片美99毛片 | 久久吊| 国产成人精品一区二区视频免费 | 国产精品一区二区三区在线 | 日韩欧美精品电影 | 双性帝王调教跪撅打屁股 | 国产精品久久久久久影院8一贰佰 | 亚洲国产精品久久久久久久 | 免费黄色av | av在线免费观看网 | 亚洲欧美日韩综合 | av噜噜在线 | 国产成人高清在线观看 |