python 列表推導(dǎo)和生成器表達(dá)式的使用
序列
序列是指一組數(shù)據(jù),按存放類型分為容器序列與扁平序列,按能否被修改分為不可變序列與可變序列。
容器序列與扁平序列
容器序列存放的是對(duì)象的引用,包括list、tuple、collections.deque。
扁平序列存放的是對(duì)象的值,包括str、bytes、bytearray、memoryview和array.array。
扁平序列的值是字符、字節(jié)和數(shù)值這種基礎(chǔ)類型。
不可變序列與可變序列
不可變序列,包括tuple、str、bytes。
可變序列,包括list、bytearray、array.array、collection.deque、memoryview。
下圖左邊是父類,右邊是子類,可以看出可變序列是從不可變序列繼承來的,擴(kuò)展了可變方法:
列表推導(dǎo)
Python語言魅力在于簡潔,這能從最常見的創(chuàng)建列表體現(xiàn)出來,比如我們想把字符串"abc"轉(zhuǎn)換成新列表["a", "b", "c"],常規(guī)寫法:
symbols = "abc" codes = [] for symbol in symbols: codes.append(symbol) print(codes) # ["a", "b", "c"]
用到了for循環(huán)和列表append方法。實(shí)際上可以不用append方法,直接:
symbols = "abc" codes = [symbol for symbol in symbols]
這叫做列表推導(dǎo),是更加Pythonic的寫法。
無論是編寫效率還是可閱讀性,列表推導(dǎo)都更勝一籌,可以說是構(gòu)建列表的快捷方式。但是不能濫用,通用原則是,如果列表推導(dǎo)的代碼超過了兩行,就要考慮用append了。這不是規(guī)定,完全可以憑借自我喜好來選擇。
笛卡爾積是指多個(gè)序列中元素所有組合,我們用列表推導(dǎo)來實(shí)現(xiàn)笛卡爾積:
colors = ["black", "white"] sizes = ["S", "M", "L"] tshirts = [(color, size) for color in colors for size in sizes]
一行代碼搞定!Life is short,use Python,list comprehension is wonderful,amazing。
注意這行代碼有兩個(gè)for循環(huán),等價(jià)于:
for color in colors: for size in sizes:
運(yùn)行結(jié)果是:
[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
如果換一下順序:
[(color, size) for color in colors for size in sizes]
等價(jià)于:
for size in sizes: for color in colors:
運(yùn)行結(jié)果是不同的,觀察第2個(gè)元素:
[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]
生成器表達(dá)式
一般接觸到生成器時(shí),都要講yield
關(guān)鍵字,看似有點(diǎn)復(fù)雜,然而卻很簡單,生成器就像列表推導(dǎo)一樣,只不過是用來生成其他類型序列的,比如元組:
symbols = "abc" codes = (symbol for symbol in symbols)
它的語法非常簡單,把列表推導(dǎo)的中括號(hào)[]換成小括號(hào)(),就可以了。
語法相似,本質(zhì)上卻有很大區(qū)別,我們?cè)囍蒙善鞅磉_(dá)式來實(shí)現(xiàn)笛卡爾積,看看會(huì)有什么變化:
colors = ["black", "white"] sizes = ["S", "M", "L"] tshirts = ((color, size) for color in colors for size in sizes)
運(yùn)行結(jié)果是:
<generator object <genexpr> at 0x000001FD57D2DB30>
generator object,結(jié)果是一個(gè)生成器對(duì)象。因?yàn)樯善鞅磉_(dá)式在每次迭代時(shí)才會(huì)逐個(gè)產(chǎn)出元素,所以這里的結(jié)果并不是已經(jīng)創(chuàng)建好的元組。列表推導(dǎo)才會(huì)一次性產(chǎn)生新列表所有元素。
通過迭代把生成器表達(dá)式結(jié)果輸出:
for tshirt in tshirts: print(tshirt)
('black', 'S') ('white', 'S') ('black', 'M') ('white', 'M') ('black', 'L') ('white', 'L')
生成器表達(dá)式可以提升程序性能,比如要計(jì)算兩個(gè)各有1000個(gè)元素的列表的笛卡爾積,生成器表達(dá)式可以幫忙省掉運(yùn)行for循環(huán)的開銷,即一個(gè)包含100萬個(gè)元素的列表。
yield作用和return差不多,后面會(huì)講到。
Tips
本小節(jié)內(nèi)容是我看《流暢的Python》第一遍時(shí)記錄的知識(shí)點(diǎn):
- Python標(biāo)準(zhǔn)庫用C實(shí)現(xiàn)了豐富的序列類型。
- 列表推導(dǎo),就是指
a = [x for x in something]
這種寫法。 - 生成器表達(dá)式用于生成列表外的其他類型的序列,它跟列表推導(dǎo)的區(qū)別僅僅在于方括號(hào)換成圓括號(hào),如
b = tuple(x for x in something)
。 array.array('I', x for x in something)
,array構(gòu)造方法的第一個(gè)參數(shù)指定了數(shù)組中數(shù)字的存儲(chǔ)方式。for tshirt in [c, s for c in colors for s in sizes]
,列表推導(dǎo)會(huì)一次性生成這個(gè)列表,存儲(chǔ)在內(nèi)存中,占用資源。for tshirt in ('%s %s' for c in colors for s in sizes)
,生成器表達(dá)式只在循環(huán)時(shí)逐個(gè)產(chǎn)出元素,避免額外的內(nèi)存占用,省掉了運(yùn)行for循環(huán)的開銷。
小結(jié)
本文首先介紹了序列的概念,然后演示了Python常規(guī)騷操作——列表推導(dǎo),最后引出了生成器表達(dá)式這個(gè)看似復(fù)雜實(shí)則簡單的語法。列表是可變的,它有個(gè)不可變的孿生兄弟,元組。
參考資料:
以上就是python 列表推導(dǎo)和生成器表達(dá)式的使用的詳細(xì)內(nèi)容,更多關(guān)于python 列表推導(dǎo)和生成器表達(dá)式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python 6行代碼制作月歷生成器
- 徹底搞懂python 迭代器和生成器
- Python生成器傳參數(shù)及返回值原理解析
- Python faker生成器生成虛擬數(shù)據(jù)代碼實(shí)例
- Python3與fastdfs分布式文件系統(tǒng)如何實(shí)現(xiàn)交互
- python django框架中使用FastDFS分布式文件系統(tǒng)的安裝方法
- python 中文件輸入輸出及os模塊對(duì)文件系統(tǒng)的操作方法
- 用Python編寫一個(gè)簡單的FUSE文件系統(tǒng)的教程
- python基礎(chǔ)學(xué)習(xí)之生成器與文件系統(tǒng)知識(shí)總結(jié)
相關(guān)文章
回歸預(yù)測分析python數(shù)據(jù)化運(yùn)營線性回歸總結(jié)
本文主要介紹了python數(shù)據(jù)化運(yùn)營中的線性回歸一般應(yīng)用場景,常用方法,回歸實(shí)現(xiàn),回歸評(píng)估指標(biāo),效果可視化等,并采用了回歸預(yù)測分析的數(shù)據(jù)預(yù)測方法2021-08-08python實(shí)現(xiàn)的陽歷轉(zhuǎn)陰歷(農(nóng)歷)算法
這篇文章主要介紹了python實(shí)現(xiàn)的陽歷轉(zhuǎn)陰歷(農(nóng)歷)算法,需要的朋友可以參考下2014-04-04Python中round()函數(shù)實(shí)現(xiàn)數(shù)值的四舍五入
這篇文章主要給大家介紹了關(guān)于Python中round()函數(shù)實(shí)現(xiàn)數(shù)值的四舍五入,round()是python自帶的一個(gè)函數(shù),用于數(shù)字的四舍五入,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05Pandas按周/月/年統(tǒng)計(jì)數(shù)據(jù)介紹
大家好,本篇文章主要講的是Pandas按周/月/年統(tǒng)計(jì)數(shù)據(jù)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Python通過RabbitMQ服務(wù)器實(shí)現(xiàn)交換機(jī)功能的實(shí)例教程
RabbitMQ是一個(gè)基于消息隊(duì)列的服務(wù)器程序,Python可以通過Pika庫來驅(qū)動(dòng)它,這里我們將來看一個(gè)Python通過RabbitMQ服務(wù)器實(shí)現(xiàn)交換機(jī)功能的實(shí)例教程:2016-06-06