位置: 编程技术 - 正文

python迭代器与生成器详解(python迭代器生成器)

编辑:rootadmin

推荐整理分享python迭代器与生成器详解(python迭代器生成器),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python 迭代器作用,python的迭代器和生成器,python的迭代器和生成器,python中的迭代器与生成器,python迭代器生成器区别,python迭代器生成器,python迭代器生成器区别,python迭代器生成器,内容如对您有帮助,希望把文章链接给更多的朋友!

例子

老规矩,先上一个代码:

这个东西输出可以脑补一下, 结果是[,,,], 而不是[, , , ]。 当时纠结了半天,一直没搞懂,后来齐老师稍微指点了一下, 突然想明白了--真够笨的,唉。。好了--正好趁机会稍微小结一下python里面的生成器。

迭代器(iterator)

要说生成器,必须首先说迭代器区分iterable,iterator与itertion讲到迭代器,就需要区别几个概念:iterable,iterator,itertion, 看着都差不多,其实不然。下面区分一下。

itertion: 就是迭代,一个接一个(one after another),是一个通用的概念,比如一个循环遍历某个数组。iterable: 这个是可迭代对象,属于python的名词,范围也很广,可重复迭代,满足如下其中之一的都是iterable:可以for循环: for i in iterable可以按index索引的对象,也就是定义了__getitem__方法,比如list,str;定义了__iter__方法。可以随意返回。可以调用iter(obj)的对象,并且返回一个iteratoriterator: 迭代器对象,也属于python的名词,只能迭代一次。需要满足如下的迭代器协议定义了__iter__方法,但是必须返回自身定义了next方法,在python3.x是__next__。用来返回下一个值,并且当没有数据了,抛出StopIteration可以保持当前的状态首先str和list是iterable 但不是iterator:

但是对于iterator则不一样如下, 另外iterable可以支持多次迭代,而iterator在多次next之后,再次调用就会抛异常,只可以迭代一次。

这样,由这几个例子可以解释清楚这几个概念的区别。

自定义iterator 与数据分离

说到这里,迭代器对象基本出来了。下面大致说一下,如何让自定义的类的对象成为迭代器对象,其实就是定义__iter__和next方法:

从next函数中只能向前取数据,一次取一个可以看出来,不过不能重复取数据,那这个可不可以解决呢?

我们知道iterator只能迭代一次,但是iterable对象则没有这个限制,因此我们可以把iterator从数据中分离出来,分别定义一个iterable与iterator如下:

输出就是:

1,2,,2,3可以看出来数据可以复用,因为每次都返回一个DataIterator,但是数据却可以这样使用,这种实现方式很常见,比如xrange的实现便是这种数据与迭代分离的形式,但是很节省内存,如下:

另外有个小tips, 就是为什么可以使用for 迭代迭代器对象,原因就是for替我们做了next的活,以及接收StopIteration的处理。

迭代器大概就记录到这里了,下面开始一个特殊的更加优雅的迭代器: 生成器

生成器(generator)

首先需要明确的就是生成器也是iterator迭代器,因为它遵循了迭代器协议.

两种创建方式

包含yield的函数

生成器函数跟普通函数只有一点不一样,就是把 return 换成yield,其中yield是一个语法糖,内部实现了迭代器协议,同时保持状态可以挂起。如下:

python迭代器与生成器详解(python迭代器生成器)

首先看到while True 不必惊慌,它只会一个一个的执行~看结果可以看出一点东西:

调用gen()并没有真实执行函数,而是只是返回了一个生成器对象执行第一次a.next()时,才真正执行函数,执行到yield一个返回值,然后就会挂起,保持当前的名字空间等状态。然后等待下一次的调用,从yield的下一行继续执行。还有一种情况也会执行生成器函数,就是当检索生成器的元素时,如list(generator), 说白了就是当需要数据的时候,才会执行。

yield还有其他高级应用,后面再慢慢学习。

生成器表达式

列表生成器十分方便:如下,求以内的奇数:[i for i in range() if i % 2]

同样在python 2.4也引入了生成器表达式,而且形式非常类似,就是把[]换成了().

可以看出生成器表达式创建了一个生成器,而且生有个特点就是惰性计算, 只有在被检索时候,才会被赋值。之前有篇文章:python 默认参数问题及一个应用,最后有一个例子:

这个就是说,只有在执行m(2)的时候,生成器表达式里面的for才会开始从0循环,然后接着才是i * x,因此不存在那篇文章中的问题。

惰性计算这个特点很有用,上述就是一个应用,2gua这样说的:

性计算想像成水龙头,需要的时候打开,接完水了关掉,这时候数据流就暂停了,再需要的时候再打开水龙头,这时候数据仍是接着输出,不需要从头开始循环其实本质跟迭代器差不多,不一次性把数据都那过来,需要的时候,才拿。

回到例子

看到这里,开始的例子应该大概可以有点清晰了,核心语句就是:

在执行list(base)的时候,开始检索,然后生成器开始运算了。关键是,这个循环次数是2,也就是说,有两次生成器表达式的过程。必须牢牢把握住这一点。

生成器返回去开始运算,n = 而不是1没问题吧,这个在上面提到的文章中已经提到了,就是add(i, n)绑定的是n这个变量,而不是它当时的数值。

然后首先是第一次生成器表达式的执行过程:base = ( + 0, + 1, + 2, +3),这是第一次循环的结果(形象表示,其实已经计算出来了(,,,3)),然后第二次,base = ( + , + , + , + ) ,终于得到结果了[, , , ].

具体执行过程可以在pythontutor上手动看看执行过程。

小结

概括主要介绍了大概这样几点:

1.iterable,iterator与itertion的概念2.迭代器协议 自定义可迭代对象与迭代器分离,保证数据复用3.生成器: 特殊的迭代器,内部实现了迭代器协议

其实这一块, 那几个概念搞清楚, ,这个很关键, 搞懂了后面就水到渠成了。而且对之前的知识也有很多加深。比如常见list就是iterator与iteable分离实现的,本身是可迭代对象,但不是迭代器, 类似与xrange,但是又不同。越来越明白,看源码的重要性了。 有地方写的不合适的, 请指正。

参考

python生成器表达式和列表解析 绝大多数情况下,遍历一个集合都是为了对元素应用某个动作或是进行筛选。如果看过本文的第二部分,你应该还记得有内建函数map和filter提供了这些

Python中random模块生成随机数详解 Python中的random模块用于生成随机数。下面介绍一下random模块中最常用的几个函数。random.randomrandom.random()用于生成一个0到1的随机符点数:0=n1.0random.uniformra

深入学习python的yield和generator 前言没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出。虽然之前有接触过python协程的概念,但是只是走马观花,这

标签: python迭代器生成器

本文链接地址:https://www.jiuchutong.com/biancheng/383393.html 转载请保留说明!

上一篇:Python装饰器基础详解

下一篇:python生成器表达式和列表解析(python生成器send)

  • 增值税专用发票抵扣期限
  • 小规模季度不超30万需要交什么税
  • 可供出售金融资产包括哪些内容
  • 进项税未抵扣进账了怎么处理
  • 会计为什么要计折旧费
  • 亏损企业对外捐赠的税前扣除
  • 实收资本变更股东要交税吗
  • 当月预交增值税时所属期选了上期怎么办
  • 管理部门购入固定资产
  • 预付材料款会计分录
  • 软件开发服务费可以计入无形资产吗
  • 地税的发票
  • 工程发票没写经办人没写可以吗
  • 抵扣消费税的利益主要
  • 物流车辆挂靠账务怎么处理?
  • 给单位员工报销电话费怎么做账务处理
  • 公司股东和自然人的区别
  • 公司还款给法人需要缴税吗
  • 定率征收怎么申报
  • 农业公司收到项目资金
  • 用后期进项抵欠怎么做账
  • 哪些进项税可以加计抵减
  • 个人所得税专项扣除夫妻双方都填吗?
  • 支付宝提现到企业账户 怎么开票
  • 个税返还的会计处理方法
  • php字符串定义的三种方式
  • PHP:stream_socket_get_name()的用法_Stream函数
  • 销售固定资产税目
  • 投标保证金怎么退还流程
  • 政府机关出租房屋要交税吗
  • php是面向对象语言吗
  • php获取网页所有页数
  • spring三级缓存有什么用
  • mask rcnn优点
  • jquery+thinkphp实现跨域抓取数据的方法
  • git主干
  • 充话费自定额
  • 开出租车怎么租车
  • 购物赠品的处理流程
  • 个人所得税数据怎么导入新电脑
  • 进项税为什么记在贷方
  • 关于种植养殖的手抄报
  • mysql如何调优
  • 发票申领多久才可以批
  • 逾龄资产对企业的影响
  • 福利费需要通过应付职工薪酬吗
  • 固定资产已提完折旧,但仍在使用,需要定期清理吗?
  • 领用自产应税消费品用于财务人员职工福利
  • 报废半成品怎么做账
  • 员工休产假不发工资违法吗
  • 大额往来款项的认定
  • 法人的加油费能抵所得税吗
  • 月末库存商品的成本怎么算
  • 收不回来的其他应收账款如何处理?
  • 建筑机械使用安全规范最新版
  • 旅游饮食服务企业会计核算的特点包括
  • 投出业务会计分录
  • 深入浅出意思
  • 删除用户mysql
  • mysql不同数据库不同数据表导入数据
  • win10系统怎么删
  • msi安装错误代码2503
  • windows集群运行
  • 预装win7系统
  • win10怎么关闭securboot
  • WIN7系统如何设置表格默认保存位置
  • 苹果Mac系统怎么恢复出厂系统
  • win8的设置
  • 用jQuery实现可输入多选下拉组合框实例代码
  • linux rsync同步命令(值得收藏)
  • vue eventhub
  • Python读取Excel文件需要什么
  • Node.js中的什么模块是用于处理文件和目录的
  • 由浅入深易,由深入浅难
  • javascript数组的常用方法
  • js获取div下指定元素的值
  • jquery iframe写入内容
  • 重庆国家税务局发票查询
  • 税务局的纳税服务有哪些
  • 山东省税务局地税苑宿舍是谁开发的?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设