python中实现迭代器(iterator)的方法示例


Posted in Python onJanuary 19, 2017

概述

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

延迟计算或惰性求值 (Lazy evaluation)

迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。

今天创建了一个实体类,大致如下:

class Account():
 def __init__(self,
   account_name,
   account_type,
   account_cost,
   return_amount=0):
 self.account_name = account_name # 账户名
 self.account_type = account_type # 账户类型
 self.account_cost = account_cost # 月结费用
 self.return_amount = return_amount # 返还金额

然后创建一个实体列表:

accounts = [Account("张三", "年费用户", 450.00, 50),
  Account("李四", "月结用户", 100.00),
  Account("杨不悔", "月结用户", 190.00, 25),
  Account("任我行", "月结用户", 70.00, 10),
  Account("凌未风", "年费用户", 400.00, 40)]

我想要执行next()功能,也就是需要的时候“next”一下,得到List中的下一个元素。

直接测试一下:

python中实现迭代器(iterator)的方法示例

结果发现List不支持next()特性。这时候,List只是一个iterable,而不是iterator。

iterable和iterator的区别如下:

  1. iterable —— 只实现了__iter__的对象;
  2. iterator —— 同时实现了__iter__和__next__方法的对象。

其中, __iter__返回iterator对象, __next__则返回迭代过程的下一个元素。

1. 让列表成为iterator

要让前面的accounts List成为iterator只需简单的一个iter()函数:

accounts_iterator = iter(accounts)
(next(accounts_iterator)).account_name

结果如下图所示:

python中实现迭代器(iterator)的方法示例

这么简单的函数,估计还是有不少Python开发者不知道吧?

2. 自定义iterator对象

扩展开来讲,如何定义自己的iterator对象呢?其实也就是按照上面的定义,实现__iter____next__方法。

我们接下来定义一个AccountIterator类:

class AccountIterator():
 def __init__(self, accounts):
 self.accounts = accounts # 账户集合
 self.index = 0

 def __iter__(self):
 return self

 def __next__(self):
 if self.index >= len(self.accounts):
  raise StopIteration("到头了...")
 else:
  self.index += 1
  return self.accounts[self.index-1]

运行结果如:

python中实现迭代器(iterator)的方法示例

通过这一阵折腾,next()功能就实现了。Python有不少意外的功能,还等着我们不断去探究,也许这就是Python的魅力及极客之处。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
详解Python中dict与set的使用
Aug 10 Python
Python 中的 else详解
Apr 23 Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
python实现指定文件夹下的指定文件移动到指定位置
Sep 17 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
python爬虫中url管理器去重操作实例
Nov 30 Python
用python发送微信消息
Dec 21 Python
python Polars库的使用简介
Apr 21 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 Python
Python正则替换字符串函数re.sub用法示例
Jan 19 #Python
Python中二维列表如何获取子区域元素的组成
Jan 19 #Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 #Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 #Python
Python爬取网易云音乐上评论火爆的歌曲
Jan 19 #Python
一步步教你用Python实现2048小游戏
Jan 19 #Python
python 开发的三种运行模式详细介绍
Jan 18 #Python
You might like
由php if 想到的些问题
2008/03/22 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
javascript 三种编解码方式
2010/02/01 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
webpack优化的深入理解
2018/12/10 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
Python中unittest用法实例
2014/09/25 Python
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
win与linux系统中python requests 安装
2016/12/04 Python
python3 flask实现文件上传功能
2020/03/20 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
python 魔法函数实例及解析
2019/09/25 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
员工培训邀请函
2014/01/11 职场文书
省级四好少年事迹材料
2014/01/25 职场文书
农村党员一句话承诺
2014/05/30 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
2014财务年度工作总结
2014/11/11 职场文书
银行先进个人总结
2015/02/15 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
MySQL系列之六 用户与授权
2021/07/02 MySQL
Python经常使用的一些内置函数
2022/04/11 Python