16_Python的迭代器

news2024/9/21 16:17:52

在这里插入图片描述
在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 = items
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        current_item = self.items[self.index]
        self.index += 1
        return 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 = items
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        current_item = self.items[self.index]
        self.index += 1
        return 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 = 0
        self.second = 1

    def __iter__(self):
        # 返回迭代器本身
        return self

    def __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个数后停止
        break
    print(value)

附件

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

如有问题请留言。

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

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

相关文章

华为云服务综合实验

一、实验需求 本次实验内容基于华为云平台模拟企业web集群的构建,其中涉及的知识点包括Linux系统知识、nginx服务的安装及配置应用、云数据库 RDS(Relational Database Service,简称RDS)、虚拟私有云vpc、安全组、SFS弹性文件服务器以及负载均衡等。要求学生通过本…

UDS诊断-面试题2

bilibili视频推荐: 车载测试面试题UDS诊断协议,你知道什么是UDS诊断?ECU是什么?刷写ECU_哔哩哔哩_bilibili 总结: 1.汽车诊断UDS含义: 一套统一的诊断服务命令。 2.具体操作流程: 使用电脑…

高通欲收购英特尔:半导体行业的地震?

据《华尔街日报》报道,高通(Qualcomm)已经与陷入困境的英特尔(Intel)接洽,讨论潜在的收购事宜。尽管双方已经就此事进行了交流,但交易的成功与否仍存在诸多不确定性,且若真达成协议&…

java -- 枚举和注解

枚举 枚举介绍 (1)枚举:(enumeration,简写 enum) (2)枚举是一组常量的集合 (3)枚举属于一种特殊的类,里面只包含一组有限的特定的对象 枚举的两…

Nginx静态资源优化、压缩、缓存处理

一、静态资源优化配置语法 Nginx对静态资源如何进行优化配置。这里从三个属性配置进行优化: sendfile on; tcp_nopush on; tcp_nodeplay on; (1)sendfile,用来开启高效的文件传输模式。 语法sendfile on |off;默认值sendfile …

YOLOv9改进,YOLOv9主干网络替换为RepViT (CVPR 2024,清华提出,独家首发),助力涨点

摘要 轻量级视觉变换器(ViTs)在资源受限的移动设备上表现出优越的性能和较低的延迟,相比之下轻量级卷积神经网络(CNNs)稍显逊色。研究人员发现了许多轻量级 ViTs 和轻量级 CNNs 之间的结构联系。然而,它们在块结构、宏观和微观设计上的显著架构差异尚未得到充分研究。在…

Linux 磁盘清理重新格式化挂载脚本及问题解决

Linux 磁盘清理重新格式化挂载脚本:diskformat.sh #!/bin/bash for i in {1…8} do umount /data0$i done PIDARRAY() for i in a b c d e f g h do parted -s /dev/sd i m k l a b e l g p t p a r t e d − s / d e v / s d i mklabel gpt parted -s /dev/sd im…

序列化方式二——JSON之fastjson

fastjson&fastjson2(版本:1.2.83_noneautotype) 扩展点 Fastjson通过其丰富的扩展点显著增强了用户定制序列化和反序列化行为的灵活性,完美契合了实际开发中的多样化需求。在SpringBoot与SpringCloud的集成环境中,开发者能够利用Seriali…

Linux top命令详解与重点内容说明

文章目录 重点说明基本信息进程(任务)信息cpu占用信息%Cpu(s)内存信息交换内存信息每列含义说明交互命令多窗口模式颜色配置命令参数 重点说明 top命令非常强大,也非常复杂,很难面面俱到,也没有必要,这篇文章的目的是介绍重点&am…

Apache Doris 实践

Apache Doris 实践 官方使用指南:https://doris.incubator.apache.org/zh-CN/docs/install/source-install/compilation-with-docker/ 手动安装 下载二进制安装包https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.1.5-bin-x64.tar.gz …

企业搭建VR虚拟展厅,如何选择搭建平台?

选择虚拟展厅搭建平台时,需要综合考虑多个因素以确保平台能够满足您的具体需求并提供高质量的展示效果。以下是一些关键的选择标准: 1. 技术实力与创新能力 技术平台选择:确保平台支持虚拟现实(VR)、增强现实&#xf…

http免费升级https教程

将HTTP免费升级至HTTPS的详细教程涉及获取SSL证书、配置服务器和测试HTTPS连接等关键步骤。 以下是具体介绍: 获取SSL证书:选择提供免费SSL证书的服务,如JoySSL。在证书提供商的网站上申请免费SSL证书注册时填写注册码230920,获取…

如何优化前端页面的 AJAX 请求性能并避免冲突

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

MBR60100PT-ASEMI适配变频器专用MBR60100PT

编辑:ll MBR60100PT-ASEMI适配变频器专用MBR60100PT 型号:MBR60100PT 品牌:ASEMI 封装:TO-247 安装方式:插件 批号:最新 最大平均正向电流(IF):60A 最大循环峰值…

Redis基础数据结构之 Sorted Set 有序集合 源码解读

目录标题 Sorted Set 是什么?Sorted Set 数据结构跳表(skiplist)跳表节点的结构定义跳表的定义跳表节点查询层数设置 Sorted Set 基本操作 Sorted Set 是什么? 有序集合(Sorted Set)是 Redis 中一种重要的数据类型,…

Wpf使用NLog将日志输出到LogViewer

1 LogViewer LogViewer是通过UDP传输的高性能实时log查看器。 具有一下特性: 通过UDP读取日志通过文件导入日志导出日志到一个文件中排序、过滤(日志树,日志等级)和查找突出显示搜索文本从UPD接收日志时忽略IP地址列表多接收器支…

灾备技术演进之路 | 虚拟化无代理备份只能挂载验证和容灾吗?只能无代理恢复吗?且看科力锐升级方案

灾备技术演进之路系列 虚拟化备份技术演进 摆脱束缚,加速前行 无代理备份仅能挂载/恢复验证吗? ——科力锐极简验证演练无代理备份来了 无代理备份无法应对平台级故障吗? ——科力锐应急接管无代理备份来了 无代理备份仅能同平台挂载吗&a…

Java笔试面试题AI答之单元测试JUnit(7)

文章目录 37. 请列举一些JUnit扩展 ?1. 参数化测试2. 条件测试执行3. 临时目录4. 时间测试5. 重复测试6. 前置/后置条件7. Mockito8. Spring Test9. JUnit Vintage10. Testcontainers11. 自定义注解和扩展12. 测试监听器(TestListener 和 RunListener&am…

python中ocr图片文字识别样例(二)

一、说明 本次解决图片相关出现中文乱码问题,属于上篇文章的优化,前提条件依赖上篇文章的包,当然ocr的具体应用场景很多,根据自身需求进行调整 二、具体实现 2.1 代码实现: # -*- coding: utf-8 -*- import easyoc…

CertiK因发现Apple Vision Pro眼动追踪技术漏洞,第6次获苹果认可

​2024年9月20日,头部Web3.0安全机构CertiK自豪地宣布,CertiK的工程师因发现Apple Vision Pro MR(混合现实)头显设备中的关键漏洞而获得Apple公司认可,这已经是Apple公司第六次公开发布对CertiK的致谢,Cert…