成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

列表推導(dǎo)和生成器表達(dá)式怎么在python中使用-創(chuàng)新互聯(lián)

列表推導(dǎo)和生成器表達(dá)式怎么在python中使用?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

站在用戶的角度思考問題,與客戶深入溝通,找到禹會網(wǎng)站設(shè)計(jì)與禹會網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋禹會地區(qū)。

序列

序列是指一組數(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ò)展了可變方法:

列表推導(dǎo)和生成器表達(dá)式怎么在python中使用

列表推導(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)的中括號[]換成小括號(),就可以了。

語法相似,本質(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é)果是一個(gè)生成器對象。因?yàn)樯善鞅磉_(dá)式在每次迭代時(shí)才會逐個(gè)產(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á)式可以提升程序性能,比如要計(jì)算兩個(gè)各有1000個(gè)元素的列表的笛卡爾積,生成器表達(dá)式可以幫忙省掉運(yùn)行for循環(huán)的開銷,即一個(gè)包含100萬個(gè)元素的列表。

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

Tips

本小節(jié)內(nèi)容是我看《流暢的Python》第一遍時(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ū)別僅僅在于方括號換成圓括號,如b = tuple(x for x in something) 。

  4. array.array('I', x for x in something) ,array構(gòu)造方法的第一個(gè)參數(shù)指定了數(shù)組中數(shù)字的存儲方式。

  5. for tshirt in [c, s for c in colors for s in sizes],列表推導(dǎo)會一次性生成這個(gè)列表,存儲在內(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)的開銷。


看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。

當(dāng)前題目:列表推導(dǎo)和生成器表達(dá)式怎么在python中使用-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://jinyejixie.com/article22/gpsjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、虛擬主機(jī)、企業(yè)建站品牌網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
花莲市| 金阳县| 海伦市| 偃师市| 白沙| 高安市| 通山县| 铜陵市| 邯郸市| 双江| 巴南区| 封丘县| 武强县| 名山县| 河北区| 西华县| 册亨县| 四平市| 三台县| 岑巩县| 高碑店市| 定西市| 灵寿县| 黑龙江省| 卓尼县| 红桥区| 天峻县| 襄垣县| 嫩江县| 原平市| 深州市| 民乐县| 太白县| 衡东县| 温州市| 营口市| 温宿县| 格尔木市| 博白县| 宝山区| 鄂伦春自治旗|