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, 1
    while True:
        yield a
        a, 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 语句之后暂停,生成器对象返回当前的值,并且在下一个循环迭代中继续执行,而不是一次性输出所有的斐波那契数值。这种按需生成数值的方法可以大大减少内存使用,特别是当在生成的数值上花费了很多计算时间时。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记 | 软件工程03:软件过程和软件开发方法

软件过程 1 何为软件过程模型 1.1 软件开发的特点 1.2 软件过程 1.3 软件过程模型 1.3.1 软件过程模型产生的背景 软件工程产生之前的软件开发——作坊式的个人创作&#xff1a;聚焦于编写代码&#xff1b;依靠个体技能&#xff0c;缺乏合作&#xff1b;关注时空利用&#x…

LabVIEW的大气环境实时监测

LabVIEW的大气环境实时监测 设计并实现了一个基于LabVIEW的大气环境实时监测系统。通过使用高精度环境传感器采集温度、湿度、PM2.5、CO2等环境数据&#xff0c;利用LabVIEW进行数据处理、显示和存储。该系统能够实时监控环境参数&#xff0c;并通过阈值报警功能提示异常&…

3年前端期望18K,云账户社招一面

一二面会有手写代码测试&#xff0c;一面或者二面当中&#xff0c;有一面必须到现场来的&#xff0c;对工作环境有一个直观的感受&#xff0c;前端二面取消了 一面&#xff08;通过&#xff09; 1、自我介绍、项目经历 2、怎么跟 xx模板的开发同学去沟通的呢&#xff1f;此处…

【优选算法】BFS解决边权为1的最短路径问题 {单源最短路径;多源最短路径}

一、经验总结 最短路径算法是一种用于找到图或网络中两个节点之间最短路径的算法。它被广泛应用于网络路由、GPS导航、交通规划和其他领域。 单源最短路径 用BFS解决边权为1的单源最短路径问题&#xff1a; 利用队列辅助完成BFS定义visited数组或是哈希表标记已访问&#xf…

用 Axios 封装一个双 token 无感刷新

为什么要用双Token无感刷新&#xff0c;它解决了什么问题&#xff1f; 为了保证安全性&#xff0c;后端设置的Token不可能长期有效&#xff0c;过了一段时间Token就会失效。而发送网络请求的过程又是需要携带Token的&#xff0c;一旦Token失效&#xff0c;用户就要重新登陆&…

JMH307【亲测】 怀旧端游【WD】1.73单机版带GM后台视频安装教程虚拟机端

资源介绍&#xff1a; 是否需要虚拟机&#xff1a;是 文件大小&#xff1a;压缩包约8G 支持系统&#xff1a;win7、win10、win11 硬件需求&#xff1a;运行内8G 4核及以上CPU 资源截图&#xff1a; 下载地址

微软不再允许Windows 11通过1@1.com绕过登录 但还有其他办法可以继续用

微软不再允许 Windows 11 通过 11.com 和 nothankyou.com 绕过登录&#xff0c;但断网的情况下使用 OOBE\BYPASSNRO 命令仍然是有效的。如果你在安装或重置系统时仍然需要创建本地账户&#xff0c;请直接使用 OOBE 命令。 在 Windows 11 家庭版和专业版中用户必须保持设备联网…

基于小波域优化Savitzky–Golay滤波器的脑电图信号的运动伪影去除方法(MATLAB R2018A)

在获取或采集数据的过程中&#xff0c;不可避免地将噪声引入到数据中&#xff0c;噪声的存在使得原始数据发生变异&#xff0c;对数据的处理及分析产生严重地影响。常用的去噪模型有平滑去噪、均值去噪。其中&#xff0c;平滑去噪又包括移动平均平滑法和Savitzky-Golay卷积平滑…

如何在npm上发布自己的包

如何在npm上发布自己的包 npm创建自己的包 一、一个简单的创建 1、创建npm账号 官网&#xff1a;https://www.npmjs.com/创建账号入口&#xff1a;https://www.npmjs.com/signup 注意&#xff1a;需要进入邮箱验证 2、创建目录及初始化 $ mkdir ufrontend-test $ cd ufron…

演讲全文|林涛:MongoDB助力智能制造出海控本增效

5月29日-30日在上海世博中心举办的亚马逊云科技中国峰会圆满结束。本文整理了MongoDB北亚区方案与咨询总监林涛在白金讲堂的演讲全文&#xff0c;就《MongoDB助力智能制造出海控本增效》话题与大家共同探讨。 白金讲堂演讲视频 从全球经济竞争的角度看&#xff0c;中国制造业…

【Python】认识 Python

一、计算机基础概念 1、什么是计算机 很多老一辈的人&#xff0c;管下面这个叫做计算机。然而&#xff0c;它只是 “计算器”&#xff0c;和计算机是有很大区别的。 现在我们所说的计算机&#xff0c;不光能进行算术运算&#xff0c;还能进行逻辑判断、数据存储、网络通信等…

【Vue】路由介绍

一、引入 思考 单页面应用程序&#xff0c;之所以开发效率高&#xff0c;性能好&#xff0c;用户体验好 最大的原因就是&#xff1a;页面按需更新 比如当点击【发现音乐】和【关注】时&#xff0c;只是更新下面部分内容&#xff0c;对于头部是不更新的 要按需更新&#xff…

Nginx 功能简介及代理配置

一、Nginx功能简介 Nginx是一款开源的高性能HTTP和反向代理服务器&#xff0c;具有轻量级的设计、高并发能力、内存占用低以及配置简单等特点&#xff0c;并且支持热部署。以下是Nginx的主要功能&#xff1a; 静态内容服务&#xff1a;Nginx可以作为一个高性能的静态文件服务…

QML应用添加网络代理

在QML应用中我们可以通过QNetworkProxy和QNetworkAccessManager类给应用添加网络代理。QNetworkProxy是Qt网络模块中的一个类,用于配置网络请求的代理服务器。通过使用代理服务器,我们可以控制应用程序的网络流量,实现网络请求的转发、监视、和过滤等功能。代理服务器在很多…

【Python】 Python应用的最佳项目结构解析

基本原理 在Python开发中&#xff0c;一个清晰且结构化良好的项目布局对于项目的可维护性、可扩展性和团队协作至关重要。项目结构不仅影响代码的组织方式&#xff0c;还影响到开发流程和部署策略。一个优秀的项目结构应该能够方便地进行模块化开发&#xff0c;易于理解&#…

keil下载及安装(社区版本)

知不足而奋进 望远山而前行 目录 文章目录 前言 Keil有官方版本和社区版本&#xff0c;此文章为社区版本安装&#xff0c;仅供参考。 1.keil MDK 2.keil社区版介绍 3.keil下载 (1)打开进入登录界面 (2)点击下载,跳转到信息页面 (3)填写个人信息,点击提交 (4)点击下载…

巨详细Linux卸载Redis教程

巨详细Linux卸载Redis教程 1、检查系统残留redis数据2、卸载系统残留redis数据 1、检查系统残留redis数据 redis等数据相关中间件安装前一定要进行残留数据检查&#xff0c;排除后期存在的各种隐患。 #检查有没有残留客户端 whereis redis-cli #检查有没有残留服务 whereis r…

上位机图像处理和嵌入式模块部署(f407 mcu中的spi总线操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习mcu&#xff0c;一般都是模板和模块之间的接口&#xff0c;比如说串口、usb、eth这种。还有一种接口&#xff0c;更多的是芯片和芯片之…

【Python】 深入理解Pandas中的iloc和loc:数据选择的艺术

基本原理 在Python的Pandas库中&#xff0c;数据选择是数据分析和处理的基础。iloc和loc是两种常用的数据选择方法&#xff0c;它们都允许用户根据索引位置或标签来选择数据。然而&#xff0c;它们在行为和用途上存在一些关键的差异。 iloc iloc是基于整数索引的&#xff0c…

【Modelground】个人AI产品MVP迭代平台(3)——工程化架构设计

文章目录 背景monorepo多项目调试/打包公共静态资源服务公共模型拷贝入项目的public文件夹总结 背景 Modelground中的项目&#xff0c;基本都依赖Mediapipe模型&#xff0c;因此&#xff0c;有很强的需要对Mediapipe进行封装&#xff0c;其余项目都调用这个封装库。从架构上&a…