设为首页 | 加入收藏 | 咨询微信
码奇编程
打造少儿编程“培训+开发”一站式服务品牌!
  • 少儿编程,让思维在数字世界自由
  • 少儿编程:家长又把宝押在这里!
  • Scratch趣味编程
  • Python创意编程
  • NOIP

首页>>学员天地

彻底理解 Python 生成器
编辑:Simon  阅读:637次  发布:21-11-22

1、生成器定义

     在Python中,一边循环一边计算的机制,称为生成器(generator)。

2、为什么要有生成器

     1)列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。

     2)如果仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

     3)如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。

     4)简单一句话:又想要得到庞大的数据,又想让它占用空间少,那就用生成器!

3、如何创建生成器

     1)方法1:很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

          image.png

     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表达式整体的结果

例 阅读并分析如下代码:

     image.png

思考None是如何产生的:

     第一次取值:yield 返回了 i 值 0,停在yield i,temp没赋到值。

     第二次取值,开始在print,temp没被赋值,故打印None,继续while判断,yield  返回了 i 值 1,停在yield i。




上一篇: 迭代器、可迭代对象和range对象,一网打尽!   下一篇: 一分钟搞清Python模块、包和库的区别!
返回列表

更多..最新通告

为隆重庆祝南桥基地成功开业,现开展活动特惠广大学子。
Scratch、Python、C++、Spike机器人课均免费试听!

地址:南桥新世界广场

©2016-2020 上海码奇编程科创&科普中心 版权所有
奉贤区南桥新世界广场C区3楼324-325室(邮编:200333)
咨询:159-2192-6207  合作:13371929650 电邮:service@muchcode.top
《中华人民共和国电信与信息服务业务》经营许可证沪ICP备2021019270号