Python的進階特性2:列表推導式和產生器

來源:互聯網
上載者:User

標籤:

一.列表推導式

  1.列表推導式是頗具python風格的一種寫法。這種寫法除了高效,也更簡短。

In [23]: [‘i:el‘ for i,el in enumerate(["one","two","three"])]Out[23]: [‘i:el‘, ‘i:el‘, ‘i:el‘]
enumerate是內建函數,可以讓列表獲得“下標”的屬性。
而如果不用列表推導式,上例需要這麼寫
In [24]: lst = ["one","two","three"]In [25]: i = 0In [26]: for e in lst:   ....:     lst[i] = ‘%d: %s‘ % (i,lst[i])   ....:     i +=1   ....:   In [27]: lstOut[27]: [‘0: one‘, ‘1: two‘, ‘2: three‘]

 

二.產生器(generator)

1.什麼時候需要用產生器

其實一般情況下是不需要產生器的,只有當因為效能限制下才需要用到,比如你需要用python來read一個10g的txt檔案,如果一次性把10g的檔案載入到記憶體再處理(.read()方法),記憶體肯定溢出了。這裡如果使用產生器,就可以把讀和處理交叉進行,比如使用(.readline和.readlines)就可以在迴圈讀取的同時不斷處理,這樣可以節省大量記憶體空間。

(ps:如果當自己寫一個讀寫函數封裝給別人使用時,那麼要考慮到檔案容量問題,此時應該考慮使用產生器。)

2.產生產生器的兩種方法

  2.1 第一種比較簡單,將列表推導式的[]改稱()就可以了

In [40]: g = (x*x for x in range(10))  

     2.2 第二種辦法就是在函數裡加入yield關鍵字。yield和return有點類似,都可以用來傳回值,不同的是yield遇到next()就返回,再次執行時從上次返回的yield語句處繼續執行。

 

3.如何判斷一個函數是否是產生器     

     判斷產生器的辦法就是查看其屬性

In [41]: dir(g)Out[41]: [‘__class__‘,... ‘__next__‘,... ‘__repr__‘, ‘__setattr__‘,]

     在這裡可以看到g有一個__next__的魔術方法,而這是產生器所特有的屬性,下面兩種方式調用都可以

In [42]: g.__next__()Out[42]: 0In [43]: g.__next__()Out[43]: 1In [44]: next(g)Out[44]: 4

 

 


Python的進階特性2:列表推導式和產生器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.