欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python生成器表達式和列表解析

 更新時間:2016年03月10日 11:38:56   投稿:hebedich  
最近在學(xué)習(xí)python的過程中,對列表解析及生成器表達式有點疑惑。從表面上看,兩者很相似,只有一點不同:列表解析采用中括號[]來包含,生成器表達式采用小括號()來包含。本文我們就來詳細看下python生成器表達式和列表解析

絕大多數(shù)情況下,遍歷一個集合都是為了對元素應(yīng)用某個動作或是進行篩選。如果看過本文的第二部分,你應(yīng)該還記得有內(nèi)建函數(shù)map和filter提供了這些功能,但Python仍然為這些操作提供了語言級的支持。

(x+1 for x in lst) #生成器表達式,返回迭代器。外部的括號可在用于參數(shù)時省略。 
[x+1 for x in lst] #列表解析,返回list

如你所見,生成器表達式和列表解析(注:這里的翻譯有很多種,比如列表展開、列表推導(dǎo)等等,指的是同一個意思)的區(qū)別很小,所以人們提到這個特性時,簡單起見往往只描述成列表解析。然而由于返回迭代器時,并不是在一開始就計算所有的元素,這樣能得到更多的靈活性并且可以避開很多不必要的計算,所以除非你明確希望返回列表,否則應(yīng)該始終使用生成器表達式。接下來的文字里我就不區(qū)分這兩種形式了:)

你也可以為列表解析提供if子句進行篩選:

(x+1 for x in lst if x!=0)

或者提供多條for子句進行嵌套循環(huán),嵌套次序就是for子句的順序:

((x, y) for x in range(3) for y in range(x))

列表解析就是鮮明的Pythonic。我常遇到兩個使用列表解析的問題,本應(yīng)歸屬于最佳實踐,但這兩個問題非常典型,所以不妨在這里提一下:

第一個問題是,因為對元素應(yīng)用的動作太復(fù)雜,不能用一個表達式寫出來,所以不使用列表解析。這是典型的思想沒有轉(zhuǎn)變的例子,如果我們將動作封裝成函數(shù),那不就是一個表達式了么?

第二個問題是,因為if子句里的條件需要計算,同時結(jié)果也需要進行同樣的計算,不希望計算兩遍,就像這樣:

(x.doSomething() for x in lst if x.doSomething()>0)

這樣寫確實很糟糕,但組合一下列表解析即可解決:

(x for x in (y.doSomething() for y in lst) if x>0)

內(nèi)部的列表解析變量其實也可以用x,但為清晰起見我們改成了y?;蛘吒宄?,可以寫成兩個表達式:

tmp = (x.doSomething() for x in lst)
(x for x in tmp if x > 0)

列表解析可以替代絕大多數(shù)需要用到map和filter的場合,可能正因為此,著名的靜態(tài)檢查工具pylint將map和filter的使用列為了警告。

相關(guān)文章

  • Python 注釋:解釋和優(yōu)化代碼可讀性

    Python 注釋:解釋和優(yōu)化代碼可讀性

    本文將探討Python中注釋的重要性,以及如何通過注釋解釋和優(yōu)化代碼的可讀性,了解如何正確使用注釋可以提高代碼的可維護性和可理解性
    2023-09-09
  • Python中最好用的json庫orjson用法詳解

    Python中最好用的json庫orjson用法詳解

    orjson是一個用于python的快速、正確的json庫,它的基準是 json最快的python庫,具有全面的單元、集成和互操作性測試,下面這篇文章主要給大家介紹了關(guān)于Python中最好用的json庫orjson用法的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • YOLOv5車牌識別實戰(zhàn)教程(一)引言與準備工作

    YOLOv5車牌識別實戰(zhàn)教程(一)引言與準備工作

    這篇文章主要介紹了YOLOv5車牌識別實戰(zhàn)教程(一)引言與準備工作,在這個教程中,我們將一步步教你如何使用YOLOv5進行車牌識別,幫助你快速掌握YOLOv5車牌識別技能,需要的朋友可以參考下
    2023-04-04
  • 20行Python代碼實現(xiàn)一款永久免費PDF編輯工具

    20行Python代碼實現(xiàn)一款永久免費PDF編輯工具

    本文主要介紹了Python代碼實現(xiàn)一款永久免費PDF編輯工具,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • python網(wǎng)絡(luò)編程之多線程同時接受和發(fā)送

    python網(wǎng)絡(luò)編程之多線程同時接受和發(fā)送

    這篇文章主要為大家詳細介紹了python網(wǎng)絡(luò)編程之多線程同時接受和發(fā)送,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Python字典對象實現(xiàn)原理詳解

    Python字典對象實現(xiàn)原理詳解

    這篇文章主要介紹了Python字典對象實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python startswith()和endswith() 方法原理解析

    Python startswith()和endswith() 方法原理解析

    這篇文章主要介紹了Python startswith()和endswith() 方法原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Python將xml和xsl轉(zhuǎn)換為html的方法

    Python將xml和xsl轉(zhuǎn)換為html的方法

    這篇文章主要介紹了Python將xml和xsl轉(zhuǎn)換為html的方法,實例分析了使用libxml2模塊操作xml和xsl轉(zhuǎn)換為html的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 使用PyInstaller將Python程序文件轉(zhuǎn)換為可執(zhí)行程序文件

    使用PyInstaller將Python程序文件轉(zhuǎn)換為可執(zhí)行程序文件

    與py2exe一樣,PyInstaller程序也可以將Python的.py程序文件轉(zhuǎn)換為.exe,并且還有Linux的版本,下面我們就來詳細看一下如何使用PyInstaller將Python程序文件轉(zhuǎn)換為可執(zhí)行程序文件
    2016-07-07
  • Python實現(xiàn)滑塊驗證碼詳解

    Python實現(xiàn)滑塊驗證碼詳解

    驗證碼作為一種自然人的機器人的判別工具,被廣泛的用于各種防止程序做自動化的場景中。傳統(tǒng)的字符型驗證安全性已經(jīng)名存實亡的情況下,各種新型的驗證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇Python實現(xiàn)滑塊驗證碼
    2022-05-05

最新評論