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 相关文章推荐
简单介绍Python中的RSS处理
Apr 13 Python
Python封装shell命令实例分析
May 05 Python
python统计cpu利用率的方法
Jun 02 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 Python
深入理解Django自定义信号(signals)
Oct 15 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
Python调用.NET库的方法步骤
Dec 27 Python
keras中的卷积层&池化层的用法
May 22 Python
Python源码解析之List
May 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
php win下Socket方式发邮件类
2009/08/21 PHP
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
事件绑定之小测试  onclick && addEventListener
2011/07/31 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
React Router基础使用
2017/01/17 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
Vue中util的工具函数实例详解
2019/07/08 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
python实现连连看游戏
2020/02/14 Python
python实现超级玛丽游戏
2020/03/18 Python
Python如何转换字符串大小写
2020/06/04 Python
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
思想品德自我鉴定
2013/10/12 职场文书
一帮一活动总结
2014/05/08 职场文书
助残日活动总结
2014/08/27 职场文书
学习十八大标语
2014/10/09 职场文书
2015年平安创建工作总结
2015/04/29 职场文书