python中实现迭代器(iterator)的方法示例

发布时间 - 2026-01-10 22:39:09    点击率:

概述

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

延迟计算或惰性求值 (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的区别如下:

  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开发者不知道吧?

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。


# python  # iterator  # python3  # iterator实现  # Python 迭代器Iterator详情  # Python迭代器iterator生成器generator使用解析  # 一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Gen  # Python中Iterator迭代器的使用杂谈  # python中迭代器(iterator)用法实例分析  # Python浅析迭代器Iterator的使用  # 迭代  # 实现了  # 自己的  # 年费  # 这一  # 是在  # 第一个  # 在这  # 有不少  # 这就是  # 之处  # 遍历  # 只需  # 等着  # 不存在  # 自定义  # 要让  # 不支持  # 所示  # 这篇文章 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 教你用AI将一段旋律扩展成一首完整的曲子  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何创建自定义Artisan命令?(代码示例)  微信小程序 闭包写法详细介绍  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何安全更换建站之星模板并保留数据?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何在VPS电脑上快速搭建网站?  Laravel storage目录权限问题_Laravel文件写入权限设置  中山网站制作网页,中山新生登记系统登记流程?  如何快速搭建自助建站会员专属系统?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  南京网站制作费用,南京远驱官方网站?  如何快速查询网址的建站时间与历史轨迹?  如何在云主机快速搭建网站站点?  如何在服务器上配置二级域名建站?  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何用PHP快速搭建CMS系统?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  再谈Python中的字符串与字符编码(推荐)  无锡营销型网站制作公司,无锡网选车牌流程?  如何在Windows服务器上快速搭建网站?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何在IIS7中新建站点?详细步骤解析  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  微信公众帐号开发教程之图文消息全攻略  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  BootStrap整体框架之基础布局组件  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  音乐网站服务器如何优化API响应速度?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在云服务器上快速搭建个人网站?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  php 三元运算符实例详细介绍  HTML 中动态设置元素 name 属性的正确语法详解  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】