先解釋幾個(gè)易混淆的概念:
- 可迭代對(duì)象(Iterable)
- 迭代器(Iterator)
- 迭代(Iteration)
Python中任意的對(duì)象,只要它定義了可以返回一個(gè)迭代器的__iter__方法,或者定義了可以支持下標(biāo)索引的__getitem__方法,那么它就是一個(gè)可迭代對(duì)象。簡(jiǎn)單說(shuō),可迭代對(duì)象就是能提供迭代器的任意對(duì)象。
Python中任意的對(duì)象,只要定義了next(Python2) 或者_(dá)_next__方法,它就是一個(gè)迭代器。注意:可迭代對(duì)象不一定是迭代器,也即對(duì)象即使支持迭代,因?yàn)槿鄙賜ext或__next__方法也不能直接對(duì)其進(jìn)行迭代操作,這個(gè)時(shí)候可以使用內(nèi)置函數(shù)iter來(lái)返回一個(gè)迭代器對(duì)象。
迭代用簡(jiǎn)單的話講,它就是從某個(gè)地方(比如一個(gè)列表)取出一個(gè)元素的過(guò)程。當(dāng)我們使用一個(gè)循環(huán)來(lái)遍歷某個(gè)東西時(shí),這個(gè)過(guò)程本身就叫迭代。
生成器也是一種迭代器,但是你只能對(duì)其迭代一次。這是因?yàn)樗鼈儾](méi)有把所有的值存在內(nèi)存中,而是在運(yùn)行時(shí)生成值。你通過(guò)遍歷來(lái)使用它們,要么用一個(gè)“for”循環(huán),要么將它們傳遞給任意可以進(jìn)行迭代的函數(shù)和結(jié)構(gòu)。大多數(shù)時(shí)候生成器是以函數(shù)來(lái)實(shí)現(xiàn)的。然而,它們并不返回(return)一個(gè)值,而是提供(yield)一個(gè)值,這樣就不必?fù)?dān)心使用大量資源。例如,計(jì)算斐波那契數(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)