亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python 列表推導(dǎo)和生成器表達(dá)式的使用

瀏覽:3日期:2022-06-28 16:27:27
序列

序列是指一組數(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。

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

python 列表推導(dǎo)和生成器表達(dá)式的使用

列表推導(dǎo)

Python語(yǔ)言魅力在于簡(jiǎn)潔,這能從最常見的創(chuàng)建列表體現(xiàn)出來(lái),比如我們想把字符串'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的寫法。

無(wú)論是編寫效率還是可閱讀性,列表推導(dǎo)都更勝一籌,可以說是構(gòu)建列表的快捷方式。但是不能濫用,通用原則是,如果列表推導(dǎo)的代碼超過了兩行,就要考慮用append了。這不是規(guī)定,完全可以憑借自我喜好來(lái)選擇。

笛卡爾積是指多個(gè)序列中元素所有組合,我們用列表推導(dǎo)來(lái)實(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ù)雜,然而卻很簡(jiǎn)單,生成器就像列表推導(dǎo)一樣,只不過是用來(lái)生成其他類型序列的,比如元組:

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

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

語(yǔ)法相似,本質(zhì)上卻有很大區(qū)別,我們?cè)囍蒙善鞅磉_(dá)式來(lái)實(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萬(wàn)個(gè)元素的列表。

yield作用和return差不多,后面會(huì)講到。

Tips

本小節(jié)內(nèi)容是我看《流暢的Python》第一遍時(shí)記錄的知識(shí)點(diǎn):

Python標(biāo)準(zhǔn)庫(kù)用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í)則簡(jiǎn)單的語(yǔ)法。列表是可變的,它有個(gè)不可變的孿生兄弟,元組。

參考資料:

《流暢的Python》

以上就是python 列表推導(dǎo)和生成器表達(dá)式的使用的詳細(xì)內(nèi)容,更多關(guān)于python 列表推導(dǎo)和生成器表達(dá)式的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 色视频在线观看网站 | 亚洲色图综合在线 | 久久中文字幕美谷朱里 | 中文字幕亚洲综合 | 欧美最刺激好看的一级毛片 | 性情视频在线高清免费 | 午夜精品久久久久久久爽 | 一区二区三区网站在线免费线观看 | 久久久精品久久 | 色五夜婷婷| 国产免费播放一区二区三区 | 国产亚洲欧美另类一区二区三区 | 乱人xxx国语对白91 | 免费人成年短视频在线观看免费网站 | 亚洲欧美日韩在线2020 | 成人免费久久精品国产片久久影院 | 国产青青在线 | 日本一区二区三区日本免费 | 国产香港特级一级毛片 | 中文字幕在线播放视频 | a级在线看 | 国产精品夜夜春夜夜爽久久 | 一本本久综合久久爱 | 六月丁香婷婷色狠狠久久 | 草草影院ccyy国产日本欧美 | 制服丝袜中文字幕在线观看 | 一区二区三区欧美 | 国产一区二区三区欧美 | 午夜插插| 国内真实下药迷j在线观看 国内主播大秀福利视频在线看 | 欧美日韩国产一区二区三区在线观看 | 亚洲第一久久 | 亚洲国产成人va在线观看 | 高清亚洲精品酒店一区 | 欧美一级毛片美99毛片 | 曰本一级毛片免费 | 成人精品人成网站 | 久久综合九色综合亚洲小说 | 国产精品一区二区三区四区五区 | 狠狠五月天中文字幕 | 可以直接看的av网址站 |