濮阳杆衣贸易有限公司

主頁 > 知識庫 > python 列表推導(dǎo)和生成器表達式的使用

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

熱門標(biāo)簽:滴滴地圖標(biāo)注公司 江門智能電話機器人 天津塘沽區(qū)地圖標(biāo)注 如何申請400電話代理 杭州房產(chǎn)地圖標(biāo)注 400電話在線如何申請 智能電話機器人調(diào)研 甘肅高頻外呼系統(tǒng) 地圖標(biāo)注可以遠程操作嗎

序列

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

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

列表推導(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方法。實際上可以不用append方法,直接:

symbols = "abc"
codes = [symbol for symbol in symbols]

這叫做列表推導(dǎo),是更加Pythonic的寫法。

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

笛卡爾積是指多個序列中元素所有組合,我們用列表推導(dǎo)來實現(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:

運行結(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:

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

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

生成器表達式

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

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

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

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

colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = ((color, size) for color in colors for size in sizes)

運行結(jié)果是:

generator object genexpr> at 0x000001FD57D2DB30>

generator object,結(jié)果是一個生成器對象。因為生成器表達式在每次迭代時才會逐個產(chǎn)出元素,所以這里的結(jié)果并不是已經(jīng)創(chuàng)建好的元組。列表推導(dǎo)才會一次性產(chǎn)生新列表所有元素。

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

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

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

yield作用和return差不多,后面會講到。

Tips

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

  1. Python標(biāo)準(zhǔn)庫用C實現(xiàn)了豐富的序列類型。
  2. 列表推導(dǎo),就是指a = [x for x in something]這種寫法。
  3. 生成器表達式用于生成列表外的其他類型的序列,它跟列表推導(dǎo)的區(qū)別僅僅在于方括號換成圓括號,如b = tuple(x for x in something) 。
  4. array.array('I', x for x in something) ,array構(gòu)造方法的第一個參數(shù)指定了數(shù)組中數(shù)字的存儲方式。
  5. for tshirt in [c, s for c in colors for s in sizes],列表推導(dǎo)會一次性生成這個列表,存儲在內(nèi)存中,占用資源。for tshirt in ('%s %s' for c in colors for s in sizes),生成器表達式只在循環(huán)時逐個產(chǎn)出元素,避免額外的內(nèi)存占用,省掉了運行for循環(huán)的開銷。

小結(jié)

本文首先介紹了序列的概念,然后演示了Python常規(guī)騷操作——列表推導(dǎo),最后引出了生成器表達式這個看似復(fù)雜實則簡單的語法。列表是可變的,它有個不可變的孿生兄弟,元組。

參考資料:

《流暢的Python》

以上就是python 列表推導(dǎo)和生成器表達式的使用的詳細內(nèi)容,更多關(guān)于python 列表推導(dǎo)和生成器表達式的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python 6行代碼制作月歷生成器
  • 徹底搞懂python 迭代器和生成器
  • Python生成器傳參數(shù)及返回值原理解析
  • Python faker生成器生成虛擬數(shù)據(jù)代碼實例
  • Python3與fastdfs分布式文件系統(tǒng)如何實現(xiàn)交互
  • python django框架中使用FastDFS分布式文件系統(tǒng)的安裝方法
  • python 中文件輸入輸出及os模塊對文件系統(tǒng)的操作方法
  • 用Python編寫一個簡單的FUSE文件系統(tǒng)的教程
  • python基礎(chǔ)學(xué)習(xí)之生成器與文件系統(tǒng)知識總結(jié)

標(biāo)簽:東莞 重慶 廊坊 漢中 德宏 河池 長春 臨汾

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python 列表推導(dǎo)和生成器表達式的使用》,本文關(guān)鍵詞  python,列表,推導(dǎo),和,生,成器,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python 列表推導(dǎo)和生成器表達式的使用》相關(guān)的同類信息!
  • 本頁收集關(guān)于python 列表推導(dǎo)和生成器表達式的使用的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    象山县| 玉山县| 略阳县| 蒲城县| 河西区| 平陆县| 乐都县| 贡嘎县| 峨边| 织金县| 金川县| 嘉定区| 九龙城区| 西林县| 宜宾县| 沅江市| 三穗县| 会理县| 宣恩县| 钟祥市| 汤原县| 张家港市| 汕尾市| 海晏县| 金溪县| 建湖县| 洛南县| 尼勒克县| 永德县| 宣威市| 赣州市| 阳曲县| 嘉义县| 上饶市| 白城市| 收藏| 涞源县| 泗洪县| 桐庐县| 五常市| 玉田县|