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绘制常用的图表
Aug 27 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
git进行版本控制心得详谈
Dec 10 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
Python实现简单http服务器
Apr 12 Python
python连接mongodb密码认证实例
Oct 16 Python
python事件驱动event实现详解
Nov 21 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 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默认安装产生系统漏洞
2006/10/09 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
python检查指定文件是否存在的方法
2015/07/06 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
Python进程间通信Queue实例解析
2018/01/25 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
浅谈python写入大量文件的问题
2018/11/09 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
python Kmeans算法原理深入解析
2019/08/23 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
Python2与Python3的区别点整理
2019/12/12 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
火车的故事教学反思
2014/02/11 职场文书
军训后的感想
2015/08/07 职场文书
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android