最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年02月01日 10:48:43   作者:PythonMind  
這篇文章主要介紹了python 列表推導(dǎo)和生成器表達(dá)式的使用方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

序列

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

  1. Python標(biāo)準(zhǔn)庫用C實(shí)現(xiàn)了豐富的序列類型。
  2. 列表推導(dǎo),就是指a = [x for x in something]這種寫法。
  3. 生成器表達(dá)式用于生成列表外的其他類型的序列,它跟列表推導(dǎo)的區(qū)別僅僅在于方括號(hào)換成圓括號(hào),如b = tuple(x for x in something) 。
  4. array.array('I', x for x in something) ,array構(gòu)造方法的第一個(gè)參數(shù)指定了數(shù)組中數(shù)字的存儲(chǔ)方式。
  5. 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》

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

相關(guān)文章

  • Python企業(yè)編碼生成系統(tǒng)之系統(tǒng)主要函數(shù)設(shè)計(jì)詳解

    Python企業(yè)編碼生成系統(tǒng)之系統(tǒng)主要函數(shù)設(shè)計(jì)詳解

    這篇文章主要介紹了Python企業(yè)編碼生成系統(tǒng)之系統(tǒng)主要函數(shù)設(shè)計(jì),涉及目錄操作、文件讀寫、驗(yàn)證判斷、編碼輸出等功能實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Python 一篇文章看懂時(shí)間日期對(duì)象

    Python 一篇文章看懂時(shí)間日期對(duì)象

    學(xué)習(xí)每一門語言多多少少會(huì)用到與時(shí)間相關(guān)的東西,咱們今天呢就談一談Python中的時(shí)間與日期對(duì)象。在Python中時(shí)間對(duì)象一般可以用來測(cè)量效率。日期對(duì)象用來處理日期與字符串之間的關(guān)系
    2022-03-03
  • Python在Windows環(huán)境下的文件路徑問題及解決辦法

    Python在Windows環(huán)境下的文件路徑問題及解決辦法

    在Python中處理Windows路徑時(shí),經(jīng)常會(huì)遇到一些特殊的問題,在Windows中,路徑使用反斜杠(\)作為分隔符,而在其他操作系統(tǒng)中,路徑使用正斜杠(/)作為分隔符,本文給大家介紹了Python在Windows環(huán)境下的文件路徑問題及解決辦法,需要的朋友可以參考下
    2024-06-06
  • Django使用uwsgi部署時(shí)的配置以及django日志文件的處理方法

    Django使用uwsgi部署時(shí)的配置以及django日志文件的處理方法

    今天小編就為大家分享一篇Django使用uwsgi部署時(shí)的配置以及django日志文件的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python程序員面試題 你必須提前準(zhǔn)備!

    Python程序員面試題 你必須提前準(zhǔn)備!

    Python程序員面試,這些問題你必須提前準(zhǔn)備!供廣大Python程序員參考,預(yù)祝大家順利通過面試。
    2018-01-01
  • Redis之windows下主從復(fù)制案例講解

    Redis之windows下主從復(fù)制案例講解

    這篇文章主要介紹了Redis之windows下主從復(fù)制案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 在python中獲取div的文本內(nèi)容并和想定結(jié)果進(jìn)行對(duì)比詳解

    在python中獲取div的文本內(nèi)容并和想定結(jié)果進(jìn)行對(duì)比詳解

    今天小編就為大家分享一篇在python中獲取div的文本內(nèi)容并和想定結(jié)果進(jìn)行對(duì)比詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python selenium的基本使用方法分析

    Python selenium的基本使用方法分析

    這篇文章主要介紹了Python selenium的基本使用方法,結(jié)合實(shí)例形式分析了Python使用selenium模塊進(jìn)行web自動(dòng)化測(cè)試的基本模塊導(dǎo)入、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • PyQt5+PyQt5Designer的安裝步驟

    PyQt5+PyQt5Designer的安裝步驟

    本文主要介紹了PyQt5+PyQt5Designer的安裝步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 給Python IDLE加上自動(dòng)補(bǔ)全和歷史功能

    給Python IDLE加上自動(dòng)補(bǔ)全和歷史功能

    這篇文章主要介紹了給Python IDLE加上自動(dòng)補(bǔ)全和歷史功能,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

浮山县| 呈贡县| 江华| 泉州市| 博兴县| 合川市| 达拉特旗| 望奎县| 黄山市| 招远市| 岳阳市| 邵武市| 博爱县| 霍林郭勒市| 广昌县| 金华市| 乌审旗| 金川县| 黄石市| 昌平区| 陆丰市| 五原县| 石棉县| 珲春市| 文山县| 洱源县| 建平县| 珠海市| 丹东市| 昭通市| 淮北市| 基隆市| 静安区| 渝北区| 凤城市| 信丰县| 台中县| 正蓝旗| 新野县| 习水县| 乌鲁木齐县|