文章目录
- 迭代器
- 创建迭代器
- StopIteration
- 生成器
迭代器
访问集合元素的一种方式,可以记住遍历的位置的对象
从集合的第一个元素开始,直到所有的元素被访问完结束,迭代器只能往前不会后退
iter()
,创建迭代器对象
iter(object, [sentinel])
object,迭代的集合如果有第二个参数,第一个参数必须是可调用对象。
iter创建迭代器对象后,每次调用__next__()方法都会调用object
next()
,输出迭代器的下一个元素,要和iter()一起使用
next(iterable, [default])
iterable,可迭代对象default,可选参数,设置没有下一元素是返回的默认值,不设置的话没有下一参数时会发出`StopIteration`异常
list = [1, 2, 3, 4]
li = iter(list)
print(next(li))
for i in li:print(i, end=' ')
创建迭代器
class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):x = self.aself.a += 1return xmyclass = MyNumbers()
myiter = iter(myclass)# next只输出一个元素,for循环会无限循环下去
# print(next(myiter))
for i in myiter:print(i)
StopIteration
标识迭代的完成,防止无限循环
for 循环中无需处理 StopIteration 异常,循环会正常结束
class MyNumbers:def __iter__(self):self.a = 1return self# 20次迭代后停止def __next__(self):if self.a <= 20:x = self.aself.a += 1return xelse:raise StopIterationmyclass = MyNumbers()
myiter = iter(myclass)for x in myiter:print(x)
生成器
使用yield函数的称为生成器,结果返回迭代器,只能用于迭代操作
yield指路https://www.runoob.com/w3cnote/python-yield-used-analysis.html
def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1
fab(5)
缺少复用性,无法获得生成序列
class Fab(object):def __init__(self, max):self.max = maxself.n, self.a, self.b = 0, 0, 1def __iter__(self):return selfdef __next__(self):if self.n < self.max:r = self.bself.a, self.b = self.b, self.a + self.bself.n = self.n + 1return rraise StopIteration()
for n in Fab(5):print(n)
利用iterable,内存占用始终为常数,但不简洁
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # 使用 yield# print b a, b = b, a + b n = n + 1
for n in fab(5): print n
利用yield来获取iterable效果,保持简洁