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读取注册表中值的方法
Apr 08 Python
Python批量修改文件后缀的方法
Jan 26 Python
Python中apply函数的用法实例教程
Jul 31 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
numpy实现神经网络反向传播算法的步骤
Dec 24 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
python中前缀运算符 *和 **的用法示例详解
May 28 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
Python如何将装饰器定义为类
Jul 30 Python
详解python datetime模块
Aug 17 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项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
php封装一个异常的处理类
2017/06/08 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
javascript数组去掉重复
2011/05/12 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
python os用法总结
2018/06/08 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
python实现贪吃蛇双人大战
2020/04/18 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
口头翻译求职人自荐信
2013/12/07 职场文书
出纳员岗位职责
2014/03/13 职场文书
求职自我评价范文100字
2014/09/23 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
单位介绍信格式范文
2015/05/04 职场文书
springboot实现string转json json里面带数组
2022/06/16 Java/Android