全部博文(2065)
分类: Python/Ruby
2010-03-26 12:59:12
python中的迭代器与生成器
[整理人:遥方 整理时间:
一、迭代器Iterators
迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身
补充:
遍历一个容器对象的方法:
for element in [1, 2, 3]:
print element
这段代码的背后是什么呢?
在后台,for 语句在容器对象中调用 iter() 。 该函数返回一个定义了 next() 方法的迭代器对象,
它在容器中逐一访问元素。没有后续的元素时,next() 抛出一个 StopIteration 异常通知
for 语句循环结束。
心得:其实感觉与JAVA容器对象里面的Iterate的操作是一样的即迭代输出。遍历容器的时候非常有用!
>>> i=iter('abv')
>>> i.next()
'a'
>>> i.next()
'b'
>>> i.next()
'v'
>>> i.next()
Traceback (most recent call last):
File "
StopIteration
编写一个迭代器对象
class MyIterator(object):
def __init__(self, step):
self.step = step
def next(self):
"""Returns the next element."""
if self.step==0:
raise StopIteration
self.step-=1 #不断递减
return self.step
def __iter__(self):
"""Returns the iterator itself."""
return self #返回自身对象
for el in MyIterator(4):
print el
二、生成器
生成器使用关键字yield来推出数据;生成器同时还拥有send(val)来修改值及close()来关闭生成器;
生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。[提高代码的简洁度]
它基于yield指令,允许停止函数并立即返回结果。此函数保存其执行上下文,如果需要,可立即继续执行。[即函数执行到一个点的时候就立刻中断掉。进入休眠状态]
示例:
def fibonacci():
a,b=0,1
while True:
yield b #保存上下文 如果需要可以立即执行这条语句
a,b = b, a+b #代码是非常简单的(如果不用生成器就得用递归调用)
fib=fibonacci()
print fib.next()
print fib.next()
print fib.next()
print [fib.next() for i in range(10)]
>>> def fib():
...
a,b=0,1
...
while True:
... yield b 如果在一个true循环中不用它就死循环了。
... a,b=b,a+b
...
实现:斐波拉切数列 的函数!
我的理解:通过使用yield关键字可以将当前的记录值压入到一个临时的栈空间去。等下次调用next()的时候将其再提取出来。(停步函数,一调用next就继续执行)