16_Python的迭代器

在这里插入图片描述
在Python中,迭代是一个非常重要的概念。迭代通常指的是按照某种顺序逐个访问容器中的元素的行为。如使用for循环遍历取值的过程。

可迭代对象(Iterable)

可迭代对象是任何可以返回一个迭代器的对象。简单来说,它是可以逐一返回其成员项的对象。大多数内置集合类型,如list、set、dict、tuple和str都是可迭代的。即可以使用for循环遍历取值的对象。如:字符串、列表、元组、集合、字典。

  • 可迭代对象一般都具有一个 __iter__ 方法,用于创建迭代器

可迭代对象的特点:

  • 可以使用iter()函数从可迭代对象中得到一个迭代器。
  • 可以在for循环中使用,因为for循环背后使用了迭代器。
# 对列表进行for循环遍历
my_list = [1, 2, 3]
for item in my_list:print(item)
# 对元组进行for循环遍历
t = (1, 2, 3)
for item in t:print(item)
# 对集合进行for循环遍历
st = (1, 2, 3, 4)
for item in st:print(item)
# 对字典进行遍历
my_dict = {'name':'Jim', 'age':12}
for i in my_dict:print(i)

迭代器(Iterator)

迭代器是实现了 __iter__()__next__() 方法的对象。 __iter__() 方法返回迭代器本身,而 __next__() 方法返回序列中的下一个项目。

迭代器是特殊的可迭代对象,

  • __next__ :访问迭代器中的元素
    • 从迭代提中的第一个元素开始访问,一只访问到最后一个元素。如果继续进行访问会报StopIteration异常。访问之后会将元素丢弃,不会存在内存中。

迭代器的特点:

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 使用next()函数可以手动获取下一个元素,当没有更多元素时,会抛出一个StopIteration异常。
class MyIterator:def __init__(self, items):self.items = itemsself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.items):raise StopIterationcurrent_item = self.items[self.index]self.index += 1return current_item# 使用迭代器
my_iterator = MyIterator([1, 2, 3])
for item in my_iterator:print(item)
it1 = my_list.__iter__()
it1
it1.__next__()
it1.__next__()
it1.__next__()
# 访问最后一个元素后,再访问会报错:StopIteration。
it1.__next__()

迭代对象和迭代器的总结

  • 所有迭代器都是可迭代的,但不是所有可迭代的都是迭代器。
  • 可迭代对象提供一个迭代器,而迭代器可以用来迭代其中的元素。

在Python编程中,理解这两个概念对于编写高效的循环和操作集合类型至关重要。

# 使用for循环访问迭代器
class MyIterator:def __init__(self, items):self.items = itemsself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.items):raise StopIterationcurrent_item = self.items[self.index]self.index += 1return current_item# 创建一个迭代器实例
my_iterator = MyIterator([1, 2, 3, 4, 5])# 使用for循环来访问迭代器
for item in my_iterator:print(item)
# 使用while循环
my_iterator = MyIterator([1, 2, 3, 4, 5, 6])
it = iter(my_iterator)
while True:try:print(next(it))except StopIteration:break

迭代器的优点

  • 内存效率:迭代器按需计算值,这意味着它们不需要在内存中存储整个数据集。
  • 惰性计算:迭代器只在需要时计算下一个值,这对于大数据集或无限数据流来说非常有用。
  • 提供一个统一的接口:迭代器提供了一个通用的接口来遍历数据结构,而不需要关心底层数据结构的细节。

以下是一个使用迭代器的实例,其中我们创建了一个生成斐波那契数列的迭代器。斐波那契数列是一个无限序列,使用迭代器可以有效地生成它,而不需要预先计算整个序列。

class FibonacciIterator:def __init__(self):# 初始化前两个斐波那契数self.first = 0self.second = 1def __iter__(self):# 返回迭代器本身return selfdef __next__(self):# 计算下一个斐波那契数next_value = self.first + self.second# 更新前两个数self.first, self.second = self.second, next_value# 返回下一个斐波那契数return self.first# 创建斐波那契数列迭代器
fib_iterator = FibonacciIterator()# 使用for循环打印前10个斐波那契数
for i, value in enumerate(fib_iterator):if i >= 10:  # 打印前10个数后停止breakprint(value)

附件

本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89779395

如有问题请留言。

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

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

相关文章

机器学习模型中特征贡献度分析:预测贡献与错误贡献

在机器学习领域,特征重要性分析是一种广泛应用的模型解释工具。但是特征重要性并不等同于特征质量。本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。 核心概念 预测贡献度:衡量特征在…

【C++】—— stack queue deque

【C】—— stack & queue & deque 1 stack 与 queue 的函数接口2 适配器2.1 发现问题2.2 什么是适配器 3 stack 与 queue的模拟实现3.1 栈的基础框架3.2 栈的模拟实现3.3 队列的模拟实现 4 模板的按需实例化5 deque 的简单介绍5.1 vector 与list对比5.1.1 vector5.1.2 …

C++函数重载完成日期类相关计算

本文内容如下: 1.创建类以及函数的声明2.日期加减天数1.月份天数2.函数实现 3.日期比较大小4.日期减日期1.日期的前置和后置加加2.日期减日期的实现 5.内置类型的cout和cin本文代码如下: 要完成日期类的相关计算要创建自定义的类型,然后用函数…

获取IPV6地址的参考网站|nginx解析IPV6|linux服务器获取IPV6的方法

获取IPV6地址的参考网站 网址1 https://v6.ident.me/ 网址2 https://ifconfig.co/ 网址3 https://ifconfig.me/ IPV6检测站点推荐 网址1 http://ipv6-test.ch/ linux服务器获取IPV6的方法 以centos7为例 curl -6 ifconfig.mecurl -6 https://v6.ident.mecurl -6 https:…

python安装-升级

这里写自定义目录标题 欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 运行python 或pycharm时报错 [notice] A new release of pip is available: 23.1.2 -> 24.2 [notice] To update, run: python.exe -m pip install --upgrade pipCMD 进入 DOS C:\Users\wang>pyt…

解密MQ消息积压:让你系统瞬间卡死的幕后黑手

文章目录 什么是MQ消息积压?消息积压的常见原因案例分析:如何处理消息积压?场景1:消费者处理速度过慢场景2:消息生产速度过快 如何预防消息积压?1. **监控与告警**2. **动态扩容**3. **限流与降级**4. **合…

插入与冒泡排序(C++)

\一、插入排序 1 简介 插入排序,也称为直接插入排序,其排序思想和我们平时打扑克牌时排序类似。 2 算法步骤 将第一个元素看作已排序序列,第二个到最后一个看作未排序序列。 第二个元素,与之前已排序号的序列进行对比&#x…

面试题---链表分割(安全性问题)

题目: 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 假设有一链表: 给定x6 MySingleList …

乐(智)尚代驾-------Day3(afternoon关于aop特殊一栏)~

谢谢你们的阅读uu们!~~ 下午这部分内容是aop往后啦,大家要明确一个思路,用aop进行简化操作更加方便 紧接上部分~ 登录校验 如何判断是否登录状态? – 判断请求头里面是否包含token字符串 – 根据token查询redis 如何实现&…

多源最短路径

文章目录 1. 01 矩阵(542)2. 飞地的数量(1020)3. 地图分析(1162)4. 地图中的最高点(1765) 1. 01 矩阵(542) 题目描述: 算法原理: 这…

骨传导耳机怎么选?健身教练测评五大畅销爆款骨传导耳机!

随着健康生活方式的普及,越来越多的人开始注重日常锻炼与健康管理。而在这股健身热潮中,骨传导耳机因其独特的佩戴方式和开放耳道的设计,成为了运动爱好者的新宠。它们不仅能够在运动时提供安全舒适的听觉体验,还能让使用者随时留…

Java入门:09.Java中三大特性(封装、继承、多态)03

5 多态 首先,什么是多态呢? 多态即事物的多种表现形态。 就像生活中,人就有多种表现形态:学生,老师,警察,医生等。 那么在Java中也有类似的概念 它的作用就是:在封装时&#xf…

【Deloitte】AI大模型时代C端应用生态变局

类比PC时代到移动互联网时代的发展,可以窥见AI时代的来临将带来诸多颠覆与创新,这让所有关注AI发展的人们既心生期待又满怀敬畏。 德勤中国《AI大模型时代C端应用生态变局》报告深入探讨了AI对C端应用影响的四大发展趋势。 趋势一:AI 大模型…

【zookeeper安装】zookeeper安装详细教程(单机/集群部署)(linux版)

文章目录 前言一、zookeeper简介二、获取Zookeeper安装包2.1. 离线获取2.2. 在线获取2.3. 解压包 三、单机部署3.1. 配置conf文件3.2. 启动服务 四、集群部署4.1. 概念4.2. 配置conf文件4.3. 创建myid文件4.3. 启动每个节点的zookeeper服务 五、配置systemctl管理(选…

修改 Visual Studio 的主题颜色、背景颜色、字体

本人使用的是 VS2019 版本的。 点击上方工具栏中的【工具】-> 【选项】。 在 【环境】->【常规】中,可以更改整个界面的主题颜色。 浅色和深色的主题如下: 在【环境】->【字体和颜色】中,可以更改代码区的背景色。 不同背景示例&…

RK3568笔记六十:V4L2命令测试

若该文为原创文章,转载请注明原文出处。 测试V4L2是想移植韦老师的相机程序,但他使用的是V4L2方式采集摄像头。 而正点原子的rknn使用的是opencv。 这里记录测试过程 一、常用调试命令 1、抓取图像 使用 v4l2-ctl 抓取一帧图像:v4l2-ctl -d /dev/video0 --set-fmt-video…

计算机图形学 中心画圆算法 原理及matlab代码实现

中心画圆算法原理 总体思路: 将圆划分为八部分,先通过diF(xi1,yi-0.5)和隐函数Fx2y2-R2绘制八分之一的圆,然后通过圆的对称性确定另外七个部分的相应坐标绘制完整的圆。 求中点误差项递推公式: 从(x0,y0r)开始,因绘…

嵌入式流媒体SRT协议:send buffer和窗口延迟机制

Handshake Packets: 握手控制包(“包类型”位 1)用于在点对点的 SRT 会话中建立两个对等体之间的连接。早期版本的 SRT 依赖于握手扩展来在连接建立后立即交换某些参数,但自 1.3 版本起,集成机制确保所有参数作为握手…

Python使用YOLOv5图像识别教程包成功-以识别桥墩缺陷详细步骤分享

前置环境资源下载 提示:要开外网才能下载的环境我都放在了网盘里,教程中用到的环境可从这里一并下载: https://pan.quark.cn/s/f0c36aa1ef60 1. 下载YOLOv5源码 官方地址:GitHub - ultralytics/yolov5: YOLOv5 🚀 …

9。maven必备小技巧

(1)配置Maven加速时,除了settings之外,还可如下图所示,配置如下: 若想实现Maven加速,最重要的即User settings file。(先修改settings.xml) (2)当…