当前位置: 首页 > 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、基本初…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...