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学习入门之区块链详解
Jul 25 Python
浅析使用Python操作文件
Jul 31 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
Python上下文管理器全实例详解
Nov 12 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
Python实现文字pdf转换图片pdf效果
Apr 03 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 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
请解释在new与override的区别
2012/10/29 面试题
环境科学专业个人求职的自我评价
2013/11/28 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
六一亲子活动总结
2014/07/01 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
离婚纠纷代理词
2015/05/23 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android