床長人工智能教程免費(fèi)擴(kuò)展213
朋友們,如需轉(zhuǎn)載請標(biāo)明出處:[https://blog.csdn.net/jiangjunshow](https://blog.csdn.net/jiangjunshow)
聲明:在人工智能技術(shù)教學(xué)期間,不少學(xué)生向我提一些python相關(guān)的問題,所以為了讓同學(xué)們掌握更多擴(kuò)展知識更好地理解AI技術(shù),我讓助理負(fù)責(zé)分享這套python系列教程,希望能幫到大家!由于這套python教程不是由我所寫,所以不如我的AI技術(shù)教學(xué)風(fēng)趣幽默,學(xué)起來比較枯燥;但它的知識點(diǎn)還是講到位的了,也值得閱讀!想要學(xué)習(xí)AI技術(shù)的同學(xué)可以點(diǎn)擊跳轉(zhuǎn)到我的[教學(xué)網(wǎng)站](https://www.captainai.net/csdn)。PS:看不懂本篇文章的同學(xué)請先看前面的文章,循序漸進(jìn)每天學(xué)一點(diǎn)就不會覺得難了!
我們已經(jīng)學(xué)習(xí)了map和filter這樣的函數(shù)式編程工具,它們會將操作映射到序列和集合結(jié)果中。由于這是Python編程中的一種常見任務(wù),所以Python最終創(chuàng)造了一種新的表達(dá)式——列表解析。簡而言之,列表解析會把任意一個(gè)表達(dá)式而不是一個(gè)函數(shù)應(yīng)用于一個(gè)迭代對象中的元素。
讓我們舉一個(gè)例子來幫助大家理解吧。Python的內(nèi)置ord函數(shù)會返回一個(gè)單個(gè)字符的ASCII整數(shù)編碼(chr內(nèi)置函數(shù)是它的逆過程,它將一個(gè)ASCII整數(shù)編碼轉(zhuǎn)換為字符):
```
>>>ord('s')
115
```
現(xiàn)在,假設(shè)我們希望收集整個(gè)字符串中的所有字符的ASCII編碼。我們可以使用一個(gè)簡單的for循環(huán),并將結(jié)果附加在列表中:
```
>>>res = []
>>>for x in 'spam':
...? ? res.append(ord(x))
...
>>>res
[115,112,97,109]
```
然而,現(xiàn)在我們知道了map,我們能夠使用一個(gè)單個(gè)的函數(shù)調(diào)用,而不必關(guān)心代碼中列表的結(jié)構(gòu),從而實(shí)現(xiàn)起來更簡單:
```
>>>res = list(map(ord,'spam'))? ? ? ? # Apply function to sequence
>>>res
[115,112,97,109]
```
我們也能夠通過列表解析表達(dá)式得到相同的結(jié)果——map把一個(gè)函數(shù)映射遍一個(gè)序列,列表解析把一個(gè)表達(dá)式映射遍一個(gè)序列:
```
>>>res = [ord(x) for x in 'spam']? # Apply expression to sequence
>>>res
[115,112,97,109]
```
列表解析在一個(gè)序列的值上應(yīng)用一個(gè)任意表達(dá)式,將其結(jié)果收集到一個(gè)新的列表中并返回。從語法上來說,列表解析是由方括號封裝起來的(為了提醒你它們構(gòu)造了一個(gè)列表)。它的簡單形式是在方括號中編寫一個(gè)表達(dá)式,在后邊跟隨著的看起來就像一個(gè)for循環(huán)的頭部一樣的語句。
上一個(gè)例子的效果與手動進(jìn)行for循環(huán)和map調(diào)用相比,沒有什么不同。然而,列表解析更方便。
```
>>>[x ** 2 for x in range(10)]
[0,1,4,9,16,25,36,49,64,81]
```
上面收集了從0~9數(shù)字的平方。下面是等效的map代碼:
```
>>>list(map((lambda x: x ** 2),range(10)))
[0,1,4,9,16,25,36,49,64,81]
```