欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 函數(shù)編編程的三大法寶map+filter+reduce分享

 更新時(shí)間:2022年03月22日 14:28:16   作者:宇宙之一粟  
這篇文章主要介紹了Python 函數(shù)編編程的三大法寶map,filter,reduce的分享,python利用 map 在一個(gè)可迭代對(duì)象的各項(xiàng)上調(diào)用函數(shù)的工具;利用 filter 來(lái)過(guò)濾項(xiàng);利用 reduce 把函數(shù)作用在成對(duì)的項(xiàng)上來(lái)運(yùn)行結(jié)果的工具,下面我們就來(lái)對(duì)這三者進(jìn)行詳細(xì)的介紹,需要的朋友可以參考下

眾所周知,Python 支持多種編程范式:過(guò)程式(使用基礎(chǔ)的語(yǔ)句)、面向?qū)ο缶幊毯秃瘮?shù)式編程。

Python 也提供了其他函數(shù)式編程語(yǔ)言的工具:

  • 利用 map 在一個(gè)可迭代對(duì)象的各項(xiàng)上調(diào)用函數(shù)的工具
  • 利用 filter 來(lái)過(guò)濾項(xiàng)
  • 利用 reduce 把函數(shù)作用在成對(duì)的項(xiàng)上來(lái)運(yùn)行結(jié)果的工具

一、map

在沒(méi)有循環(huán)的情況下處理可迭代對(duì)象:map

有時(shí)我們需要對(duì)列表、集合、字典等可迭代序列做的一個(gè)操作就是:對(duì)其中每一個(gè)元素值進(jìn)行某種操作,把其結(jié)果收集起來(lái)。

比如選出數(shù)據(jù)庫(kù)中的某一列進(jìn)行加減操作,或者針對(duì)某些特殊的值做平方的處理。

我們先來(lái)看一個(gè)例子:

>>> test = [1, 2, 3, 4, 5, 6]
>>> square = []
>>> for x in test:
? ? square.append(x*x)

? ??
>>> square
[1, 4, 9, 16, 25, 36]
>>>

此時(shí)就可以利用 Pythonmap,允許您在不使用循環(huán)的顯式中處理和轉(zhuǎn)換所有項(xiàng)目,該技術(shù)通常稱為映射。當(dāng)您需要將轉(zhuǎn)換函數(shù)應(yīng)用于可迭代并將其轉(zhuǎn)換為新的迭代時(shí),map 就能夠有其用武之地。

>>> test = [1, 2, 3, 4, 5, 6]
>>>?
>>> def square(num):
? ? return num*num

>>> list(map(square, test))
[1, 4, 9, 16, 25, 36]
>>>

如上,我們會(huì)傳入一個(gè)自定義的函數(shù) ??square()??  來(lái)更加一般化地使用它,也就是對(duì)列表中的每一個(gè)元素都應(yīng)用這個(gè)函數(shù)。

map 對(duì)列表中的每一個(gè)元素都調(diào)用了 square 函數(shù),并將返回值收集到一個(gè)新的列表中。

正因?yàn)槲覀冃枰远x一個(gè) square 函數(shù),結(jié)合上一篇文章 ? ?lambda 函數(shù)??的簡(jiǎn)單介紹中。我們可以利用 lambda 直接生成這個(gè)匿名函數(shù),也就是可以寫出這樣的代碼實(shí)現(xiàn)相同的功能:

>>> list(map((lambda x: x*x), test))
[1, 4, 9, 16, 25, 36]
>>>

map 傳入內(nèi)置 Python 函數(shù)

除了自定義函數(shù),還可以 map 中傳入內(nèi)置的 Python 函數(shù)。例如,如果您有一個(gè)字符串列表,您可以輕松地創(chuàng)建一個(gè)計(jì)算該字符串列表長(zhǎng)度的新列表:

>>> name = ["Sam", "Dwen", "Kyrie"]
>>> list(map(len, name))
[3, 4, 5]
>>>

map 高級(jí)用法

map 不單能實(shí)現(xiàn) for 循環(huán)能實(shí)現(xiàn)的同樣的方式,還有性能優(yōu)勢(shì)。map 的高級(jí)用法比如:在一個(gè)可序列類型中,map 會(huì)按照順序,并行地從各個(gè)序列中逐項(xiàng)取出一組又一組參數(shù),然后傳入函數(shù)中:

>>> pow(2, 8)
256
>>> pow(3,8)
6561
>>> list(map(pow, [1,2,3], [8, 8, 8]))
[1, 256, 6561]
>>>

能看到上述代碼的結(jié)果,map 對(duì)傳入的每個(gè)序列并行各自取一個(gè)值。

二、map 與列表推導(dǎo)式

map 調(diào)用其實(shí)與列表推導(dǎo)式相似。

>>> test = [1, 2, 3, 4, 5, 6]
>>> [x*x for x in test]
[1, 4, 9, 16, 25, 36]
>>> list(map((lambda x: x*x), test))
[1, 4, 9, 16, 25, 36]

但是 map 在一般情況下會(huì)比列表推導(dǎo)式運(yùn)行更快,而且編寫的代碼也會(huì)更少。而且有一點(diǎn)很重要:通過(guò)使用圓括號(hào)而不是方括號(hào)來(lái)包圍一個(gè)推導(dǎo),能創(chuàng)建一個(gè)按需產(chǎn)生值的對(duì)象,減少了內(nèi)存又減少了程序的響應(yīng)時(shí)間。

三、選擇可迭代對(duì)象中的元素:filter

map 函數(shù)是將 Python 函數(shù)式編程工具集中一個(gè)主要也相對(duì)明確的代表。而 filter 和 reduce 分別實(shí)現(xiàn)了基于一個(gè)測(cè)試函數(shù)選擇可迭代對(duì)象的元素,以及向”元素對(duì)“ 應(yīng)用函數(shù)的功能。

下面來(lái)看一個(gè)調(diào)用 filter 挑出一個(gè)序列中大于零的元素:

>>> list(range(-10, 10))
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(filter((lambda x : x > 0), range(-10, 10)))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

filter 對(duì)于序列或可迭代對(duì)象中的元素,如果函數(shù)對(duì)該元素返回了 True 值,這個(gè)元素就會(huì)被加入到結(jié)果列表中。

與 map 一樣,filter 也能用一個(gè) for 循環(huán)來(lái)等效,但是 filter 是內(nèi)置的、簡(jiǎn)明的,通常也運(yùn)行得更快:

>>> result = []
>>> for x in range(-10, 10):
? ? if x > 0:
? ? ? ? result.append(x)

? ? ? ??
>>> resullt
[1, 2, 3, 4, 5, 6, 7, 8, 9]

同樣的功能,我們也能用列表推導(dǎo)式來(lái)實(shí)現(xiàn):

>>> [x for x in range(-10,10) if x > 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

四、合并可迭代對(duì)象中的元素: reduce

Python的 reduce()是一種函數(shù),它在 Python 標(biāo)準(zhǔn)庫(kù)中居住在一個(gè)名為 ??functools??  的模塊中:

from functools import reduce

通過(guò) reduce 來(lái)計(jì)算一個(gè)列表中所有元素加起來(lái)的和:

>>> reduce((lambda x, y: x + y),[1,2,3,4,5])
15

reduce 會(huì)將當(dāng)前的和列表中的下一個(gè)元素傳入列出的 lambda 函數(shù),在默認(rèn)條件下,序列中的第一個(gè)元素初始化了起始值。

使用 reduce 的這種用法也與如下使用 for 循環(huán)實(shí)現(xiàn)了同樣的功能:

>>> test = [1, 2, 3, 4, 5]
>>> result = test[0]
>>> for x in test[1:]:
? ? result ?= result + x
? ??
>>> result
15

五、總結(jié)

  • map 包括將轉(zhuǎn)換函數(shù)應(yīng)用于可迭代對(duì)象以生成新的可迭代對(duì)象。新迭代中的項(xiàng)是通過(guò)對(duì)原始迭代中的每個(gè)項(xiàng)調(diào)用轉(zhuǎn)換函數(shù)來(lái)生成的。
  • filter 包括將謂詞或布爾值函數(shù)應(yīng)用于迭代以生成新的可迭代。通過(guò)篩選原始可迭代中的任何項(xiàng)目,以使謂詞函數(shù)返回 false 的任何項(xiàng)目生成的項(xiàng)目。
  • reduce 包括將 reduce 函數(shù)應(yīng)用于迭代以產(chǎn)生單個(gè)累積值。

到此這篇關(guān)于Python 函數(shù)編編程的三大法寶map+filter+reduce分享的文章就介紹到這了,更多相關(guān)Python 法寶map+filter+reduce內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論