python生成器表達(dá)式和列表解析
絕大多數(shù)情況下,遍歷一個(gè)集合都是為了對元素應(yīng)用某個(gè)動(dòng)作或是進(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)用的動(dòng)作太復(fù)雜,不能用一個(gè)表達(dá)式寫出來,所以不使用列表解析。這是典型的思想沒有轉(zhuǎn)變的例子,如果我們將動(dòng)作封裝成函數(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)文章
詳解python pandas 分組統(tǒng)計(jì)的方法
這篇文章主要介紹了詳解pandas python 分組統(tǒng)計(jì)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python實(shí)現(xiàn)生成指定大小文件的示例詳解
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)生成指定大小文件,例如txt/圖片/視頻/csv等,文中的示例代碼講解詳細(xì),需要的可以參考下2023-08-08
Python pydotplus安裝及可視化圖形創(chuàng)建教程
這篇文章主要為大家介紹了Python pydotplus安裝及可視化圖形創(chuàng)建教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Python2.x利用commands模塊執(zhí)行Linux shell命令
這篇文章主要介紹了Python2.x利用commands模塊執(zhí)行Linux shell命令 的相關(guān)資料,需要的朋友可以參考下2016-03-03

