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 15 Python
Python实现控制台进度条功能
Jan 04 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
Python检查ping终端的方法
Jan 26 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
django Admin文档生成器使用详解
Jul 22 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
Django跨域请求原理及实现代码
Nov 14 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 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
多文件上传的例子
2006/10/09 PHP
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
PHP实现的策略模式示例
2019/03/20 PHP
浅谈php调用python文件
2019/03/29 PHP
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
Python函数学习笔记
2008/10/07 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
RC4文件加密的python实现方法
2015/06/30 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
深入学习python多线程与GIL
2019/08/26 Python
python 函数中的参数类型
2020/02/11 Python
python实现简单的购物程序代码实例
2020/03/03 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
美国时尚女装在线:Missguided
2016/12/03 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
考试后的感想
2015/08/07 职场文书