先解釋幾個易混淆的概念:
- 可迭代對象(Iterable)
- 迭代器(Iterator)
- 迭代(Iteration)
Python中任意的對象,只要它定義了可以返回一個迭代器的__iter__方法,或者定義了可以支持下標索引的__getitem__方法,那么它就是一個可迭代對象。簡單說,可迭代對象就是能提供迭代器的任意對象。
Python中任意的對象,只要定義了next(Python2) 或者__next__方法,它就是一個迭代器。注意:可迭代對象不一定是迭代器,也即對象即使支持迭代,因為缺少next或__next__方法也不能直接對其進行迭代操作,這個時候可以使用內(nèi)置函數(shù)iter來返回一個迭代器對象。
迭代用簡單的話講,它就是從某個地方(比如一個列表)取出一個元素的過程。當我們使用一個循環(huán)來遍歷某個東西時,這個過程本身就叫迭代。
生成器也是一種迭代器,但是你只能對其迭代一次。這是因為它們并沒有把所有的值存在內(nèi)存中,而是在運行時生成值。你通過遍歷來使用它們,要么用一個“for”循環(huán),要么將它們傳遞給任意可以進行迭代的函數(shù)和結(jié)構(gòu)。大多數(shù)時候生成器是以函數(shù)來實現(xiàn)的。然而,它們并不返回(return)一個值,而是提供(yield)一個值,這樣就不必擔心使用大量資源。例如,計算斐波那契數(shù)列的生成器如下所示:
# generator versiondef fibon(n): a = b = 1 for i in range(n): yield a a, b = b, a + b
函數(shù)使用方法如下:
for x in fibon(1000000): print(x)