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中的下一个元素。

直接测试一下:

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的魅力及极客之处。

来源:http://www.2gua.info/post/64

标签:python,iterator,迭代器
0
投稿

猜你喜欢

  • python3 简单实现组合设计模式

    2023-06-12 19:15:50
  • 科讯CMS编辑器会自动更改代码

    2008-12-12 13:00:00
  • ASP使用组件在线发E-mail的2个函数

    2008-06-12 07:13:00
  • 如何改良你的CSS代码编写结构

    2008-09-29 16:03:00
  • Python基于OpenCV实现人脸检测并保存

    2023-10-07 00:43:37
  • python中尾递归用法实例详解

    2023-10-09 06:46:15
  • 一个css垂直水平居中布局,css效果

    2008-11-03 11:40:00
  • 利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法

    2023-09-11 15:11:50
  • 栅格:一以贯之

    2008-07-22 12:19:00
  • ASP图片分页代码 (通用)

    2009-06-22 12:57:00
  • 在ORACLE移动数据库文件

    2010-08-02 12:54:00
  • N年前的JAVASCRIPT笔记

    2009-01-07 12:40:00
  • 通过优化CSS代码 减小对系统资源的占用

    2010-08-03 12:33:00
  • 使用tensorflow实现AlexNet

    2023-08-10 08:29:30
  • 完全卸载MYSQL

    2011-02-23 12:11:00
  • Python GAE、Django导出Excel的方法

    2023-02-27 13:59:09
  • 如何创建CSS的对象,获取合适的粒度

    2010-07-09 13:10:00
  • 关于xmlhttp乱码的解决方法

    2008-09-24 17:20:00
  • js处理括弧配对替换的方法

    2008-01-16 13:48:00
  • JavaScript实现三种常用网页特效(offset、client、scroll系列)

    2023-08-27 11:54:30
  • asp之家 网络编程 m.aspxhome.com