迭代器
实现了__iter__和__next__方法的对象就是迭代器,可迭代对象 与 迭代器 的区别在于,迭代器拥有__next__方法
迭代器有两种定义方式 iter(li) 和 li.iter() ,效果是一样的
li = [1,2,3,4,5]
a = iter(li)
a1 = li.__iter__()
print(next(a),next(a),next(a),next(a),next(a))
print(next(a1),next(a1),next(a1),next(a1),next(a1))
#运行结果:
1 2 3 4 5
1 2 3 4 5
迭代器可以通过 next 和 a.next() 方法取出值,在使用while循环去在打印时会报StopIteration,因此需要有异常处理语句来配合while打印
li = [1,2,3]
a = iter(li)
while True:
try:
print(next(a))
except StopIteration:
break
#运行结果:
1
2
3
除了已有的迭代器 iter 之外,还可以自己定义一个迭代器来使用
class MyList:
def __init__(self,li):
self.li = li
def __iter__(self):
return iter(self.li) #转化为一个迭代器
li =[1,2,3]
a = MyList(li)
for i in a:
print(i)
#运行结果:
1
2
3
生成器
生成器 属于 迭代器的一种,用一个生成一个,极大的节约空间,生成器就是为了节省内存
小括号的推导式就是一个生成器
g = (i for i in range(3))
print(next(g),next(g),next(g))
#运行结果:
0
1
2
yield 如果函数中有yield,这个函数就是生成器
def func():
print('这是生成器')
yield '开始生成' #yield 会有暂停功能
yield '生成1个'
yield '生成2个'
a = func()
print(next(a),next(a),next(a))
#运行结果:
这是生成器
开始生成 生成1个 生成2个
参考文章:python 生成器和迭代器有这篇就够了