床長(zhǎng)人工智能教程免費(fèi)擴(kuò)展211
朋友們,如需轉(zhuǎn)載請(qǐng)標(biāo)明出處:[https://blog.csdn.net/jiangjunshow](https://blog.csdn.net/jiangjunshow)
聲明:在人工智能技術(shù)教學(xué)期間,不少學(xué)生向我提一些python相關(guān)的問題,所以為了讓同學(xué)們掌握更多擴(kuò)展知識(shí)更好地理解AI技術(shù),我讓助理負(fù)責(zé)分享這套python系列教程,希望能幫到大家!由于這套python教程不是由我所寫,所以不如我的AI技術(shù)教學(xué)風(fēng)趣幽默,學(xué)起來比較枯燥;但它的知識(shí)點(diǎn)還是講到位的了,也值得閱讀!想要學(xué)習(xí)AI技術(shù)的同學(xué)可以點(diǎn)擊跳轉(zhuǎn)到我的[教學(xué)網(wǎng)站](https://www.captainai.net/csdn)。PS:看不懂本篇文章的同學(xué)請(qǐng)先看前面的文章,循序漸進(jìn)每天學(xué)一點(diǎn)就不會(huì)覺得難了!
編程中我們常常要做的一件事就是對(duì)列表中每一個(gè)元素都進(jìn)行一個(gè)操作。例如,在一個(gè)列表counter中更新所有的數(shù)字,我們可以簡(jiǎn)單地通過一個(gè)for循環(huán)來實(shí)現(xiàn)。
```
>>>counters = [1,2,3,4]
>>>
>>>updated = []
>>>for x in counters:
...? ? updated.append(x + 10)? ? ?# Add 10 to each item
...
>>>updated
[11,12,13,14]
```
因?yàn)檫@是一個(gè)常見的操作,Python已經(jīng)為我們提供了一個(gè)內(nèi)置的工具函數(shù)——就是map函數(shù)。它會(huì)對(duì)一個(gè)序列對(duì)象中的每一個(gè)元素應(yīng)用被傳入的函數(shù)。如下所示。
```
>>>def inc(x): return x + 10? ? # Function to be run
...
>>>list(map(inc,counters))? ? ?# Collect results
[11,12,13,14]
```
map對(duì)列表中的每個(gè)元素都調(diào)用了inc函數(shù)。別忘了,map在Python 3.0中是一個(gè)可迭代對(duì)象,因此,在這里,我們用一個(gè)列表list調(diào)用來迫使它生成所有的結(jié)果以顯示,這在Python 2.6中不是必需的。
由于map期待傳入一個(gè)函數(shù),這恰好是lambda常出現(xiàn)的地方之一:
```
>>>list(map((lambda x: x + 3),counters)) # Function expression
[4,5,6,7]
```
這里,函數(shù)將會(huì)為counters列表中的每一個(gè)元素加3。因?yàn)檫@個(gè)函數(shù)不會(huì)在其他的地方用到,所以將它寫成了一行的lambda。
某些程度上來說,使用map與for循環(huán)是等效的,我們可以自己編寫一個(gè)類似map的映射工具。
```
>>>def mymap(func,seq):
...? ? res = []
...? ? for x in seq: res.append(func(x))
...? ? return res
```
我們可以用內(nèi)置函數(shù)或我們自己的對(duì)等形式將其映射到一個(gè)序列:
```
>>>list(map(inc,[1,2,3]))? ? ? # Built-in is an iterator
[11,12,13]
>>>mymap(inc,[1,2,3])? ? ? ? ? # Ours builds a list (see generators)
[11,12,13]
```
盡管如此,因?yàn)閙ap是內(nèi)置函數(shù),所以有一些性能方面的優(yōu)勢(shì)(簡(jiǎn)而言之,它要比自己編寫的for循環(huán)更快)。所以盡管我們也能夠來模擬map,但是當(dāng)有速度優(yōu)勢(shì)的內(nèi)置函數(shù)已經(jīng)提供了這樣的功能,再去模擬,意義不是很大。
另外map調(diào)用與列表解析很相似,但是map對(duì)每一個(gè)元素應(yīng)用函數(shù)調(diào)用而不是任意的表達(dá)式。因?yàn)檫@點(diǎn)限制,從某種意義上來說,它成為了不太通用的工具。盡管如此,在某些情況下,目前map比列表解析運(yùn)行起來更快,并且它所編寫的代碼也較少。