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的一些用法分享
Oct 07 Python
用python实现面向对像的ASP程序实例
Nov 10 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
Python venv虚拟环境配置过程解析
Jul 08 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
如何将json数据转换为python数据
Sep 04 Python
利用Python实现自动扫雷小脚本
Dec 17 Python
Python PIL按比例裁剪图片
May 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
PHP个人网站架设连环讲(二)
2006/10/09 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
限制复选框的最大可选数
2006/07/01 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
Vue2.0生命周期的理解
2018/08/20 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
详解CSS3:overflow属性
2020/11/17 HTML / CSS
对标管理实施方案
2014/03/12 职场文书
元旦促销方案
2014/03/15 职场文书
捐资助学倡议书
2014/04/15 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
寒假安全保证书
2015/02/28 职场文书
给病人的慰问信
2015/03/23 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书