Python"生成器"和"迭代器"

  Python生成器和迭代器的相关概念好像挺不好理解的,相关的资料写的都挺模糊的,最根本的概念都没说清楚….什么是生成器? 什么是迭代器? 带着这两个疑问,结合自己的理解,来总结一下,暂时的理解是这样,后面学习深入了,有了新的理解再回来更新!

1、生成器(generator)是什么?

生成器就是一个返回可迭代对象的函数,调用生成器函数的时候(yield),生成器没有数据,保存的是算法,这种函数就叫生成器函数.
在使用的时候,可以通过next()方法一个个进行迭代返回数据,当函数终止的时候会自动抛出:StopIteration。

生成器函数:
>>> def func(n):
...     yield n*2
...
>>> g = func(5)
>>> g
<generator object func at 0x0000028F09CDA570>
>>> next(g)
10
>>>

生成器表达式:
>>> g = (i for i in range(6))
>>> g
<generator object <genexpr> at 0x0000028F09E1A408>
>>> #可以看到g只是一个对象
>>> type(g)
<class 'generator'>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>> next(g)
3
>>> next(g)
4
>>> next(g)
5
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

2、迭代器(Iterator)又是什么?

迭代器就是通过迭代操作(for循环)的对象,迭代器本身是可迭代的,通过iter()方法通把一个可迭代的对象封装成迭代器,
通过next()方法对可迭代的迭代器进行迭代,也可以说任何实现了next()方法的对象都可以称为迭代器,例如生成器也可以算迭代器。

迭代器表达式:
>>> ( i for i in iter(range(10)))
<generator object <genexpr> at 0x0000028F09E1A408>
>>> g=( i for i in iter(range(10)))
>>> type(g)
<class 'generator'>
>>>
>>> g
<generator object <genexpr> at 0x0000028F09E1A390>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>>

3、总结:

生成器和迭代器其实很相似,也有一些不一样的
通过实现迭代器对应的 iter() 方法和 next() 方法,可以定义为迭代器
生成器通过生成器函数来产生,生成器函数可以用常规的def语句来定义,但是不是return返回,而是通过yield一次返回一个结果