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

Python迭代器创建与使用:从入门到精通

一、可迭代对象

1、 什么是可迭代对象?

表示可以逐一迭代或者遍历的对象,序列:列表、元组、集合、字符串。非序列:字典、文件。自定义对象:实现了__iter__()方法的对象;实现了使用整数索引的 getitem()方法的对象,这些都是可迭代对象。
iter() 用于定义该类的实例是可迭代对象,并且应该返回一个迭代器。当自定义类需要支持迭代时,就需要在类中定义 iter() 方法。
getitem()用于实现通过 obj[key] 来访问对象的方法,并且支持整数索引和切片。

2、 怎么判断对象是不是可迭代对象?

通常情况下可以 isinstance(mobject, Iterable)判断实现了 iter()方法的可迭代对象,但是实现了__getitem__()方法的可迭代对象,不能使用isinstance 判断。这种的怎么判断呢?
官方文档描述:
https://docs.python.org/zh-cn/3.7/library/collections.abc.html#collections.abc.Iterable

from collections.abc import Iterableclass myiter:passmi = myiter()
res = isinstance(mi, Iterable)  # False 不是可迭代对象
print(res)class myiterable:data = [0, 1, 2, 3]def __iter__(self):return self.datami = myiterable()
res = isinstance(mi, Iterable)  # True 是可迭代对象
print(res)class mysequence:data = [0, 1, 2, 3]def __getitem__(self, index):# 使用整数进行索引return self.data[index]ms = mysequence()print(ms[3])  # 调用__getitem__方法,并且传递整数参数3res = isinstance(ms, Iterable)  # False 是可迭代对象 但是不能这样判断
print(res)
res = iter(ms)  # 不报错,就说明是可迭代对象, iter()接受一个可迭代对象
print(res)

3、 扩展知识

  • **iter()**函数是 Python 的内置函数,接受一个可迭代的对象作为参数,然后返回该可迭代对象的迭代器。
  • 可迭代对象被可用于 for 循环,循环期间 for 语句会调用 iter()函数将可迭代对象转换成迭代器(只执行一次,将结果保存在临时变量中),然后进行遍历。官方文档描述:https://docs.python.org/zh-cn/3.7/reference/compound_stmts.html#for
  • 工程中的可迭代对象
# 工程中的可迭代对象
# requests/models/Response 就是一个可迭代对象
# requests 的响应都是通过Response封装的class Response(object):def __iter__(self):"""Allows you to use a response as an iterator."""return self.iter_content(128)import requestsresponse = requests.get('https://www.baidu.com')
res = isinstance(response, Iterable)
print(res) # True
  • 可以将可迭代对象当参数的函数
# 将可迭代对象当参数的函数
data = [1, 2, 3, 4, '3']
iter(data)
map(int, data)
filter(lambda x: x > 0, data)
all(data)
any(data)
list(data)
tuple(data)
max(data)
min(data)

二、迭代器

1、迭代器协议

如果要实现一个迭代器,则必须遵循迭代器协议,即要支持两个方法:
iterator.iter() 返回迭代器本身
iterator.next() 要么返回迭代的下一项,要么触发StopIteration异常

2、什么是迭代器?

迭代器是一个可以记住遍历位置的对象,从第一个元素开始访问,直到所有元素访问结束。
迭代器即实现了__next__()方法,又实现__iter__()方法。

3、如何判断一个对象是不是迭代器?

使用 isinstance(mobject, Iterator)来判断

from collections.abc import Iteratorclass myiterator:passmi = myiterator()
res = isinstance(mi, Iterator)  # False 不是迭代器
print(res)class myiterator:data = [0, 1, 2, 3]def __iter__(self):return iter(self.data)mi = myiterator()
res = isinstance(mi, Iterator)  # False 不是迭代器
print(res)class myiterator:data = [0, 1, 2, 3]index = 0def __iter__(self):# 该方法 必须返回一个迭代器# self本身实现了__iter__和__next__ 就是一个迭代器return selfdef __next__(self):if self.index < len(self.data):next_item = self.data[self.index]self.index += 1return next_itemelse:raise StopIterationmi = myiterator()
res = isinstance(mi, Iterator)  # True 是迭代器
print(res)iter(mi)res = next(mi)  # 获取迭代器下一个元素
print(res)

4、 扩展知识

  • **next()**函数是 Python 的内置函数,接受一个迭代器作为参数,用于从可迭代对象或迭代器中获取下一个元素,如果没有更多的元素可供迭代,next() 函数会引发 StopIteration 异常,或者可以指定一个默认值作为参数,以在迭代结束时返回。
  • **next() **是迭代器对象的特殊方法,用于定义迭代器的行为。负责返回该迭代器对象的下一个元素。如果没有更多的元素可供迭代,它应该引发 StopIteration 异常。
  • next(x)会调用x.next()方法。
  • 工程中的迭代器
import ioobj = io.StringIO('hello world!')
res = isinstance(obj, Iterator)
print(res)
  • 哪些函数会返回迭代器
data = [1, 2, 3, 4]
row = [5, 6, 7, 8]
# 哪些函数返回迭代器print(isinstance(iter(data), Iterator))
print(isinstance(map(int, data), Iterator))
print(isinstance(filter(lambda x: x > 2, data), Iterator))
print(isinstance(zip(row, data), Iterator))
print(isinstance(enumerate(data), Iterator))def iter_with_yield(x):yield xx -= 1print(isinstance(iter_with_yield(4), Iterator))

5、可迭代对象与迭代器的区别

可迭代对象,比如列表每次遍历都是从头开始,迭代器遍历后,会指向下一个位置,可迭代对象可以通过iter()函数包装成迭代器。

from collections import Iterable, Iterator
x = [1, 2, 3]
y = iter(x) # iter将列表x转换成生成器
hasattr(x, '__next__') # False 可迭代对象无__next__()方法
hasattr(y, '__next__') # True 迭代器有__next__()方法,可以使用next函数进行迭代
next(x) # 调用时会报错 TypeError: 'list' object is not an iterator
next(y) # 迭代器可以使用next进行迭代,获取下一个
isinstance(x, Iterable) # True 判断是否可迭代对象
isinstance(x, Iterator) # False 判断是否迭代器
isinstance(y, Iterable) # True 判断是否可迭代对象
isinstance(y, Iterator) # True 判断是否迭代器

相关文章:

Python迭代器创建与使用:从入门到精通

一、可迭代对象 1、 什么是可迭代对象&#xff1f; 表示可以逐一迭代或者遍历的对象&#xff0c;序列&#xff1a;列表、元组、集合、字符串。非序列&#xff1a;字典、文件。自定义对象&#xff1a;实现了__iter__()方法的对象&#xff1b;实现了使用整数索引的 getitem()方…...

mac虚拟机安装homebrew时的问题

安装了mac虚拟机&#xff0c;结果在需要通过“brew install svn”安装svn时&#xff0c;才注意到没有下载安装homebrew。 于是便想着先安装homebrew&#xff0c;网上查的教程大多是通过类似以下命令 “ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)” 但是都会出现…...

学信息系统项目管理师第4版系列32_信息技术发展

1. 大型信息系统 1.1. 大型信息系统是指以信息技术和通信技术为支撑&#xff0c;规模庞大&#xff0c;分布广阔&#xff0c;采用多级 网络结构&#xff0c;跨越多个安全域&#xff1b;处理海量的&#xff0c;复杂且形式多样的数据&#xff0c;提供多种类型应用 的大系统 1.1.…...

Vue3 + Nodejs 实战 ,文件上传项目--大文件分片上传+断点续传

目录 1.大文件上传的场景 2.前端实现 2.1 对文件进行分片 2.2 生成hash值&#xff08;唯一标识&#xff09; 2.3 发送上传文件请求 3.后端实现 3.1 接收分片数据临时存储 3.2 合并分片 4.完成段点续传 4.1修改后端 4.2 修改前端 5.测试 博客主页&#xff1a;専心_前端…...

宏(预编译)详解

目录 一、程序的编译环境 二、运行环境 三、预编译详解 3.1预定义符号 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 3.2.3#define替换规则 3.2.4 #和## 2)##的作用&#xff1a; 3.2.5宏和函数的对比 3.2.6宏的命名约定和#undef指令 一、命名约定&#xff1a; …...

hue实现对hiveserver2 的负载均衡

如果你使用的是CDH集群那就很是方便的 在Cloudera Manager中&#xff0c;进入HDFS Service 进入Instances标签页面&#xff0c;点击Add Role Instances按钮&#xff0c;如下图所示 点击Continue按钮&#xff0c;如下图所示 返回Instances页面&#xff0c;选择HttpFS角色…...

SkyWalking 告警规则配置说明

Skywalking告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml 文件中。告警规则定义分为两部分: 1、告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件 2、webhook(网络钩子):定义当告警触发时,哪些服务终端需要被…...

HTML 表单笔记/练习

表单 概述 表单用于收集用户信息&#xff0c;用户填写表单提交到服务器 一般传参方式&#xff1a; GETPOSTCookie 传参要素 传参方式 GETPOST 参数的名字目标页面内容的数据类型&#xff08;只有在上传文件的时候&#xff09; 提示信息 一个表单中通常还包含一些说明性的文…...

关于Java Integer和Long使用equals直接比较

Integer和Long不能直接equals比较会返回False Long.class源码 public boolean equals(Object obj) {if (obj instanceof Long) {return this.value (Long)obj;} else {return false;} }Integer.class源码 public boolean equals(Object obj) {if (obj instanceof Integer) {…...

nodejs+vue衣服穿搭推荐系统-计算机毕业设计

模块包括主界面&#xff0c;系统首页、个人中心、用户管理、风格标签管理、衣服分类管理、衣服穿搭管理、服装信息管理、我的搭配管理、用户反馈、系统管理等进行相应的操作。无论是日常生活&#xff0c;还是特定场景&#xff0c;诸如面试、约会等&#xff0c;人们都有展现自我…...

Java并发面试题:(七)ThreadLocal原理和内存泄漏

ThreadLocal是什么&#xff1f; ThreadLocal是线程本地存储机制&#xff0c;可以将数据缓存在线程内部。ThreadLocal存储的变量在线程内共享的&#xff0c;在线程间又是隔离的。 ThreadLocal实现原理&#xff1f; ThreadLocal的底层是ThreadLocalMap&#xff0c;每个Thread都…...

香港服务器在国内访问太慢怎么能提高?

​  一直以来&#xff0c;全球化业务需求的增长是跟随着蓬勃向上的互联网而发展的。有了网络&#xff0c;海外贸易就在鼠标的轻点中完成。而IDC市场中的香港服务器也因为免备案政策的特性&#xff0c;开始逐渐成为企业想要跨越地域壁垒而考虑的对象。但在使用过程中&#xff…...

使用Proxyman抓取Android的https请求

使用Proxyman抓取Android的https请求 有时&#xff0c;您可能需要测试您的移动应用程序并检查与其关联的所有网络请求。在网络上&#xff0c;此任务非常简单&#xff0c;只需按Ctrl Shift I打开开发人员工具即可。从那里&#xff0c;您可以导航到网络选项卡并检查与网页相关的…...

基础MySQL的语法练习

基础MySQL的语法练习 create table DEPT(DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) );alter table DEPTadd constraint PK_DEPT primary key (DEPTNO);create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR …...

RAID和LVM配置指南:创建、扩容和管理RAID设备和逻辑卷的方法

文章目录 1. 简介1.1 什么是RAID和LVM1.2 RAID和LVM的作用和优势 2. RAID配置命令&#xff1a;mdadm2.1 安装mdadm2.2 创建RAID设备2.2.1 RAID 02.2.2 RAID 12.2.3 RAID 52.2.4 RAID 10 2.3 添加磁盘到RAID设备2.4 删除磁盘从RAID设备2.5 查看和管理RAID设备2.6 故障处理与恢复…...

MapStruct使用方法

一、用途 1.1 优势 与动态映射框架相比&#xff0c;MapStruct 具有以下优势&#xff1a; &#xff08;1&#xff09;通过使用普通方法getter、setter调用&#xff0c;而不是反射来快速执行&#xff0c;效率很高。 &#xff08;2&#xff09;编译时类型安全&#xff1a;只能映…...

【LeetCode】50. Pow(x, n)

1 问题 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c; x n x^n xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&a…...

vue2技能树(2)-模板语法、vue的工具链、渐进式框架

目录 Vue2技能树Vue 2 简单的模板语法详解插值绑定属性指令v-if 和 v-elsev-forv-on 计算属性过滤器插槽 Vue 2 生态系统详解1. Vue Router2. Vuex3. Vue CLI4. Axios5. Vue Devtools6. Element UI、Vuetify、Quasar等UI框架7. Nuxt.js8. Vue Apollo、Vue Router、Vue Fire等插…...

【Git系列教程-目录大纲】

《Git系列教程-目录大纲》 完完全全从零开始深入学习Git&#xff0c;教程配图200张&#xff0c;其中包括包括Git基本命令、命令原理、Git底层命令、分支、分支的原理、Git代码冲突原理/解决、tag标签、Git存储状态、分支合并原理、典型合并、快进合并、同轴开发、非同轴开发、…...

【高等数学】导数与微分

文章目录 1、导数的概念1.1、引例1.1.1、变速直线运动瞬时速度1.1.2、曲线的切线 1.2、导数的定义1.3、证明常用导数1.4、导数的几何意义1.5、可导与连续的关系 2、函数的求导法则2.1、函数的和、差、积、商的求导法则2.2、反函数的求导法则2.3、复合函数的求导法则2.4、基本初…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...