python生成器表達(dá)式和列表解析
絕大多數(shù)情況下,遍歷一個(gè)集合都是為了對元素應(yīng)用某個(gè)動作或是進(jìn)行篩選。如果看過本文的第二部分,你應(yīng)該還記得有內(nèi)建函數(shù)map和filter提供了這些功能,但Python仍然為這些操作提供了語言級的支持。
(x+1 for x in lst) #生成器表達(dá)式,返回迭代器。外部的括號可在用于參數(shù)時(shí)省略。 [x+1 for x in lst] #列表解析,返回list
如你所見,生成器表達(dá)式和列表解析(注:這里的翻譯有很多種,比如列表展開、列表推導(dǎo)等等,指的是同一個(gè)意思)的區(qū)別很小,所以人們提到這個(gè)特性時(shí),簡單起見往往只描述成列表解析。然而由于返回迭代器時(shí),并不是在一開始就計(jì)算所有的元素,這樣能得到更多的靈活性并且可以避開很多不必要的計(jì)算,所以除非你明確希望返回列表,否則應(yīng)該始終使用生成器表達(dá)式。接下來的文字里我就不區(qū)分這兩種形式了:)
你也可以為列表解析提供if子句進(jìn)行篩選:
(x+1 for x in lst if x!=0)
或者提供多條for子句進(jìn)行嵌套循環(huán),嵌套次序就是for子句的順序:
((x, y) for x in range(3) for y in range(x))
列表解析就是鮮明的Pythonic。我常遇到兩個(gè)使用列表解析的問題,本應(yīng)歸屬于最佳實(shí)踐,但這兩個(gè)問題非常典型,所以不妨在這里提一下:
第一個(gè)問題是,因?yàn)閷υ貞?yīng)用的動作太復(fù)雜,不能用一個(gè)表達(dá)式寫出來,所以不使用列表解析。這是典型的思想沒有轉(zhuǎn)變的例子,如果我們將動作封裝成函數(shù),那不就是一個(gè)表達(dá)式了么?
第二個(gè)問題是,因?yàn)閕f子句里的條件需要計(jì)算,同時(shí)結(jié)果也需要進(jìn)行同樣的計(jì)算,不希望計(jì)算兩遍,就像這樣:
(x.doSomething() for x in lst if x.doSomething()>0)
這樣寫確實(shí)很糟糕,但組合一下列表解析即可解決:
(x for x in (y.doSomething() for y in lst) if x>0)
內(nèi)部的列表解析變量其實(shí)也可以用x,但為清晰起見我們改成了y。或者更清楚的,可以寫成兩個(gè)表達(dá)式:
tmp = (x.doSomething() for x in lst) (x for x in tmp if x > 0)
列表解析可以替代絕大多數(shù)需要用到map和filter的場合,可能正因?yàn)榇?,著名的靜態(tài)檢查工具pylint將map和filter的使用列為了警告。
相關(guān)文章
YOLOv5車牌識別實(shí)戰(zhàn)教程(一)引言與準(zhǔn)備工作
這篇文章主要介紹了YOLOv5車牌識別實(shí)戰(zhàn)教程(一)引言與準(zhǔn)備工作,在這個(gè)教程中,我們將一步步教你如何使用YOLOv5進(jìn)行車牌識別,幫助你快速掌握YOLOv5車牌識別技能,需要的朋友可以參考下2023-04-0420行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具
本文主要介紹了Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07python網(wǎng)絡(luò)編程之多線程同時(shí)接受和發(fā)送
這篇文章主要為大家詳細(xì)介紹了python網(wǎng)絡(luò)編程之多線程同時(shí)接受和發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Python startswith()和endswith() 方法原理解析
這篇文章主要介紹了Python startswith()和endswith() 方法原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Python將xml和xsl轉(zhuǎn)換為html的方法
這篇文章主要介紹了Python將xml和xsl轉(zhuǎn)換為html的方法,實(shí)例分析了使用libxml2模塊操作xml和xsl轉(zhuǎn)換為html的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03使用PyInstaller將Python程序文件轉(zhuǎn)換為可執(zhí)行程序文件
與py2exe一樣,PyInstaller程序也可以將Python的.py程序文件轉(zhuǎn)換為.exe,并且還有Linux的版本,下面我們就來詳細(xì)看一下如何使用PyInstaller將Python程序文件轉(zhuǎn)換為可執(zhí)行程序文件2016-07-07Python實(shí)現(xiàn)滑塊驗(yàn)證碼詳解
驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動化的場景中。傳統(tǒng)的字符型驗(yàn)證安全性已經(jīng)名存實(shí)亡的情況下,各種新型的驗(yàn)證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇Python實(shí)現(xiàn)滑塊驗(yàn)證碼2022-05-05