python中实现迭代器(iterator)的方法示例
作者:瓜园耕读 发布时间:2021-07-12 19:32:41
概述
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
延迟计算或惰性求值 (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中的下一个元素。
直接测试一下:
结果发现List不支持next()
特性。这时候,List只是一个iterable,而不是iterator。
iterable和iterator的区别如下:
iterable —— 只实现了__iter__的对象;
iterator —— 同时实现了__iter__和__next__方法的对象。
其中, __iter__
返回iterator对象, __next__
则返回迭代过程的下一个元素。
1. 让列表成为iterator
要让前面的accounts List成为iterator只需简单的一个iter()
函数:
accounts_iterator = iter(accounts)
(next(accounts_iterator)).account_name
结果如下图所示:
这么简单的函数,估计还是有不少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]
运行结果如:
通过这一阵折腾,next()功能就实现了。Python有不少意外的功能,还等着我们不断去探究,也许这就是Python的魅力及极客之处。
来源:http://www.2gua.info/post/64
猜你喜欢
- php面试题的题目: $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php
- 从我们论坛中收集了这段HTML制作页面需要最大化、最小化时可以借鉴参考。最大化效果:<OBJECT id="max
- 放大镜并不是一个难以实现的效果, 只是因为牵涉到一些精确的数值计算, 显得比较繁琐. 在未来的一段日子, 我会不定期地写关于 JavaScr
- 为了顺利的开发一个多语言的国际化J2EE程序,需要修改数据库字符集,我的做法如下:安装 MySq时选择字符集为UTF-8修改MySql安装目
- XML是一个精简的SGML,它将SGML的丰富功能与HTML的易用性结合到Web的应用中。XML保留了SGML的可扩展功能,这使XML从根本
- 1、利用php gd库的函数绘制3D扇形统计图<?phpheader("content-type","t
- 当你在浏览网页时,看到一个很漂亮的特效,你查看源代码时看到的是一队乱码,那多扫兴呀!根据本人的研究,总结出了三种解密方法,与大家分享!!方法
- 很简单,只需建立一个worksheet和Excel相关的信息就可以了具体代码见下:<%set xlApp =&nb
- 一、目录权限设置很重要:可以有效防范黑客上传木马文件. 如果通过 chmod 644 * -R 的话,php文件就没有权限访问了。 如果通过
- 我们在日常开发中,我们经常会面对复杂的子系统,其中包含许多相互关联的类和接口。直接使用这些类和接口可能会导致代码的复杂性增加,使得系统难以维
- PHP信息函数包含的一些函数概念总结如下。PHP信息函数之getenv适用版本:PHP3, PHP4函数功能:取得环境变量数值。函数语法:s
- 在CSS中,实现分栏布局有两种方法。第一种方法是使用四种CSS定位选项(absolute 、static、relative和fixed)中的
- 半透明效果有时候会给页面增加不少色彩,特别是Vista盛行之后,半透明效果更加受推崇。在诸多可用于Web浏览的图片格式中,只有PNG格式和G
- 此类技巧还有很多,欢迎继续分享解析 URL从 James Padolsey 的 Blog中看到的个小技巧,就是利用 a 标签的 DOM 属性
- 在现代LOGO设计当中,叶子的形状被视做好的创意。或者说,是一种变革的想法。在网页中他们大多被用于轻量级的解决方案、干净的不抽像的设计。在实
- 相信每个前端工程师都有自己喜爱的javascript框架,说情感也好,道信仰也罢,javascript框架带给人的不仅仅是便捷的开发,更有一
- 图像(包括动图)是传递信息的一种高效方式,往往能增强表象、记忆与思维等方面的反应强度。所谓一图胜千言,说的就是这个道理。今天为大家整理了十张
- aspjpeg组件官方下载地址:http://www.persits.com/说明: 1、aspjpeg能对图片水印进行透明度调整
- 我以centos 4.4 下面的mysql 5.0.33 手工编译版本为例说明:vi /usr/local/mysql/bin/m
- 如下所示:#! usr/bin/python#coding=utf-8 import numpy as npimport matplotli