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 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
python频繁写入文件时提速的方法
Jun 26 Python
wxPython实现绘图小例子
Nov 19 Python
python中必要的名词解释
Nov 20 Python
python实现文法左递归的消除方法
May 22 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
May 24 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
pytorch 移动端部署之helloworld的使用
Oct 30 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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安全配置方法
2007/06/16 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
php页面防重复提交方法总结
2013/11/25 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
javascript比较文档位置
2008/04/08 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
Js apply方法详解
2017/02/16 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Django自定义分页效果
2017/06/27 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
python给list排序的简单方法
2020/12/10 Python
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
三好学生评语大全
2014/12/29 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
Python OpenCV之常用滤波器使用详解
2022/04/07 Python