Python for循环迭代原理(迭代器 Iterator)

news2024/9/9 0:24:11

在使用Python时,我们经常会使用for循环来访问容器对象(列表、字符、字典等)中的元素。其幕后实际是通过迭代协议来完成的,迭代是一种依次访问对象中元素的方式,for循环在对象上调用iter()函数生成一个迭代器(对象要是可迭代的,即支持迭代协议),然后通过迭代器对元素进行访问。

文章目录

  • 一、for循环的实现
  • 二、自定义迭代行为

一、for循环的实现

考虑下面一个简单for循环

numbers = [1,2,3]
for num in numbers:
    print(num)

在这里插入图片描述

当for循环作用在numbers变量上时,它实际依次做了下面的动作:

  1. 调用iter(numbers),此函数会返回一个迭代器对象,该对象会包含一个__next()__方法,调用此方法会逐一访问对象中的元素。
  2. 重复调用对象的__next()__方法,逐个返回对象中的元素。
  3. 元素用尽时,迭代器会抛出StopIteration异常,for循环捕获到该异常,退出for循环,执行结束。

因此for循环幕后的执行过程就是:

it = iter(numbers)    # 返回迭代器对象,赋给变量it
it.__next__()    # 调用迭代器对象的__next__()方法,返回1。也可以使用next(it)来调用对象上的__next__()方法
it.__next__()    # 返回2
it.__next__()    # 返回3
it.__next__()    # 元素耗尽,抛出StopIteration异常,for循环退出

在这里插入图片描述

二、自定义迭代行为

知道了迭代的原理,我们就可以通过自定义__next__()方法,改造for循环的迭代行为。

例如下面自定义一个迭代类,从第一个元素开始,每次迭代跳过一个元素。为了满足这个需求只需要自定义__next__()方法,每次给索引步长加2即可,:

class SkipOneElement:
    def __init__(self, data):
        self.data = data
        self.index = -2
        
    def __iter__(self):
        return self
    
    def __next__(self):    # 自定义__next__()方法,for循环会自动调用此方法
        self.index += 2    # self.index = -2加上步长,初始的索引就是0,随后每次增加2,即跳过一个元素
        if self.index >= len(self.data) or len(self.data) == 0:    # 当索引超过对象长度或对象为空,抛出StopIteration异常
            raise StopIteration
        return self.data[self.index]    # 返回索引指向的元素

在这里插入图片描述

下面用range(10)来测试效果,常规的循环如下:

for num in range(10):
    print(num)

在这里插入图片描述

自定义迭代效果如下,可以看到从索引为0的元素开始,后续每次迭代都跳过了一个元素:

for num in SkipOneElement(range(10)):
    print(num)

在这里插入图片描述

如果想要反向迭代,那么初始索引只需要设置为len(self.data),然后每次减1即可。总之,知道了for循环的运作方式,你就可以根据需求随意调整__next__()方法,达到自定义迭代行为的目的。

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

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

相关文章

从后端开发视角认识向量数据库

以ChatGPT为代表的大语言模型应用自问世以来已经火了好几年。在这期间国内外类似产品层出不穷,甚至公司内部团队都开发了好几个AI小助手。刚好最近看了几篇关于大语言模型应用开发的文章,借此了解了一下应用层面的基本知识,也算是接触到了大语…

轻松入门Linux—CentOS,直接拿捏 —/— <2>

一 、权限问题详细讲解 读写的权限可以分别写成 r, w, x 总共有九个权限,可以分组三大组分别是: user:当前文件所属用户的权限 group:与当前文件所属用户同一组的用户权限 others:其他用户的权限 故使用 u, g, o 来代表…

Qt Creator 与 ESP-IDF QEMU 模拟器使用指南

标题: Qt Creator 与 ESP-IDF QEMU 模拟器使用指南 概要: 本文为开发者提供了使用 Qt Creator 和 ESP-IDF QEMU 模拟器进行 ESP32 开发的详细指南,包括环境准备、项目创建和编译、模拟器设置、编程和调试等方面的内容。通过本指南,可以快速上手 Qt Crea…

bean管理

获取bean bean作用域 第三方bean

如何使用虚拟机如何安装 Kali Linux ?

1.下载虚拟机:https://www.virtualbox.org/wiki/Downloads 选择你的系统版本 2.下载kali linux系统镜像:https://www.kali.org/get-kali/#kali-virtual-machines 全部下载完成后,我们会得到以下文件! 1.压缩Kali Linux压缩包 2.安…

OpenCV C++的网络实时视频流传输——基于Yolov5 face与TCP实现实时推流的深度学习图像处理客户端与服务器端

前言 在Windows下使用TCP协议,基于OpenCV C与Yolov5实现了一个完整的实时推流的深度学习图像处理客户端与服务器端,为了达到实时传输的效果,客户端使用了多线程的方式实现。深度学习模型是基于onnxruntime的GPU推理。,实现效果如…

跨境电商网红营销SOP流程2.0丨出海笔记

之前几位大神已经在出海笔记分享过网红营销一些很落地的干货,无论是想自己找红人还是找Agency都很有必要了解下这里面的流程的,下面我大概总结了一个SOP2.0 供大家快速上手: 以上是网红营销的SOP,做到以上部分基本60分没问题了…

【云原生】Kubernetes中crictl的详细用法教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

AI作图接口要怎么调用呢?

一、什么是AI作图? 基于AI大模型的深度学习算法和大规模的图像数据训练,输入图片和关键词,可生成独特及富有创意的山水风格图片。 二、AI作图使用场景有哪些呢? 1.广告与营销: 为产品制作吸引人的宣传海报、广告图片…

OpenStack——nova

计算服务nova nova简介——计算服务nova(Iaas侧服务) * 提供大规模、可扩展、按需自助服务的计算资源 * 支持管理裸机,虚拟机和容器 * Nova即OpenStack Compute service,负责提供计算资源的模块,也是OpenStack中的核…

以西门子winCC为代表的组态界面,还是有很大提升空间的。

组态界面向来都是功能为主,美观和体验性为辅的,这也导致了国内的一些跟随者如法炮制,而且很多操作的工程师也是认可这重模式,不过现在一些新的组态软件可是支持精美的定制化界面,还有3D交互效果,这就是确实…

坐标系转换公式

坐标系转换2种情况: 一、XOY坐标系不动,点P(x, y) 沿顺时针方向旋转 θ \thetaθ,得在XOY坐标系的坐标为P(x′, y′) 设某点与原点连线和X轴夹角为b度,以原点为圆心,逆时针转过a度 , 原点与该点连线长度为R, [x,y]为…

前端开发:Vue2.0桌面组件库-Element

引入Element的步骤: 1.在vscode终端中执行命令(需要联网) 下载成功 2.在main.js中导入element.ui组件库。 同上,自定义的组件需要先在根组件中引入。 3.访问官网,复制调整代码

C语言:指针的进阶

指针的进阶 一、字符指针(一)字符指针(二)常量字符串和字符数组 二、指针数组和数组指针(一)指针数组 int *p1[10](二)数组指针 int (*p2)[10] 三、函数指针(一&#xff…

【Unity编辑器拓展】GraphView自定义可视化节点

1、创建节点区域脚本 其中的new class UxmlFactory,可以让该元素显示在UI Builder中,我们就可以在Library-Project中看到我们新建的这两个UI元素,就可以拖入我们的UI窗口编辑了 public class NodeTreeViewer : GraphView {public new class…

UnityShaderUI编辑器扩展

前言: 当我们在制作通用Shader的时候,避免不了许多参数混杂在一起,尽管在材质面板已经使用过Header标签来区分,但是较长的Shader参数就会导致冗余,功能块不够简约明了,如图: 对于Shader制作者来…

如何在 VPS 上安装和使用 VirtualMin

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 关于 Virtualmin Virtualmin 是 Webmin 的一个模块,允许对(多个)虚拟专用服务器进行广泛的管理。您…

二进制部署k8s集群之master节点和etcd数据库集群(上)

目录 1.操作系统初始化配置 2.升级Linux内核 3.部署docker引擎 4.部署etcd集群 4.1 了解etcdctl工具对etcd做增删改查 4.2 通过etcdctl工具实现数据库的备份和恢复 5.部署Master组件 6.部署 Worker Node 组件 二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a…

230.信号量

信号量是一种用于多线程同步的机制,可以控制对共享资源的访问。信号量的基本概念是使用计数器来控制多个线程对共享资源的访问。信号量可以分为两类:计数信号量(Counting Semaphore)和二进制信号量(Binary Semaphore&a…

项目风险管理:从理论到实践的探索

项目风险管理:从理论到实践的探索 前言一、项目风险识别二、项目风险应对策略三、综合应对策略结语 前言 在当今快速变化的商业环境中,项目管理已成为组织实现目标的关键工具。然而,项目的成功往往伴随着各种不确定性和潜在风险。有效的风险管…