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


相关推荐: Laravel如何为API生成Swagger或OpenAPI文档  Laravel如何实现数据库事务?(DB Facade示例)  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何实现模型的全局作用域?(Global Scope示例)  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  独立制作一个网站多少钱,建立网站需要花多少钱?  php485函数参数是什么意思_php485各参数详细说明【介绍】  如何正确下载安装西数主机建站助手?  个人摄影网站制作流程,摄影爱好者都去什么网站?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  如何挑选最适合建站的高性能VPS主机?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  java获取注册ip实例  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  韩国服务器如何优化跨境访问实现高效连接?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  iOS发送验证码倒计时应用  Android Socket接口实现即时通讯实例代码  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  高防服务器租用如何选择配置与防御等级?  如何为不同团队 ID 动态生成多个非值班状态按钮  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel如何配置任务调度?(Cron Job示例)  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何在Tomcat中配置并部署网站项目?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何在阿里云购买域名并搭建网站?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  如何利用DOS批处理实现定时关机操作详解  如何在不使用负向后查找的情况下匹配特定条件前的换行符  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  制作公司内部网站有哪些,内网如何建网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用