人人都能學會的python程式設計教程15:高階特性2

程式設計老司機發表於2018-05-10

生成器

如果你想要一百萬個數,而這些數裡只有一百個數是你經常要用的,剩下的都幾乎不怎麼會用到,那麼如果直接把這一百萬個數全部放在list中是不明智的因為這會浪費較多儲存空間,生成器就是為了解決這個問題而生的。

如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

生成器表示式: 通列表解析語法,只不過把列表解析的[]換成()

寶寶都能學會的python程式設計教程15:高階特性2

我們可以直接列印出list的每一個元素,但我們怎麼列印出generator的每一個元素呢?

如果要一個一個列印出來,可以通過next()函式獲得generator的下一個返回值:

寶寶都能學會的python程式設計教程15:高階特性2

當然這種獲取值的方法很笨,所以我們一般用迴圈來迭代生成器的物件

寶寶都能學會的python程式設計教程15:高階特性2

迭代器

前面我們已經學過了for迴圈,我們知道for迴圈可以遍歷list、tuple、dict、set、str和生成器。

這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable。

可以使用isinstance()判斷一個物件是否是Iterable物件:

>>> from collections import Iterable
>>> isinstance([], Iterable)
> True
>>> isinstance({}, Iterable)
> True
>>> isinstance('abc', Iterable)
> True
>>> isinstance((x for x in range(10)), Iterable)
> True
>>> isinstance(100, Iterable)
> False
複製程式碼

凡是可作用於for迴圈的物件都是Iterable型別;

凡是可作用於next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;

集合資料型別如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件。

Python的for迴圈本質上就是通過不斷呼叫next()函式實現的,例如:

寶寶都能學會的python程式設計教程15:高階特性2

相關文章