python 生成器

迭代器

迭代器就是用于迭代操作(for 循環(huán))的對象,它像列表一樣可以迭代獲取其中的每一個元素,任何實(shí)現(xiàn)了 next 方法 (python2 是 next)的對象都可以稱為迭代器。

它與列表的區(qū)別在于,構(gòu)建迭代器的時候,不像列表把所有元素一次性加載到內(nèi)存,而是以一種延遲計算(lazy evaluation)方式返回元素,這正是它的優(yōu)點(diǎn)。比如列表含有中一千萬個整數(shù),需要占超過400M的內(nèi)存,而迭代器只需要幾十個字節(jié)的空間。因?yàn)樗]有把所有元素裝載到內(nèi)存中,而是等到調(diào)用 next 方法時候才返回該元素(按需調(diào)用 call by need 的方式,本質(zhì)上 for 循環(huán)就是不斷地調(diào)用迭代器的next方法)。

生成器

普通函數(shù)用 return 返回一個值,和 Java 等其他語言是一樣的,然而在 Python 中還有一種函數(shù),用關(guān)鍵字 yield 來返回值,這種函數(shù)叫生成器函數(shù),函數(shù)被調(diào)用時會返回一個生成器對象,生成器本質(zhì)上還是一個迭代器,也是用在迭代操作中,因此它有和迭代器一樣的特性,唯一的區(qū)別在于實(shí)現(xiàn)方式上不一樣,后者更加簡潔

def fib(n):
    curr=1
    prev=0
    for i in range(0,10):
                yield curr
                prev,curr=curr,curr+prev


print [i for i in fib(10)]
----
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

yield 對應(yīng)的值在函數(shù)被調(diào)用時不會立刻返回,而是調(diào)用next方法時(本質(zhì)上 for 循環(huán)也是調(diào)用 next 方法)才返回

生成器表達(dá)式

>>> l=(x for x in range(0,10) if x !=0)
>>> print l
<generator object <genexpr> at 0x7f7cab3abaf0>
>>> [i for i in l]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • @Author : Roger TX (425144880@qq.com) @Link : https:/...
    Roger田翔閱讀 239評論 0 0
  • 前言 作為python程序員,生成器以及協(xié)程是必不可少的話題。你可能在面試中會經(jīng)常遇到這樣的問題:說一說生成器和迭...
    pullgon閱讀 638評論 0 0
  • 1.迭代 在理解生成器之前,先理解迭代。 1.1 迭代 如果給定一個list或tuple,我們可以通過for循環(huán)來...
    XYZeroing閱讀 1,001評論 1 3
  • Python之生成器 生成器在Python社區(qū),生成器和迭代器被看作一種工具,生成器的本質(zhì)就是迭代器。唯一的區(qū)別就...
    免跪姓黃閱讀 409評論 0 10
  • 迭代 如果給定一個list或tuple,我們可以通過for循環(huán)來遍歷這個list或tuple,這種遍歷我們稱為迭代...
    Mr_Bluyee閱讀 1,409評論 0 1

友情鏈接更多精彩內(nèi)容