溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中列表推導(dǎo)和生成器表達(dá)式如何使用

發(fā)布時間:2021-07-10 16:43:27 來源:億速云 閱讀:202 作者:Leah 欄目:編程語言

Python中列表推導(dǎo)和生成器表達(dá)式如何使用,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

 

序列

序列是指一組數(shù)據(jù),按存放類型分為容器序列與扁平序列,按能否被修改分為不可變序列與可變序列。

容器序列與扁平序列

容器序列存放的是對象的引用,包括list、tuple、collections.deque。

扁平序列存放的是對象的值,包括str、bytes、bytearray、memoryview和array.array。

扁平序列的值是字符、字節(jié)和數(shù)值這種基礎(chǔ)類型。

不可變序列與可變序列

不可變序列,包括tuple、str、bytes。

可變序列,包括list、bytearray、array.array、collection.deque、memoryview。

下圖左邊是父類,右邊是子類,可以看出可變序列是從不可變序列繼承來的,擴(kuò)展了可變方法:

Python中列表推導(dǎo)和生成器表達(dá)式如何使用

列表推導(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ī)定,完全可以憑借自我喜好來選擇。

笛卡爾積是指多個序列中元素所有組合,我們用列表推導(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。

注意這行代碼有兩個for循環(huán),等價于:

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]

等價于:

for size in sizes:     for color in colors:

運(yùn)行結(jié)果是不同的,觀察第2個元素:

[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]

生成器表達(dá)式

一般接觸到生成器時,都要講yield關(guān)鍵字,看似有點(diǎn)復(fù)雜,然而卻很簡單,生成器就像列表推導(dǎo)一樣,只不過是用來生成其他類型序列的,比如元組:

symbols = "abc" codes = (symbol for symbol in symbols)

它的語法非常簡單,把列表推導(dǎo)的中括號[]換成小括號(),就可以了。

語法相似,本質(zhì)上卻有很大區(qū)別,我們試著用生成器表達(dá)式來實(shí)現(xiàn)笛卡爾積,看看會有什么變化:

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é)果是一個生成器對象。因?yàn)樯善鞅磉_(dá)式在每次迭代時才會逐個產(chǎn)出元素,所以這里的結(jié)果并不是已經(jīng)創(chuàng)建好的元組。列表推導(dǎo)才會一次性產(chǎn)生新列表所有元素。

通過迭代把生成器表達(dá)式結(jié)果輸出:

for tshirt in tshirts:     print(tshirt)
('black', 'S') ('white', 'S') ('black', 'M') ('white', 'M') ('black', 'L') ('white', 'L')

生成器表達(dá)式可以提升程序性能,比如要計算兩個各有1000個元素的列表的笛卡爾積,生成器表達(dá)式可以幫忙省掉運(yùn)行for循環(huán)的開銷,即一個包含100萬個元素的列表。

看完上述內(nèi)容,你們掌握Python中列表推導(dǎo)和生成器表達(dá)式如何使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI