迭代器和生成器
迭代器
迭代协议:有__next__()方法的对象会前进带下一个结果,在末尾时会引起StopIteration异常。
迭代器:包含有next
方法的实现,在正确范围内返回期待的数据以及超出范围后能够抛出StopIteration
的错误停止迭代。
可迭代对象:我们在使用列表、元组、字典、字符串、集合等数据类型时(这些数据类型含有__iter__()方法,可认为是可迭代对象),往往会认为他们就是迭代器,其实并不是,因为它们并没有__next__()方法,那为什么它的确可以迭代呢?因为他们都有一个__iter__()方法可以把他们转化成迭代器。
列表、元组、字符串是序列。有序。
生成器Generator
标志性关键字:yeild
生成器的本质就是迭代器
生成器函数:使用yeild替代了return作为返回值的函数可称作生成器函数
1 def test(): 2 for i in range(5): 3 yield i 4 5 t = test() 6 print(next(t)) 7 print(next(t)) 8 print(next(t)) 9 print(next(t)) 10 print(next(t)) 11 print(next(t))
结果:
1 0 2 1 3 2 4 3 5 4 6 Traceback (most recent call last): 7 File "F:/pycharm/code/practice/practice1/1.py", line 11, in <module> 8 print(next(t)) 9 StopIteration
生成器一次相当于只是产生了一个结果,大大减少了内存的使用
s = (i for i in range(10)) print(type(s))
<class 'generator'>