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的装饰器模式与面向切面编程详解
Jun 21 Python
Python实现Kmeans聚类算法
Jun 10 Python
pandas修改DataFrame列名的方法
Apr 08 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python tkinter label 更新方法
Oct 11 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
python之yield和Generator深入解析
Sep 18 Python
wxpython多线程防假死与线程间传递消息实例详解
Dec 13 Python
pandas 中对特征进行硬编码和onehot编码的实现
Dec 20 Python
django 模版关闭转义方式
May 14 Python
python绘制趋势图的示例
Sep 17 Python
详解Java中一维、二维数组在内存中的结构
Feb 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 GeoIP的使用教程
2011/03/09 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
js实现验证码干扰(动态)
2021/02/23 Javascript
python中zip和unzip数据的方法
2015/05/27 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
Python常用特殊方法实例总结
2019/03/22 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
情人节寄语大全
2014/04/11 职场文书
高中同学会活动方案
2014/08/14 职场文书
教师个人考察材料
2014/12/16 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
创业计划书之寿司
2019/07/19 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL
MySQL学习之基础操作总结
2022/03/19 MySQL
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS