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 04 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
Python模拟登陆实现代码
Jun 14 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
python使用装饰器作日志处理的方法
Jul 11 Python
python 默认参数相关知识详解
Sep 18 Python
python中的itertools的使用详解
Jan 13 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 Python
通过实例简单了解python yield使用方法
Aug 06 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 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
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
vue-loader教程介绍
2017/06/14 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
python获取本地计算机名字的方法
2015/04/29 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python中super()函数简介及用法分享
2016/07/11 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
python urllib和urllib3知识点总结
2021/02/08 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
土木工程个人自荐信范文
2013/11/30 职场文书
高二化学教学反思
2014/01/30 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
体现团队精神的口号
2014/06/06 职场文书
2014年学校工作总结
2014/11/20 职场文书
孙振耀退休感言
2015/08/01 职场文书
python 中yaml文件用法大全
2021/07/04 Python