標籤:運行 迭代器 斐波那契數列 需要 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中的產生器