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 相关文章推荐
wxPython窗口的继承机制实例分析
Sep 28 Python
详解Python设计模式编程中观察者模式与策略模式的运用
Mar 02 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
对TensorFlow中的variables_to_restore函数详解
Jul 30 Python
python实现梯度下降算法
Mar 24 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
教你用Python matplotlib库制作简单的动画
Jun 11 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的Yii框架入门使用教程
2016/02/15 PHP
php获取微信openid方法总结
2019/10/10 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
文本加密解密
2006/06/23 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
Python多线程学习资料
2012/12/19 Python
Python读大数据txt
2016/03/28 Python
python实现两个文件合并功能
2018/04/01 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
党员创先争优承诺书
2014/03/26 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书