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设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
一道python走迷宫算法题
Jan 22 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
python读取Kafka实例
Dec 23 Python
Python chardet库识别编码原理解析
Feb 18 Python
django-csrf使用和禁用方式
Mar 13 Python
python+selenium+Chrome options参数的使用
Mar 18 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 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
配置支持SSI
2006/11/25 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
深入了解Python iter() 方法的用法
2019/07/11 Python
python单例模式的多种实现方法
2019/07/26 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Python线程指南分享
2019/11/19 Python
python实现超市商品销售管理系统
2019/11/22 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
同程旅游英文网站:LY.com
2018/11/13 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
实体的生命周期
2013/08/31 面试题
测试工程师职业规划书
2014/02/06 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python