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

Python 迭代器

迭代器协议

对象必须提供一个 next() 方法,执行该方法要么迭代下一项,要么就引起一个 StopIteration异常以终止迭代(只能往后不能往前)—— 迭代器协议

协议是一种约定,可迭代对象实现了迭代器协议(for、sum、min、max 等使用迭代器协议访问对象)

可迭代对象(iterable)

实现了迭代器协议的对象,就是可迭代对象。如何实现迭代器协议:对象内部定义 __iter__() 方法。

可作用于 for 循环的对象统称为可迭代对象,能作用于 for 循环的数据类型有以下几种:

  • 集合数据类型:liststrtupledicttuple
  • 生成器 generator:包括生成器函数和带 yield 关键字的生成器对象

可以用 isinstance() 判断一个对象是否是可迭代对象:

from collections import Iterableisinstance([], Iterable)			# True
isinstance('123', Iterable)			# True
isinstance(123, Iterable)			#  False

可迭代对象是可迭代的(即能被 for 循环),但不是迭代器,因为 next() 函数无法调用它们:

next([1, 2, 3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-4a6488f07b8e> in <module>()
----> 1 next([1, 2, 3])TypeError: 'list' object is not an iterator		# list 对象不是一个迭代器

但是可以用 iter() 函数将其转换为迭代器:

l = [1, 2, 3]
ret = iter(l)		# 转换为迭代器
next(ret)			# 调用 next() 函数------------------------
1

迭代器(iterator)

可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator

迭代器对象从集合第一个元素开始访问,直到所有元素被访问完才算结束,只能往前不能往后。

使用isinstance()判断一个对象是否是Iterator对象:

from collections import Iterator
isinstance([], Iterator)        					# list 不是迭代器对象,False
isinstance(iter([1, 2, 3]), Iterator)   			# 用 iter() 将 list 转换为迭代器,True
isinstance((x for x in range(10)), Iterator)   		# 生成器是迭代器对象

迭代器惰性机制

迭代器表示的是一个数据流,可以调用 next() 函数不断返回下一个数据,直至没有数据抛出 StopIteration。可以说它是一个有序序列,但我们不知道序列长度,只能通过 next() 函数实现按需计算下一个数据,所有它是惰性的,只有在需要时才计算返回下一个数据。


为什么要有迭代器

对于有序序列类型,使用索引以及 while 循环也难遍历所有元素,但是对于无序序列类型(字典、集合)就会束手无策。


for 循环机制

for 循环是基于迭代器协议提供了一个统一的可遍历所有对象的方法,调用对象的 __iter__() 方法将其转换为一个迭代器,再调用 __next__() 不断取出序列中元素。相比较迭代器而已,for 循环还完成了 StopIteration 的异常工作。

这样一来,只要是序列,都可以通过 for 循环遍历,不管是有序还是无序序列类型。


优缺点

优点:

  • 提供一种不依赖于索引的迭代方式
  • 惰性计算,节省内存(每次取值,才会加载)

缺点:

  • 无法获取长度,next() 完毕才知道
  • 一次性,只能往前,不能往后

自定义类为迭代器

要想将自定义的类实现为一个迭代器,需要在类中实现 __iter__()__next__()方法:

  • __iter__() 方法:返回迭代器对象本身
  • __next__() 方法:返回容器中下一个元素,当超出边界时触发 StopIteration 异常终止迭代器
class Foo(object):def __init__(self,step):self.step = stepdef __next__(self):if self.step == 0:raise StopIterationself.step -= 1return self.stepdef __iter__(self):return self
f = Foo(6)
for i in f:print(i)
5
4
3
2
1
0

总结

  • 可以 for 循环的对象都是可迭代类型
  • 可以作用于 next() 函数的对象都是迭代器类型,它表示一个惰性计算的序列
  • listdictstr 等都是可迭代的,但不是迭代器类型,因为没有 next() 方法,可以用 iter() 函数将其转换为迭代器
  • Python 的 for 循环机制其实质是不断调用 next() 函数实现的,但是它超出边界不会触发 StopIteration
  • for 循环一次将所有数取出,迭代器一次只取一个

相关文章:

Python 迭代器

迭代器协议 对象必须提供一个 next() 方法&#xff0c;执行该方法要么迭代下一项&#xff0c;要么就引起一个 StopIteration异常以终止迭代&#xff08;只能往后不能往前&#xff09;—— 迭代器协议 协议是一种约定&#xff0c;可迭代对象实现了迭代器协议&#xff08;for、…...

Python语言零基础入门教程(二十七)

Python OS 文件/目录方法 Python语言零基础入门教程&#xff08;二十六&#xff09; 61、Python os.utime() 方法 概述 os.utime() 方法用于设置指定路径文件最后的修改和访问时间。 在Unix&#xff0c;Windows中有效。 语法 utime()方法语法格式如下&#xff1a; os.uti…...

Redis基础操作以及数据类型

目录 Redis基础操作 java中的i是不是原子操作&#xff1f;不是 数据类型 1. list 2. set 3. Hash哈希 4. Zset有序集合 Redis基础操作 set [key] [value] 设置值 &#xff08;设置相同的会将原先的覆盖&#xff09; get [key] 获取值 不能覆盖和替换 ttl [key] 以秒为单…...

自抗扰控制ADRC之反馈控制律(NLSEF)

目录 前言 1.非线性状态误差反馈控制律(NLSEF) 1.1 控制律形式 1.2 控制量的生成(或者说扰动的补偿) 1.2.1补偿形式① 1.2.1补偿形式② 2.仿真分析 2.1仿真模型 2.2仿真结果 前言 前面的两篇博客依次介绍了TD微分跟踪器安排过渡过程、扩张观测器&#xff1a; 自抗扰…...

“生成音乐“ 【循环神经网络】

前言 本文介绍循环神经网络的进阶案例&#xff0c;通过搭建和训练一个模型&#xff0c;来对钢琴的音符进行预测&#xff0c;通过重复调用模型来进而生成一段音乐&#xff1b; 使用到Maestro的钢琴MIDI文件 &#xff0c;每个文件由不同音符组成&#xff0c;音符用三个量来表示…...

能否手写vue3响应式原理-面试进阶

&#xff08;二&#xff09;响应式原理 利用ES6中Proxy作为拦截器&#xff0c;在get时收集依赖&#xff0c;在set时触发依赖&#xff0c;来实现响应式。 &#xff08;三&#xff09;手写实现 1、实现Reactive 基于原理&#xff0c;我们可以先写一下测试用例 //reactive.spe…...

前端工程师leetcode算法面试必备-简单的二叉树

一、前言 本难度的题目主要考察二叉树的基本概念和操作。 1、基本概念 树是计算机科学中经常用到的一种非线性数据结构&#xff0c;以分层的形式存储数据。二叉树是一种特殊的树结构&#xff0c;每个节点最多有两个子树&#xff0c;通常子树被称作“左子树”和“右子树”。 …...

【什么程度叫熟悉linux系统】

一、编译内核 1、Linux系统背景&#xff1a;Ubuntu 2、内核源码kernel.org进行下载 3、解压内核源文件linux-6.1.12.tar.xz、命令&#xff1a;tar -xvf linux-6.1.12.tar.xz 4、进入解压好的文件inux-6.1.12 5、配置内核命令&#xff1a;make menuconfig&#xff08;需要进…...

编译安装MySQL

MySQL 5.7主要特性 随机root 密码&#xff1a;MySQL 5.7 数据库初始化完成后&#xff0c;会自动生成一个 rootlocalhost 用户&#xff0c;root 用户的密码不为空&#xff0c;而是随机产生一个密码。原生支持&#xff1a;Systemd 更好的性能&#xff1a;对于多核CPU、固态硬盘、…...

Kubernetes一 Kubernetes之入门

二 Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应…...

SQLServer2000 断电后数据库suspect“置疑”处理

SQLServer2000 断电后数据库suspect“置疑”处理 背景介绍&#xff1a; 前些天加班时候&#xff0c;接到小舅子微信&#xff0c;说一个客户的winXP 机器上sql2000的数据库在断电重启后&#xff0c;数据库执行命令时提示suspect“置疑”错误。小舅子电子工程师&#xff0c;对数…...

多模态机器学习入门Tutorial on MultiModal Machine Learning——第一堂课个人学习内容

文章目录课程记录核心技术Core Technical Challengesrepresentation表示alignment对齐转换translationFusion融合co-learning共同学习总结Course Syllabus教学大纲个人总结第一周的安排相关连接课程记录 这部分是自己看视频&#xff0c;然后截屏&#xff0c;记录下来的这部分的…...

Java ~ Collection/Executor ~ LinkedBlockingDeque【总结】

一 概述 简介 LinkedBlockingDeque&#xff08;链接阻塞双端队列&#xff09;类&#xff08;下文简称链接阻塞双端队列&#xff09;是BlockingDeqeue&#xff08;阻塞双端队列&#xff09;接口的唯一实现类&#xff0c;采用链表的方式实现。链接阻塞双端队列与LinkedBlockingQu…...

.NET7的AOT的使用

背景其实&#xff0c;规划这篇文章有一段时间了&#xff0c;但是比较懒&#xff0c;所以一直拖着没写。最近时总更新太快了&#xff0c;太卷了&#xff0c;所以借着 .NET 7 正式版发布&#xff0c;熬夜写完这篇文章&#xff0c;希望能够追上时总的一点距离。本文主要介绍如何在…...

分布式缓存的问题

1,Redis缓存穿透问题 Redis缓存穿透问题是指查询一个一定不存在的数据&#xff0c;由于这样的数据缓存一定不命中&#xff0c;所以这样的请求一定会打到数据库上。但是由于数据库里面也没有这样数据&#xff0c;且也没有将这样的null值缓存到数据库&#xff0c;从而造成这样的…...

golang入门笔记——内存管理和编译器优化

静态分析 静态分析&#xff1a;不执行程序代码&#xff0c;推导程序的行为&#xff0c;分析程序的性质 控制流&#xff08;control flow&#xff09;&#xff1a;程序的执行流程 数据流&#xff08;data flow&#xff09;&#xff1a;数据在控制流上的传递 通过分析控制流和…...

GEE学习笔记 七十:【GEE之Python版教程四】Python基础编程二

通过上一章的讲解&#xff0c;我们对于python有了初步的了解&#xff0c;这一章就详细讲解一下python的各个变量以及运算规则等内容。 关于测试代码推荐初学者将每一段代码都自己敲入编辑器中在本地运行。 1、数值 这是任何编程中都会有的基本变量&#xff0c;在python支持的…...

股票投资新出发之知识体系构建导论

文章目录前言参考资料如何构建体系实践理论tips前言 自2021年股票开户&#xff0c;投资已有2年左右&#xff0c;但更多的是凭感觉式的拍脑袋投资&#xff0c;没有自己的投资体系&#xff0c;所以开此专栏从零开始构建知识体系&#xff0c;勉励自己不断学习。两年的投资经验让我…...

蓝桥杯算法训练合集 十六 1.首字母变大写2.盾神计科导作业3.Cinema4.接水问题

目录 1.首字母变大写 2.盾神计科导作业 3.Cinema 4.接水问题 1.首字母变大写 问题描述 对一个字符串中的所有单词&#xff0c;如果单词的首字母不是大写字母&#xff0c;则把单词的首字母变成大写字母。在字符串中&#xff0c;单词之间通过空白符分隔&#xff0c;空白符包括…...

密码的世界

网络世界中常见的攻击方法 窃听攻击 窃听攻击是网络世界最常见的一种攻击方式&#xff0c;一些不能泄露的隐私信息&#xff0c;例如银行卡密码&#xff0c;账号密码&#xff0c;如果被窃听泄露的话通常会带来比较严重的后果。 中间人攻击 在中间人攻击中&#xff0c;小明准…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...