【Python】迭代器__iter__、__next__

news2025/7/15 12:55:12

这里主要纠正迭代器的用法,因为一些教程传播错误示例让我很无语。

最大的错误就是,把__iter__和__next写在同个类里,每每看见都感到诧异。不是说这方法不行,主要是,一旦出现预期之外的运行结果往往很难查到原因(因为它压根不是报错,也不是运行异常)。



0、先附上两个类Vector_Right和Vector_Wrong:

class Vector_Right:#有迭代器类
    class __Iter:
        def __init__(self,lst):
            self.__lst=lst
            self.__pst=0
        def __next__(self):
            if(self.__pst>=len(self.__lst)):
                raise StopIteration
            else:
                val=self.__lst[self.__pst]
                self.__pst+=1
                return val
    def __init__(self,lst):
        self.__lst=list(lst) if lst else []
    def __iter__(self):#返回迭代器
        return self.__Iter(self.__lst)
class Vector_Wrong:#没有迭代器
    def __init__(self,lst):
        self.__lst=list(lst) if lst else []
    def __iter__(self):#自己就是迭代器(黑人问号)
        self.__pst=0
        return self
    def __next__(self):
        if(self.__pst>=len(self.__lst)):
            raise StopIteration
        else:
            val=self.__lst[self.__pst]
            self.__pst+=1
            return val


1、首先,先来个简单的多线程:

from threading import Thread
from time import sleep
from random import randint

def Traversal(vector,func,rst):
    for i in vector:
        rst.append(func(i))
        sleep(randint(1,10)/1000)

for Vector in [Vector_Right,Vector_Wrong]:
    vector=Vector(range(26))
    rst=[[],[]]
    th_1=Thread(target=lambda:Traversal(vector,lambda val:chr(ord('a')+val),rst[0]))#两条线程同时遍历vector
    th_2=Thread(target=lambda:Traversal(vector,lambda val:chr(ord('A')+val),rst[1]))
    th_1.start()
    th_2.start()
    th_1.join()
    th_2.join()

    print(Vector)
    for lst in rst:
        print(lst)
    print()

结果-1



2、然后,再来个多层遍历同对象的操作:

for Vector in [Vector_Right,Vector_Wrong]:
    print(Vector)
    vector=Vector(range(3))
    for x in vector:
        for y in vector:
            print(x,y)
    print()

结果-2



3、结论:

以上结果都说明,Vector_Wrong未能顺利遍历,这就是把自身作为迭代器返回的弊端,因为无法保证同一时间内同个容器只有一个迭代器在使用。

而且对于Python原生的容器list、dict、str、set、tuple等,它们都没把__next__写在容器类里而是写在迭代器类中:

请添加图片描述



本文发布于CSDN:https://blog.csdn.net/weixin_44733774/article/details/132769946
未经个人同意不得私自转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

系列文章 Nomad 系列文章Traefik 系列文章Tailscale 系列文章 概述 终于到了令人启动的环节了:NomadTraefikTailscale 集成实现零信任安全。 在这里: Nomad 负责容器调度;(容器编排工具)Traefik 负责入口流量&…

文件导入之Validation校验List对象数组

背景: 我们的接口是一个List对象,对象里面的数据基本都有一些基础数据校验的注解,我们怎么样才能校验这些基础规则呢? 我们在导入excel文件进行数据录入的时候,数据录入也有基础的校验规则,这个时候我们又…

Linux下C语言使用 netlink sockets与内核模块通信

netlink简介 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中,系统默认集成了很多netlink实例,比如日志上报、路由系统等,netlink消息是双向的&a…

解决 tesserocr报错 Failed to init API, possibly an invalid tessdata path : ./

问题描述 我们在初次使用tesserocr库的时候,可能会报以下错误: RuntimeError: Failed to init API, possibly an invalid tessdata path: ./ 这是因为我们在使用 conda 创建的环境中找不到"tessdata"这个文件夹。 解决办法 这时候把Tessera…

【CMake工具】工具CMake编译轻度使用(C/C++)

目录 CMake编译工具 一、CMake概述 二、CMake的使用 2.1 注释 2.1.1 注释行 2.1.2 注释块 2.2 源文件 2.1.1 共处一室 2.1.2 VIP包房 2.3 私人定制 2.2.1 定义变量 2.2.2 指定使用的C标准 2.2.3 指定输出的路径 2.4 搜索文件 2.3.1 方式1 2.3.2 方式2 2.5 包含…

CRM软件系统能否监控手机的使用

CRM可以监控手机吗?答案是不可以。CRM是一款帮助企业优化业务流程,提高销售效率的工具。例如Zoho CRM,最多也就是听一下销售的通话录音,却不可以监控手机,毕竟CRM不是一款监控软件。 CRM的主要作用有以下几点&#xf…

CASAIM与南京航空航天大学在自动化叶片曲面分析系统开展合作,推动航空航天发动机零部件自动化3D检测进程

近期,CASAIM与南京航空航天大学在自动化叶片曲面分析系统展开深入合作,充分发挥双方在航空航天和智能检测领域优势,共同推动航空航天发动机零部件自动化3D检测进程。 南京航空航天大学创建于1952年10月,是新中国自己创办的第一批…

聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展

【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售&#xf…

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析

本文是 3 篇系列文章的一部分,该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是三部分系列的第三部分。它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术对智能手机镜头进行自动的结构、热…

微信小程序的开发---tabBar的介绍

目录 一、tabBar的介绍 二、tabBar的6个组成部分 三、tabBar节点的配置项 四、tab项的配置选项 五、tabBar的使用 一、tabBar的介绍 tabBar是移动端应用常见的页面效果,用于实现多页面的快速切换。小程序中通常将其分为: (1)…

猫头虎解析:如何巧妙避免GET请求中的“EOF“错误?

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

企业架构LNMP学习笔记22

防盗链原理和实现。 域名A的资源文件,经常被域名B直接调用访问。 而用户经常访问域名B,看到的资源(图片等)以为是域名B的,实际则是域名A的。 但是域名A没有获得任何收益,却要给域名B来源的访问消耗服务器…

解决eclipse的报错:Must declare a named package because this compilation

刚安装完成eclipse, 创建类的时候报错 报错信息如下: 原因:新版本的ECLIPSE要求每一个类都必须定义在包里面 解决方法:创建类的时候指定类的名字,如下图:Package 里面填写ch3,表示包名 创建完成…

智慧物联网医疗,树立可持续性智能化和便利化新标杆

医疗物联网(IoMT)是一个快速发展的领域,它正在改变医疗保健的未来。IoMT 指的是物理设备、车辆、家用电器和其他嵌入传感器、软件和网络连接的对象的网络。这些设备可以帮助医疗保健提供者更好地了解患者的状况,并提供更高效和更有…

区分何时使用内连接或者外连接

一张表(A)中的一条记录可以对应另一张表(B)中的多条记录; 另一张表(B)中的一条记录只能对应一张表(A)中的一条记录。 //查询所有姓张的学生的id,name和所在班级name 这里如果外键可以为空的话就需要使用左外连接,才可以查到。 内连接 //假如外键不可以为空select…

Canape使用中遇到问题的解决办法

问题一、canape绘制目标时,二维结构体变量只能录制16个的解决办法 打开ASAP2 Studio 2.6 -Expert 软件。 把该软件中的设置项如下图进行修改。 然后用ASAP2 Studio 2.6 -Expert 软件 打开elf文件导出成A2L文件。 最后关闭该软件。 再在canape工程中重新加载刚才…

1.8 工程相关解析(各种文件,资源访问

目录 1.8 工程相关解析(各种文件,资源访问) 分类 Android 基础入门教程 本节引言: 1.工程项目结构解析: 1.res资源文件夹介绍: 2.如何去使用这些资源 2.深入了解三个文件: MainActivity.java: 布局…

指针-成绩统计

任务描述 请设计一个函数,以指针变量作为函数的参数,从标准输入上读入数量不定的成绩。统计全班成绩的总数量、90 分及以上成绩的个数、60 分及以上成绩的个数和全班成绩的平均分,并返回这四个数给主程序。编写主程序调用此函数完成统计功能…

gitlab 点击Integrations出现500错误

背景:在新服务器重新搭建了gitlab,并导入原来gitlab的备份,在项目中点击点击Integrations出现500错误。 解决方法:1.进入新服务器,将 /etc/gitlab/gitlab-secrets.json重命名为 /etc/gitlab/gitlab-secrets.json.bak …

快速入门 Logback

简介 Logback 旨在作为流行的 log4j 项目的继承者。它是由 log4j 创始人 Ceki Gulcu 设计的。同时它也是 SpingBoot 项目的默认日志框架。 安装 因为 logback 需要和 slf4j 一起使用,所以总共需要添加依赖的包有 slf4j-api.jar,logback-core.jar&…