生成器是 Python 初级开发者最难理解的概念之一,虽被认为是 Python 编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得不得去理解它、使用它、甚至爱上它。

提到生成器,总不可避免地要把迭代器拉出来对比着讲,生成器就是一个在行为上和迭代器非常类似的对象,如果把迭代器比作 Android 系统,那么生成器就是 iOS,二者功能上差不多,但是生成器更优雅。什么是迭代器

顾名思义,迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了 __next__ 方法 (python2 是 next)的对象都可以称为迭代器。

它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。比如列表含有中一千万个整数,需要占超过400M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有元素装载到内存中,而是等到调用 next 方法时候才返回该元素(按需调用 call by need 的方式,本质上 for 循环就是不断地调用迭代器的next方法)。

以斐波那契数列为例来实现一个迭代器:

什么是生成器

知道迭代器之后,就可以正式进入生成器的话题了。普通函数用 return 返回一个值,和 Java 等其他语言是一样的,然而在 Python 中还有一种函数,用关键字 yield 来返回值,这种函数叫生成器函数,函数被调用时会返回一个生成器对象,生成器本质上还是一个迭代器,也是用在迭代操作中,因此它有和迭代器一样的特性,唯一的区别在于实现方式上不一样,后者更加简洁

最简单的生成器函数:

func 就是一个生成器函数,调用该函数时返回对象就是生成器 g ,这个生成器对象的行为和迭代器是非常相似的,可以用在 for 循环等场景中。注意 yield 对应的值在函数被调用时不会立刻返回,而是调用next方法时(本质上 for 循环也是调用 next 方法)才返回

那为什么要用生成器呢?显然,用生成器在逼格上要比迭代器高几个等级,它没有那么多冗长代码了,而且性能上一样的高效,为什么不用呢?来看看用生成器实现斐波那契数列有多简单。

生成器表达式

在前面一期「这样写代码更优雅」的文章里面曾经介绍过列表推导式(list comprehension),生成器表达式与列表推导式长的非常像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。

前面已经介绍过生成器的优势,就是迭代海量数据时,显然生成器更合适。

作者:PythonTab

python生成器的作用是什么_看完这篇,你就知道Python生成器是什么相关推荐

  1. python发红包最佳手气王_看完这篇文章 以后微信抢红包手气王就是我了

    春节是中华民族隆重的农历新年,这是世界上规模最大的节日. 在春节前后,炎黄子孙们不远万里衣锦还乡,与亲人们团圆. 在此期间,中国的铁路上会发生,地球上最大规模的人口迁徙. 作为世界上最能吃最能玩的种族 ...

  2. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  3. redis hashmap过期_看完这篇再也不怕 Redis 面试了

    0.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版和集群版,不过现在 大一些的 公司都完全是运 ...

  4. python 只循环目录_看完这篇文章,你的Python基础就差不多了

    世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 前言 本文是基于黑马程序员2019年的Python基础班的内容编写的,以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网 ...

  5. python基础教程多少页_看完这篇文章,你的Python基础就差不多了(附200页《Python400集》)...

    说干就干.经过将一个多月的素材整理.编写.打磨,在上周末终于完成了. 写完它的时候,我很兴奋,因为它将是第一本系统介绍 Python技巧使用的中文教程. 它不仅适用于一个刚入坑 Python ,还未接 ...

  6. python泰勒公式法求正弦函数_看完这篇让你高数不挂科之——泰勒公式

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天的文章我们来讨论大名鼎鼎的泰勒公式,泰勒公式真的非常有名,我相信上过高数课的一定都记得它的大名.即使你翘掉了所有的课,也一定会在考前重点 ...

  7. python为什么流行头上长草_看完这些发型,感觉那些头上长草的都弱爆了!

    原标题:看完这些发型,感觉那些头上长草的都弱爆了! 近来,国内刮起了一股"头上长草"的流行风,连周杰伦跟他媳妇都开始各种秀,据说长了草的发型都是介个样子滴~ 然而,"头上 ...

  8. python余数不等于的符号_Python扫盲,看完这篇,你的Python基础就差不多了

    前言 本文是基于黑马程序员2018年的Python基础班的内容编写的,以2018年的资料为蓝本,2016年的资料为补充,还参考了一些网上的教程,旨在更好地总结Python基础知识,力求简明扼要,以供实 ...

  9. python正则表达式修饰符_python正则表达式,看完这篇文章就够了...

    今天讲什么? 今天以为大学同学微信聊,说最近在看我的公众号,她是国企汽车制造业的,但也要用python进行数据分析...之前看了往期的python字符串操作内容,里面说到了正则表达式,想学习一下... ...

  10. 良心帖!看完这篇,你的 Python 入门基础就差不多了!

    Python将纳入高考内容.小学生教材开始接触Python.Python列入全国计算机等级考试-- 全民学Python的话题铺天盖地,中国的Python学习者是全球第一,人才如此泛滥,甚至以后孩子都会 ...

最新文章

  1. 使用 python 的单人AI 扫雷游戏
  2. linux网络命令 ifconfig、ifup、ifdown 网络配置 网卡开启关闭
  3. 手机连接不上电脑只显示充电_INNOCN N1G便携显示器,解决孩子和大人多重使用需求...
  4. linux安装grpc占用空间大,grpc linux安装-Go语言中文社区
  5. 读写Excel 用 xlsxwriter,openpyxl 更灵活
  6. Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02)
  7. MySQL 四种事务隔离级的说明
  8. BUG: button点击高亮延迟问题
  9. 关于修改域用户密码的WebPart的问题的问题.
  10. FAT32文件系统格式详解
  11. 图像检索与识别(Bag-Of-Words Models)
  12. 工业相机录像丢帧的解决方案
  13. 计算机网络安全文明知识竞赛,网络安全知识竞赛
  14. PPT可以直接剪裁视频
  15. 微信看一看+视频下载方法
  16. 抖音电商直播基地项目运营规划商业品牌计划书方案模板
  17. 【旅游热点】金秋十月 “额济纳胡杨林”登内蒙古景区热度榜首
  18. Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现
  19. 【短信】谷歌4.4短信代码学习
  20. c语言json结构体_C语言:json库使用学习

热门文章

  1. android平板电脑维修电路图,《图解windows10平板电脑电路原理和维修》大家可以读读看看...
  2. Tachyon:Spark生态系统中的分布式内存文件系统的使用
  3. Jmeter自定义Java请求,继承AbstractJavaSamplerClient
  4. MongoDB实战-面向文档的数据(找到最合适的数据建模方式)
  5. strcmp函数使用中的一些细节问题
  6. 如何监控 Nginx?
  7. MyBatis多参数传递之默认命名方式示例——MyBatis学习笔记之十二
  8. AS3和Flex常用知识100条
  9. postman:Could not get any response解决方法
  10. 关于Initializing Spring root WebApplicationContext解决方法