迭代器:迭代器就是实现了迭代器协议的对象。所谓的迭代器协议就是如果一个对象包括一个叫”next”(python3 为__next__)的方法,那么这个对象就叫做“迭代器”。
迭代器协议一般实现_iter__()和__next__()两个方法。
_iter__():即返回迭代器本身
__next__():返回迭代器容器中的下一个元素,在结尾时引发一个StopIteration异常终止迭代器。
例:
1.1
l2=[1,2,3,4,5]
l2.__iter__()
<list_iterator object at 0x00000221D8607128>
所以,l2是个可迭代对象。下面调用__next__(),判定是否为迭代器对象
l2.__next__()
输出:
'list' object has no attribute '__next__'
所以由定义可知,l2并不能够调用__next__(),所以它并不是迭代器对象。看下l2的格式就知道了
type(l2)
<class 'list'>----表明l2是个list对象,并不是迭代器。
1.2
l2=[1,2,3,4,5]
l3=l2.__iter__()
l3.__next__()
输出结果:由定义知:l3可调用__next__(),所以l3为迭代器对象。
看下l3格式就明白了,
type(l3)
输出:
<class 'list_iterator'> 为迭代器
生成器:生成器先是一个迭代器,然后其内容是按需生成。包含yield的函数。换句话说,一边循环一边计算(惰性计算)的迭代器称为生成器(Generator)
生成器只不过是在函数中return被yield取代,当调用函数时,其会返回一个迭代器,并不是立即执行内容,直至调用next方法开始执行,执行到yield标志着此次迭代结束。注意一点的是,生成器智能迭代一次,而迭代器则是多次迭代,这也是两者之间的区别。
def fun2():
print("中国")
yield"万岁"
print("!")
a=fun2()
print(a)
输出:
<generator object fun2 at 0x00000221D86017D8>
输出的是生成器,并没有执行
-->print(a.__next__())
输出:
中国 万岁
执行遇到yield语句,则表示此次迭代结束。
-->print(a.__next__())
输出:
!