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 01 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
django模板语法学习之include示例详解
Dec 17 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
Linux下python3.7.0安装教程
Jul 30 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
python函数的作用域及关键字详解
Aug 20 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
Python之字符串的遍历的4种方式
Dec 08 Python
pandas取dataframe特定行列的实现方法
May 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运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
jquery清空表单数据示例分享
2014/02/13 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
简单了解python协程的相关知识
2019/08/31 Python
Python selenium的基本使用方法分析
2019/12/21 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
什么造成了Java里面的异常
2016/04/24 面试题
优秀毕业生推荐信
2013/11/02 职场文书
访谈节目策划方案
2014/05/15 职场文书
机械专业求职信范文
2014/07/15 职场文书
2014年化验员工作总结
2014/11/18 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
Python3接口性能测试实例代码
2021/06/20 Python