Python3 迭代器和生成器

前言

本文主要介绍Python中的迭代器和生成器,主要内容包括 迭代器概述、生成器简介。

文章目录

  • 前言
  • 一、迭代器简介
  • 二、生成器简介

一、迭代器简介

在 Python 中,迭代器(iterator)是一个实现了迭代器协议(Iterator Protocol)的对象。该协议包含两个方法:iter() 和 next() 方法。iter() 方法返回迭代器对象本身,next() 方法返回迭代器中的下一个元素,在迭代结束时需要抛出StopIteration 异常,如:

my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)print(next(my_iterator)) 
print(next(my_iterator))
print(next(my_iterator)) 
print(next(my_iterator)) 
print(next(my_iterator)) # 再次调用 next() 方法将引发 StopIteration 异常
print(next(my_iterator))

输出结果:

1
2
3
4
5
Traceback (most recent call last):File "D:\pythonCode\hello.py", line 11, in <module>print(next(my_iterator))^^^^^^^^^^^^^^^^^
StopIteration

iter() 方法还接受一个可选的参数,用于指定当迭代器对象中没有剩余的元素时,返回的默认值。如果不指定该参数,则默认会引发 StopIteration 异常。例如:

my_list = [1, 2, 3]
my_iterator = iter(my_list)print(next(my_iterator, 0)) 
print(next(my_iterator, 0)) 
print(next(my_iterator, 0)) # 再次调用 next() 方法将返回指定的默认值 0
print(next(my_iterator, 0)) 

输出结果:

1
2
3
0

我们平时在使用 for 循环语句遍历可迭代对象时,好像并没有显性使用iter()方法,如:

my_list = [1, 2, 3]for item in my_list:print(item) # 输出 1, 2, 3

实际上在遍历所有对象时,python内部的实现依旧是会自动调用 iter() 函数来获取其对应的迭代器对象,然后再不断调用迭代器对象的 next() 方法来获取其中的元素,直到抛出 StopIteration 异常。这个流程如下图:
在这里插入图片描述
注意:迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。

二、生成器简介

在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器是一种特殊的迭代器,可以按需生成值而不是一次性生成所有值。这种特性使得生成器非常适合处理大量的数据,尤其是在处理一些无法完全载入内存的数据集的情况下,如使用 yield 实现斐波那契数列:

def fibonacci():a, b = 0, 1while True:yield aa, b = b, a + b#输出斐波那契数列的前 10 个数字
f = fibonacci()
for i in range(10):print(next(f))  # 输出结果 0 1 1 2 3 5 8 13 21 34

上面的代码中,fibonacci() 函数的执行被设置成一个无限循环,这个循环在每次yield 语句之后暂停,生成器对象返回当前的值,并且在下一个循环迭代中继续执行,而不是一次性输出所有的斐波那契数值。这种按需生成数值的方法可以大大减少内存使用,特别是当在生成的数值上花费了很多计算时间时。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交互设计专业解析:发展前景和薪资待遇

交互式设计专业是一门旨在帮助人们更好地与数字产品和服务互动的设计学科。交互式设计专业涉及人机交互、用户体验设计、用户界面设计等多个不同领域。交互式设计是当今数字时代不可缺少的一部分。它能为用户提供更好的体验和更高效的功能&#xff0c;为企业创造更高的价值和影…

智能家居ZigBee网关选型定制指南:主控,操作系统,天线设计,助力IoT开发者

随着科技的发展和人们生活水平的提高&#xff0c;智能家居以其便捷、舒适、安全等特点&#xff0c;逐渐走进千家万户&#xff0c;成为家装消费品换新升级的重要方向。在智能家居系统中&#xff0c;网关扮演着中枢控制器的角色&#xff0c;负责将各种设备连接到互联网上&#xf…

【已解决】typora打开就闪退

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

halcon 算子 get_grayval_interpolated BiCubic 插值验证

测试发现 halcon BiCubic基函数中的a-1.0

申请医疗设备注册变更时,需要补充考虑网络安全的情况有哪些?

在申请医疗器械设备注册变更时&#xff0c;需要补充网络安全的情况主要包括以下几点&#xff1a; 网络安全功能更新&#xff1a;如果医疗器械的自研软件发生网络安全功能更新&#xff0c;或者合并网络安全补丁更新的情形&#xff0c;需要单独提交一份自研软件网络安全功能更新…

Linux驱动开发笔记(六)中断子系统及实验

文章目录 前言一、中断子系统框架1. 中断硬件简单描述2. 中断的软件描述2.1 中断处理的两部分模型2.2 系统框架 二、GIC v3中断控制器1. GIC v3基本结构1.1 Distributor1.2 Redistributor1.3 ITS1.4 CPU interface 2. 中断类型与特点3. 中断号 三、函数编写3.1 相关API函数3.2 …

idea启动项目 OutOfMemoryError: 内存不足

解决方案&#xff1a;修改共享构建进程堆大小即可 如果小伙伴们有什么疑问&#xff0c;欢迎下面评论。欢迎指正。如还有什么不懂的加我 QQ&#xff1a;517861659 如果没有及时回复&#xff0c;可以点我先问问AI机器人​编辑https://chatgpt.byabstudio.com/login?code2023070…

Fortigate防火墙二层接口的几种实现方式

初始配置 FortiGate出厂配置默认地址为192.168.1.99&#xff08;MGMT接口&#xff09;&#xff0c;可以通过https的方式进行web管理&#xff08;默认用户名admin&#xff0c;密码为空&#xff09;&#xff0c;不同型号设备用于管理的接口略有不同。 console接口的配置 防火墙…

电脑在线怎么改图片格式?3步改图片格式的操作步骤

在日常生活和工作中经常会因为不同的用途&#xff0c;需要使用不同格式的图片&#xff0c;那么如果遇到图片格式问题时&#xff0c;有什么方法能够快速在线转图片格式呢&#xff1f; 想要快速将图片格式转换成自己需要使用的格式&#xff0c;比较简单的一种方法可以使用网上的…

3 - 大的国家(高频 SQL 50 题基础版)

3.大的国家 -- 查询属性&#xff1a;国家名称、人口和面积 select name,population,area fromWorld where area>3000000 OR population>25000000;

Redis实战篇——搭建主从复制

Redis实战篇——搭建主从复制 1.Redis主从1.1.主从集群结构1.2.搭建主从集群1.2.1.启动多个Redis实例1.2.2.建立集群1.2.3.测试 1.Redis主从 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离…

Python Flask 入门开发

Python基础学习&#xff1a; Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性 Flask基础学习&#xff1a; Python中如何选择Web开发框架&#xff1f;Pyth…

代码随想录 day27|day28|day29

回溯2 切割问题&#xff1a;是在每个节点判断是否是要剪枝收割元素。 startidx 是切割起点&#xff0c;i是本次切割终点 分割回文串 复原ip地址 非递减子序列 都是在树的节点依照题意判断&#xff0c;之后决定是否剪枝。 也就是都有if判断来剪枝 。 下面是非递减子序列。 下…

关于stm32的软件复位

使用软件复位的目的&#xff1a; 软件复位并不会擦除存储器中的数据&#xff0c;它只是将处理器恢复到复位状态&#xff0c;即中断使能位被清除&#xff0c;系统寄存器被重置&#xff0c;但RAM和Flash存储器中的数据保持不变。 STM32软件复位(基于库文件V3.5) &#xff0c;对…

IDC发布《中国WAAP厂商技术能力评估,2024》研究报告

从市场规模来看&#xff0c;未来WAAP将逐步替代WAF&#xff0c;成为Web应用安全市场主流产品&#xff0c;同时也将涵盖API安全等其它市场。 随着云原生和微服务架构的兴起&#xff0c;Web业务的部署和管理方式发生了巨大变化。以APP应用和小程序为代表的移动应用使用量骤增&am…

使用眼精星票证识别系统识别国外护照的操作指南

你知道吗&#xff1f;在这个全球化的大潮中&#xff0c;处理和管理各类国际证件简直是头疼得要命&#xff01; 想象一下&#xff0c;你面前堆满了来自世界各地的护照&#xff0c;每个护照上的信息都要手动录入&#xff0c;这得花多少时间啊&#xff01;不过&#xff0c;别急&am…

vscode 离线下载指定版本插件和安装方法

1、背景 由于不同的vscode版本需要安装对应的插件版本&#xff0c;一般情况下&#xff0c;vscode版本会落后于vscode插件库提供的可以下载的插件版本&#xff0c;网页一般只会提供最新的插件下载版本&#xff0c;因此我们需要下载指定的版本需要采取一些措施。 2、获取需要安…

2.1.4 采用配置类与注解方式使用MyBatis

实战概述&#xff1a;采用配置类与注解方式使用MyBatis 创建MyBatis配置类 在net.huawei.mybatis.config包中创建MyBatisConfig类&#xff0c;用于配置MyBatis核心组件&#xff0c;包括数据源、事务工厂和环境设置。 配置数据源和事务 使用PooledDataSource配置MySQL数据库连接…

生命在于学习——Python人工智能原理(3.2)

三、深度学习 &#xff08;二&#xff09;人工神经网络 人工神经网络是模仿人类大脑神经系统工作原理所创建的数学模型&#xff0c;有并行的分布处理能力、高容错性和自我学习等特征。 1、感知器 感知器由Frank Roseblatt于1957年提出&#xff0c;是一种广泛使用的线性分类…

K8s种的service配置

什么是service 官方的解释是:   k8s中最小的管理单元是pod&#xff1b;而service是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法;   Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种服务发现机制。 你可以在 Pod 集合中运行代码…