14.2 迭代器与生成器
迭代器对象是支持迭代器协议的对象.
在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法。其中__iter__()方法(或内置函数iter())返回迭代器对象本身self;__next__()方法(或内置函数next())返回容器的下一个元素,在结尾时引发StopIteration异常。
li=[1,2,3]
it=li.__iter__()
print(it.__next__())
print(it.__next__())
print(next(it))
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。对于可迭代对象,可以使用内建函数iter()来获取它的迭代器对象,例如iter1=iter([1,2,3]);通过next()函数来获取下一个元素,例如next(iter1)。可迭代的对象(例如字符串,列表或元组对象)都可用于创建迭代器。
生成器:一个使用yeild代替return的函数
在Python中,使用了yield的函数被称为生成器(generator)。生成器函数可以通过常规的def语句来定义,但是返回值不是用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们的状态,来自动实现迭代协议。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。调用一个生成器函数,返回的是一个迭代器对象。
在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield后面的表达式的值,并在下一次执行next(x)方法时从当前位置继续运行。例如r=xfunc(),会获取一个生成器r。然后执行r.__next__() 方法时,会执行生成器函数中的代码到第一个yeild,并返回yeild后面的表达式值,当再次执行r.__next__() 方法时,会从yeild后面语句继续执行,直到下一个yeild执行返回yeild后面的表达式值(或引发StopIteration异常)。
def yield_test(n):
for i in range(n):
yield call(i)
print("i=", i)
# 做一些其它的事情
print("do something.")
print("end.")
def call(i):
return i * 2
# 使用for循环
for i in yield_test(5):
print(i, ",")