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


猜你喜欢
- PyTorch上的常用数据类型如下Data typedtypeCPU tensorGPU tensorSize/bytes32-bit fl
- 1.ACCESS查询(query_info):select * from info where stu = name1 and age =
- Flask框架难学吗?它和Django哪个更容易一些,这可能是学Python web开发的同学经常问的问题,下面来说一下flask框架。Fl
- 本文实例讲述了mysql 数据库备份的多种实现方式。分享给大家供大家参考,具体如下:一、使用mysqldump进行备份1、完整备份所有数据库
- JWT(JSON Web Token)是一种基于JSON的安全令牌,可以用于在不同系统之间传输认证信息。在Go中实现JWT验证,可以通过标准
- 前言Tensorflow的核心与NumPy非常相似,但具有GPU支持;Tensorflow支持分布式计算(跨多个设备和服务器)。像NumPy
- 本文实例讲述了Python针对给定列表中元素进行翻转操作的方法。分享给大家供大家参考,具体如下:题目给定一列表,翻转其中的元素,倒序输出做法
- PayPal支付功能其实一直在更新文档和接口,这里说的是一个简单的支付功能大概流程如下1,在网站的结账页面,设置一个提交到PayPal网站的
- 场景分析一般Linux系统默认自带两个版本的python,我按照的虚拟机系统自带的版本为python2.7和python3.2,但是由于个人
- 安装正常情况,只需pip install PIL==1.1.7或者pip install Pillow==2.9.0即可。但需留意安装后的输
- 巧用get和set,能够直接操作对象属性实现读写,可以极大的提高编程效率,给出一个典型示例: var test = { _Name : nu
- 计算两个信号的交叉谱密度结果展示:完整代码:import numpy as npimport matplotlib.pyplot
- 一、单字节SQL注入MYSQL的SQL注入已经由来已久,以下是普遍采用的注入步骤:1、在GET参数上加一个/*或者#(mysql专有的注释)
- 有空余的时候自己写了一下,代码没有进行很好的规整。如果发现bug请及时通告我,谢谢 主要功能:1、点击插入表情,可选
- python列表变量可以存储一个元素,而列表是一个大容器,可以存储N多个元素,程序可以方便的对这些数据进行整体操作(可以存储多个不同的数据类
- 基本操作查看数据库<code>show databases;</code>指定字符集<code>crea
- 在缺失值填补上如果用前后的均值填补中间的均值,比如,0,空,1,我们希望中间填充0.5;或者0,空,空,1,我们希望中间填充0.33,0.6
- 最近的开发项目中使用了vue-cli 3.0,使用体验可以说非常棒了,模板更加制定化,配置更加简洁。以下总结下应用过程中的一些经验。1. 安
- 今天我们来介绍下Python基础教程学习之iter() 方法另外的用法。据说很少有人知道这个用法!一、上代码、学用法我们都比较熟悉 iter
- 这篇论坛文章主要介绍了Oracle数据库到SQL Server数据库主键的迁移过程,具体内容请参考下文。由于项目需要要将以前Oracle的数