**迭代器:**用于循环
>>> a=[1,2,3]
>>> a=iter(a) #把列表a转为迭代器
>>> next #内置函数
<built-in function next>
>>> next(a) #next() 调用迭代
1
>>> next(a)
2
>>> next(a)
3
>>> next(a) #超出迭代范围,停止迭代
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
**生成器:**不能用类来实现,通过函数来实现
前后有下划线的都是内置函数,
def iter(self): #先定义一个迭代
def next(self): #定义下一个生成什么
>>> a=(i for i in range(3))
>>> type(a)
<class 'generator'>
>>> next(a) #生成器、迭代器都可以用next()
0
>>> next(a)
1
>>> next(a)
2
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration #越界,没有可迭代对象
>>>
yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。return 的作用:如果没有 return,则默认执行至函数完毕,返回的值一般是yield的变量。
>>> def a(): #生成器
... yield 1
... yield 2
... yield 3
...
>>> next(a())
1
>>> next(a())
1
>>> next(a())
1
>>> b=a()
>>> next(b)
1
>>> next(b)
2
>>> next(b)
3
迭代器:可以用在类里
通过实现迭代器协议对应的__iter__()和__next__()方法,可以自定义迭代器类型。对于可迭代对象,for语句可以通过iter()方法获取迭代器,并且通过next方法获得容器的下一个元素。
生成器:不可以用在类里,可以用在函数里
生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__() 和__next__()方法。
生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。