迭代器(iterator)與生成器(generator)
-
迭代器
??迭代器:它是一個(gè)帶狀態(tài)的對(duì)象碴倾,調(diào)用next()方法的時(shí)候返回容器中的下一個(gè)值从铲,任何實(shí)現(xiàn)了iter和next()(python2中實(shí)現(xiàn)next())方法的對(duì)象都是迭代器膘侮,iter返回迭代器自身帆离,next返回容器中的下一個(gè)值渗蟹,如果容器中沒(méi)有更多元素了贮尉,則拋出StopIteration異常拌滋。
?? 容器:把多個(gè)元素組織在一起的數(shù)據(jù)結(jié)構(gòu),容器中的元素可以逐個(gè)地迭代獲取猜谚,可以用in, not in關(guān)鍵字判斷元素是否包含在容器中败砂。通常這些數(shù)據(jù)結(jié)構(gòu)直接把所有元素存放在內(nèi)存中。
?? 可迭代對(duì)象(iterable):但凡是可以返回一個(gè)迭代器的對(duì)象都可稱(chēng)之為可迭代對(duì)象魏铅。例如內(nèi)置的list昌犹、dict、set等數(shù)據(jù)結(jié)構(gòu)屬于可迭代對(duì)象沦零。
?? 實(shí)現(xiàn)一個(gè)迭代器的方法- 為容器對(duì)象添加 iter() 和 next() 方法(Python 2.7 中是 next())祭隔;iter() 返回迭代器對(duì)象本身 self,next() 則返回每次調(diào)用 next() 或迭代時(shí)的元素路操;
- 內(nèi)置函數(shù) iter() 將可迭代對(duì)象轉(zhuǎn)化為迭代器
- 生成器(generator)疾渴。特殊的迭代器,生成器通過(guò) yield 語(yǔ)句(即通過(guò) yield 語(yǔ)句將普通函數(shù)變成生成器)快速生成迭代器屯仗,省略了復(fù)雜的 iter() & next() 方式搞坝。
#簡(jiǎn)單示例
>>> list1=[1,2,3,4]
>>> list_iterator=iter(list1)
>>> list1
[1, 2, 3, 4]
>>> list_iterator
<list_iterator object at 0x0227B7F0>
>>> next(list_iterator)
1
>>> next(list_iterator)
2
>>> next(list_iterator)
3
>>> next(list_iterator)
4
>>> next(list_iterator)
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
next(list_iterator)
StopIteration
>>>
示例2:自定義迭代器:實(shí)現(xiàn)斐波那契數(shù)列
在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義:F(0)=0魁袜,F(xiàn)(1)=1, F(n)=F(n-1)+F(n-2)(n>=2桩撮,n∈N*)
>>> from itertools import islice
>>> class Fibonacci:
def __init__(self):
self.f0=0
self.f1=1
def __iter__(self):
return self
def __next__(self):
value=self.f1
self.f1+=self.f0
self.f0=value
return value
>>> f = Fibonacci()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>>
示例3:用生成器的方式實(shí)現(xiàn)斐波那契數(shù)列
>>> def Fibonacci():
f0,f1=0,1
while True:
yield f1
f0,f1=f1,f0+f1
>>> f = Fibonacci()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>>
??迭代器不會(huì)預(yù)先將所有元素加載在內(nèi)存中,只有當(dāng)它被調(diào)用時(shí)峰弹,才會(huì)真正返回值