首页>>学员天地
1、生成器定义
在Python中,一边循环一边计算的机制,称为生成器(generator)。
2、为什么要有生成器
1)列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。
2)如果仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
3)如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。
4)简单一句话:又想要得到庞大的数据,又想让它占用空间少,那就用生成器!
3、如何创建生成器
1)方法1:很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
2)方法2:如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。
4、生成器的工作原理
1)生成器(generator)能够迭代的关键是它有一个next()方法。工作原理就是通过重复调用next()方法,直到捕获一个异常。
2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator。
A、可用next()调用生成器对象来取值。next 两种方式 t.__next__() | next(t)。
B、可用for 循环获取返回值(基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)。
3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
4).send()和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果
例 阅读并分析如下代码:
思考None是如何产生的:
第一次取值:yield 返回了 i 值 0,停在yield i,temp没赋到值。
第二次取值,开始在print,temp没被赋值,故打印None,继续while判断,yield 返回了 i 值 1,停在yield i。
上一篇: 迭代器、可迭代对象和range对象,一网打尽! 下一篇: 一分钟搞清Python模块、包和库的区别!