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、 什么是可迭代对象? 表示可以逐一迭代或者遍历的对象,序列:列表、元组、集合、字符串。非序列:字典、文件。自定义对象:实现了__iter__()方法的对象;实现了使用整数索引的 getitem()方…...
mac虚拟机安装homebrew时的问题
安装了mac虚拟机,结果在需要通过“brew install svn”安装svn时,才注意到没有下载安装homebrew。 于是便想着先安装homebrew,网上查的教程大多是通过类似以下命令 “ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)” 但是都会出现…...
学信息系统项目管理师第4版系列32_信息技术发展
1. 大型信息系统 1.1. 大型信息系统是指以信息技术和通信技术为支撑,规模庞大,分布广阔,采用多级 网络结构,跨越多个安全域;处理海量的,复杂且形式多样的数据,提供多种类型应用 的大系统 1.1.…...
Vue3 + Nodejs 实战 ,文件上传项目--大文件分片上传+断点续传
目录 1.大文件上传的场景 2.前端实现 2.1 对文件进行分片 2.2 生成hash值(唯一标识) 2.3 发送上传文件请求 3.后端实现 3.1 接收分片数据临时存储 3.2 合并分片 4.完成段点续传 4.1修改后端 4.2 修改前端 5.测试 博客主页:専心_前端…...
宏(预编译)详解
目录 一、程序的编译环境 二、运行环境 三、预编译详解 3.1预定义符号 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 3.2.3#define替换规则 3.2.4 #和## 2)##的作用: 3.2.5宏和函数的对比 3.2.6宏的命名约定和#undef指令 一、命名约定: …...
hue实现对hiveserver2 的负载均衡
如果你使用的是CDH集群那就很是方便的 在Cloudera Manager中,进入HDFS Service 进入Instances标签页面,点击Add Role Instances按钮,如下图所示 点击Continue按钮,如下图所示 返回Instances页面,选择HttpFS角色…...
SkyWalking 告警规则配置说明
Skywalking告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings.yml 文件中。告警规则定义分为两部分: 1、告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件 2、webhook(网络钩子):定义当告警触发时,哪些服务终端需要被…...
HTML 表单笔记/练习
表单 概述 表单用于收集用户信息,用户填写表单提交到服务器 一般传参方式: GETPOSTCookie 传参要素 传参方式 GETPOST 参数的名字目标页面内容的数据类型(只有在上传文件的时候) 提示信息 一个表单中通常还包含一些说明性的文…...
关于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衣服穿搭推荐系统-计算机毕业设计
模块包括主界面,系统首页、个人中心、用户管理、风格标签管理、衣服分类管理、衣服穿搭管理、服装信息管理、我的搭配管理、用户反馈、系统管理等进行相应的操作。无论是日常生活,还是特定场景,诸如面试、约会等,人们都有展现自我…...
Java并发面试题:(七)ThreadLocal原理和内存泄漏
ThreadLocal是什么? ThreadLocal是线程本地存储机制,可以将数据缓存在线程内部。ThreadLocal存储的变量在线程内共享的,在线程间又是隔离的。 ThreadLocal实现原理? ThreadLocal的底层是ThreadLocalMap,每个Thread都…...
香港服务器在国内访问太慢怎么能提高?
一直以来,全球化业务需求的增长是跟随着蓬勃向上的互联网而发展的。有了网络,海外贸易就在鼠标的轻点中完成。而IDC市场中的香港服务器也因为免备案政策的特性,开始逐渐成为企业想要跨越地域壁垒而考虑的对象。但在使用过程中ÿ…...
使用Proxyman抓取Android的https请求
使用Proxyman抓取Android的https请求 有时,您可能需要测试您的移动应用程序并检查与其关联的所有网络请求。在网络上,此任务非常简单,只需按Ctrl Shift I打开开发人员工具即可。从那里,您可以导航到网络选项卡并检查与网页相关的…...
基础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配置命令: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 优势 与动态映射框架相比,MapStruct 具有以下优势: (1)通过使用普通方法getter、setter调用,而不是反射来快速执行,效率很高。 (2)编译时类型安全:只能映…...
【LeetCode】50. Pow(x, n)
1 问题 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即, x n x^n xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000 示例 2: 输入: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,教程配图200张,其中包括包括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、基本初…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
