python中的產生器

來源:互聯網
上載者:User

標籤:運行   迭代器   斐波那契數列   需要   generator   ges   特定   個數   就會   

  python中的產生器其實就是一個特殊的迭代器,相比於每次迭代擷取資料獲得(通過next()函數)時產生元素,迭代的位置,數值返回等都需要我們設計。我們可以採用更加簡潔的文法即產生器(generator)。

  通過列表產生式,我們可以直接建立一個列表。但是,如果我們說我們可能會通過演算法根據前面的999999個數推出100w個數,但是我們此時只需要使用到前幾個數,那麼通過列表儲存100w個數來備用就會用到巨大的空間。而我們卻不一定會用到第100w個數,白白浪費了龐大的空間。因此我們就需要用到了產生器了。

  產生器並不儲存所有元素,儲存的是演算法,每調用依次next方法就根據演算法返回下一個元素的值。如果沒有值就拋出StopIteration異常。這樣就有一有一個好處,產生器會根據你需要的個數來返回元素的個數,不會浪費空間。因此產生器是惰性的序列。

  建立產生器有倆種方法:

  第一種和列表產生很相似,將[]換成了()。a此時是一個產生器對象。

  

  第二種:

  一個函數中只要有yield這個關鍵詞,那麼這個函數就變成了產生器。產生器通過next()開啟,運行到yield暫停掛起。

  yield有倆個作用:當運行到yield時儲存當前運行狀態,然後掛起。

                               返回yield後面運算式返回的值,相當於return。

  當再次調用next()函數的時候會返回之前掛起的運行位置繼續往下運行,直到運行到下一個yield為止,如果沒有就會拋出StopIteration異常。

  喚醒產生器除了用next()函數外也可以使用send()函數。send()方法不僅可以返回yield斷點還可以傳入一個值。需要注意的是產生器第一次喚醒不能使用send()方法。

  在之前用迭代器實現斐波那契數列列印的時候,可以看出斐波那契數列是通過特定的演算法(a,b = b, a+b)推算出下一個值的。這就跟產生器儲存演算法的原則就很類似了,因此用產生器實現斐波那契數列列印更加簡單。

 

  

 

python中的產生器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.