当前位置: 首页 > article >正文

python中迭代器和可迭代对象

迭代器

迭代器是实现了__iter__()方法和__next__()方法的对象

在__iter__()方法中可以直接返回对象本身,因为迭代器的对象本身就是一个迭代器

在__next__()方法中编写迭代的逻辑,并且当迭代完成后要让其返回StopIteration异常,也就是说一个迭代器在迭代完成后就无法再重新迭代

举个例子:

下面的代码中Counter是一个迭代器,需要用户传递起始参数和终止参数,比如传入3,8,迭代器就会遍历3-8之间的数字。

其输出的结果只有一轮3 4 5 6 7 8,第二次迭代并没有成功

class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        # 实例本身就是迭代器,所以返回self
        return self

    def __next__(self):
        # 如果当前值小于或等于最大值,则返回当前值并增加
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1


counter = Counter(3, 8)
for i in counter:
    print(i)

for i in counter:
    print(i)

可迭代对象

可迭代对象是实现了__iter__()方法的对象。

和迭代器不同的是:在__iter__()方法中返回的是一个迭代器,这样可以保证可迭代对象可以迭代多次。

举个例子:

下面这个例子里面CountIterable是可迭代对象,在__iter__()方法中返回了Counter的对象,Counter是一个迭代器

其输出结果是两轮3 4 5 6 7 8

class CountIterable:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return Counter(self.current, self.high)


class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        # 实例本身就是迭代器,所以返回self
        return self

    def __next__(self):
        # 如果当前值小于或等于最大值,则返回当前值并增加
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1


countIterable = CountIterable(3, 8)
for i in countIterable:
    print(i)

for i in countIterable:
    print(i)

两者区别

1. 迭代器是消耗性的,迭代器在遍历过程中会记住上一次的执行位置

2. 可迭代对象每次都是从头开始,不会被消耗


http://www.kler.cn/news/314693.html

相关文章:

  • 【系统架构设计师】特定领域软件架构(经典习题)
  • 边缘智能-大模型架构初探
  • WebGL基础知识快速入门
  • 安装nuxt3
  • 「iOS」viewController的生命周期
  • Android TV RecyclerView列表获得焦点左右换行
  • 如何在Mac上安装多个Python环境
  • Spring Mybatis PageHelper分页插件 总结
  • MySQL篇(SQL优化)(持续更新迭代)
  • Android Studio 开发快速获取开发版和发布版SHA1和MD5
  • 汽车美容服务管理系统的数据库设计与数据操作
  • nvm 下载node报错:Could not retrieve https://nodejs.org/dist/index.json.
  • 奇安信渗透2面经验分享
  • HarmonyOS第一课-应用程序框架基础习题答案
  • 邮件安全治理
  • 解决nginx代理SSE接口的响应没有流式返回
  • 详细分析Spring的动态代理机制
  • zynq的PS端mac与RTL8211F的连接要点
  • 微服务架构中的负载均衡与服务注册中心(Nacos)
  • Cursor免费 GPT-4 IDE 工具的保姆级使用教程
  • Spring01
  • C# 中的NPOI 库
  • 生物信息常用编辑器:轻量高效的VS Code
  • 山东潍坊戴尔存储服务器维修 md3800f raid恢复
  • Docker Registry API best practice 【Docker Registry API 最佳实践】
  • 解决mybatis plus 中 FastjsonTypeHandler无法正确反序列化List类型的问题
  • 跨游戏引擎的H5渲染解决方案(腾讯)
  • linux-系统备份与恢复-备份工具
  • uniapp 微信小程序 订阅消息功能实现
  • 大数据实验2.Hadoop 集群搭建(单机/伪分布式/分布式)