文章目录
- 迭代器
- 创建迭代器
- 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 = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = 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 = 1
return self
# 20次迭代后停止
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = 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 = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
return self
def __next__(self):
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
raise 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效果,保持简洁