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程序设计入门(1)基本语法简介
Jun 13 Python
Python内置函数的用法实例教程
Sep 08 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
python使用arcpy.mapping模块批量出图
Mar 06 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 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
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python函数和模块的使用总结
2019/05/20 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
标准自荐信范文
2014/01/29 职场文书
授权委托书怎么写
2014/04/03 职场文书
《去年的树》教学反思
2014/04/11 职场文书
公司应聘求职信
2014/06/21 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
污水处理保证书
2015/05/09 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang