生成器与迭代器

news2025/1/17 8:48:22

生成器

生成器的概念

在python中,一边循环一边计算的机制叫做生成器,我们设想一个场景:如果我要列举一万个数字,我可以先创建一万的数存入列表中或者挖掘这一万个数之间的规律然后通过一边计算一边循环来一个一个得到这一万个数。

你可以类比游戏中的地图一般是不会一下全部载入的,而是随着人物移动而分步加载的,加载新的区域,删除旧区域,这就类似生成器的机制。

生成器的特点 

生成器采用延时计算(以时间换空间),我们使用算法来一步步推算元素,这样更加具有弹性,

它可以根据意愿来选择停止的节点,这样的好处就是不用耗费大量内存的情况下满足我们的需要。

生成器的语法

生成器表达式

在以往的学习中,我们学习过列表推导式:

lst = [x for x in range(10)]

这样我们可以得到0-9的列表,同样地,我们只需将[ ]改成( )就可以得到我们的生成器表达式 

g = (x*x for x in range(10))
print(g)#<generator object <genexpr> at 0x000001A0CA096890>

 生成器函数

生成器函数是一种阻塞函数,何为阻塞?我们如果学过并发知识,我们会了解异步协程时遇到IO流,这个阶段会花费一段时间,但后续过程我们又必须使用这个IO得到的对象,所以我们会停下来等待IO结束。

生成器函数通过yield关键字来实现阻塞操作,yieldreturn一般可以做到返回的效果,但是它并不会结束跳出函数体,而是阻塞在这一条语句的位置,静待下一次迭代的到来,当新的迭代到来,

代码从yield下一条语句开始,直到再没有yield语句后抛出StopIteration退出。

def gen():
    i = 0
    while i < 10:
        res = yield i
        print(f"res:{res}")
        i += 1
    return

if __name__ == '__main__':
    g = gen()
    print(g)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))

 

我们发现res的值都是none,这是因为阻塞后的下次迭代是从yield下一条语句开始的,yield先返回了i的值,它的下一条语句是赋值语句,但这时已经没有值可以赋给res了,所以res每次都是空值。 

 

send方法

def gen():
    i = 0
    while i < 10:
        res = yield i
        print(f"res:{res}")
        i += 1
    return

if __name__ == '__main__':
    g = gen()
    print(g)
    print(next(g))
    print(g.send(100))
    print(g.send(200))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))

 

对比之前的结果,res终于不是none了,这是因为我们使用了send方法 ,send的作用是唤醒并继续执行,发送一个信息到生成器内部,这时挂起后终于有值可以赋值给res,所以res不为none。

迭代器

迭代器概念

在介绍迭代器概念前,我们先回想一下什么时候我们会使用迭代器呢?一般在迭代循环时我们可以找见迭代器或者一些可迭代对象,这给我们一种印象:迭代器与循环密不可分。

概念:

1.迭代是Python最强大的功能之一,是访问集合元素的一种方式。

2. 迭代器是一个可以记住遍历的位置的对象。

3. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

4 .迭代器只能往前不会后退。 5 迭代器有两个基本的方法: iter() 和 next()

 可迭代对象与迭代器

可迭代对象(Iterable object): 实现了__iter__方法的对象

迭代器(Iterator):实现了__iter__和__next__方法的对象,或者称为实现了__next__方法的可迭代对象。

from collections.abc import Iterator
from collections.abc import Iterable


def gen():
    i = 0
    while i < 10:
        res = yield i
        print(f"res:{res}")
        i += 1
    return

if __name__ == '__main__':
    g = gen()#生成器函数
    print(isinstance(g,Iterable))
    print(isinstance(g,Iterator))
    print(isinstance([],Iterable))
    print(isinstance([],Iterator))

 

 

通过代码验证,我们得到:生成器是迭代器,而列表,集合等都是可迭代对象。

 

为什么 list 、 dict 、 str 等数据类型不是 Iterator ?

Python的 Iterator 对象表示的是一个数据流。可以把这个数据流看 做是一个有序序列,但我们却不能提前知道序列的长度,只能 不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算 是惰性的,只有在需要返回下一个数据时它才会计算。 所以,生成器一定是迭代器。 Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而 使用list是永远不可能存储全体自然数的。

for循环本质

for x in [1,2,3,4,5]:
    pass

 本质上是:

it = iter([1, 2, 3, 4, 5])
while True:
 try:
     
     x = next(it)
 except StopIteration:
     break

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

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

相关文章

springboot整合rabbitmq的不同工作模式理解

前提是已经安装并启动了rabbitmq&#xff0c;并且项目已经引入rabbitmq&#xff0c;完成了配置。 不同模式所需参数不同&#xff0c;生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

2024数维杯数学建模B题生物质和煤共热解问题的研究原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024数维杯数学建模挑战赛B题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024数维杯数学建模B题煤共热解每一问高质量完整代码讲解&#xff01;_哔哩哔哩_bilibili 2024数维杯…

Linux 信号保存

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 阻塞信号 1. 信号其他相关常见…

mybatis-plus使用指南(1)

快速开始 首先 我们 在创建了一个基本的springboot的基础框架以后&#xff0c;在 pom文件中 引入 mybatisplus的相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5…

香港虚拟主机哪里可以试用?用于企业建站的

香港虚拟主机适合个人、企业建站&#xff0c;包括外贸企业网站、个人博客网站、中小企业官网等&#xff0c;那么作为新手不知道哪家香港虚拟主机好用的时候&#xff0c;该如何找到可以试用的香港虚拟主机呢&#xff1f; 香港虚拟主机也称作香港空间、香港虚拟空间&#xff0c;…

基于截断傅里叶级数展开的抖动波形生成

1、背景 抖动是影响信号完整性的重要因素。随着信号速率的不断提高&#xff0c;抖动的影响日益显著。仿真生成抖动时钟或抖动信号&#xff0c;对系统极限性能验证具有重要意义。抖动是定义在时域上的概念&#xff0c;它表征真实跳变位置(如跳边沿或过零点)与理想跳变位…

18 搜索语法+AI工具找到你想要的答案

1 常用到的AI 官网地址 Perplexity AI: 一个聊天机器人式的搜索引擎&#xff0c;使用生成式AI技术提供答案。 官网地址: Perplexity AI3 Lepton Search: 开源的对话式AI搜索引擎。 官网地址: Lepton Search5 ThinkAny: 由独立开发者idoubi开发的AI搜索引擎&#xff0c;使用RAG技…

安卓开发--新建工程,新建虚拟手机,按键事件响应(含:Android中使用switch-case遇到case R.id.xxx报错)

安卓开发--新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应 1.前言2.运行一个工程2.1布局一个Button2.2 button一般点击事件2.2 button属性点击事件2.2 button推荐点击事件&#xff08;含&#xff1a;Android中使用switch-case遇到case R.id.xxx报错&#xff09; 本…

【数据结构】总结建堆方式、建堆时间复杂度对比分析

目录 一、建堆方式 1.堆的实现中——HeapPush()插入建堆 2.手动建堆——利用AdjustUp()向上调整建堆 3.手动建堆——利用AdjustDown()向下调整建堆 二、手动建堆时间复杂度对比分析 1.向上调整建堆时间复杂度O(N*logN) 2.向下调整建堆时间复杂度O(N) 一、建堆方式 1.堆…

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…

(CVE-2012-1823)PHP-CGI远程代码执行漏洞(80端口)

&#xff08;CVE-2012-1823&#xff09;PHP-CGI远程代码执行漏洞&#xff08;80端口&#xff09; 一、介绍二、漏洞影响三、原理四、漏洞复现 一、介绍 php-cgi是一个类似于消息的“传递者”&#xff0c;它接收web容器收到的http数据包&#xff0c;并把里面的数据交给PHP解释器…

STM32修改主频+三种睡眠模式的实例

文章目录 前言修改主频测试 睡眠模式串口收发接线图关于配置立刻睡眠和等待睡眠模式的寄存器串口配置测试执行流程 停止模式对射式红外传感器计数接线图配置红外传感器与外部中断测试注意 待机模式RTC实时时钟接线图时钟配置测试 注意 前言 本内容主要实操修改主频与使用三种睡…

Git在windows和Linux安装并自动更新代码超详细讲解

一、Git官网安装 1、官网安装地址&#xff1a; Git - Downloading Packagehttps://git-scm.com/download/win 官网下载比较慢建议使用下面链接 2、国内镜像下载地址&#xff1a; CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 3、…

桥梁监控可视化大屏:现代桥梁管理的必备呀。

桥梁监控上可视化有几个重要的原因&#xff1a; 01.实时监控&#xff1a; 可视化的监控系统可以实时显示桥梁的各项监测数据&#xff0c;包括结构变形、振动、温度等&#xff0c;使监控人员能够实时了解桥梁的状态&#xff0c;及时发现异常情况并采取相应的措施。 02.数据分析…

STM32 | STC-USB驱动安装Windows 10(64 位)

Windows 10&#xff08;64 位&#xff09;安装方法 由于 Windows10 64 位操作系统在默认状态下&#xff0c;对于没有数字签名的驱动程序是不能安装成功的。所以在安装 STC-USB 驱动前&#xff0c;需要按照如下步骤&#xff0c;暂时跳过数字签名&#xff0c;即可顺利安装成功。…

【超详细】跑通YOLOv8之深度学习环境配置1

环境配置1下载安装内容如下&#xff1a; Anaconda&#xff1a;https://www.anaconda.com/download/success VScode&#xff1a;https://code.visualstudio.com/Download Pycharm&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows Visual Studio2019&a…

DELL T630服务器iDRAC分辨率调整办法

对于Dell T630服务器的iDRAC分辨率调整&#xff0c;您需要登录到iDRAC的Web界面。以下是详细的步骤&#xff1a; 登录iDRAC&#xff1a;在浏览器中输入iDRAC的IP地址&#xff0c;然后使用用户名&#xff08;通常是“root”&#xff09;和密码登录。 导航到虚拟控制台&#xff…

第十四篇:数据库设计精粹:规范化与性能优化的艺术

数据库设计精粹&#xff1a;规范化与性能优化的艺术 1. 引言 1.1 数据库设计在现代应用中的核心地位 在数字化的浪潮中&#xff0c;数据库设计如同建筑师手中的蓝图&#xff0c;是构建信息大厦的基石。它不仅关乎数据的存储与检索&#xff0c;更是现代应用流畅运行的生命线。…

STC8增强型单片机开发【电位器案例(ADC)⭐⭐】

目录 一、引言 二、硬件准备 三、电路连接 四、软件编程 五、案例实现 六、总结 一、引言 STC8系列增强型单片机以其高性能、低功耗和丰富的外设接口&#xff0c;在嵌入式系统开发中得到了广泛应用。其中&#xff0c;模数转换器&#xff08;ADC&#xff09;是单片机的一…

MapReduce | 二次排序

1.需求 主播数据--按照观众人数降序排序&#xff0c;如果观众人数相同&#xff0c;按照直播时长降序 # 案例数据 用户id 观众人数 直播时长 团团 300 1000 小黑 200 2000 哦吼 400 7000 卢本伟 100 6000 八戒 250 5000 悟空 100 4000 唐僧 100 3000 # 期望结果 哦吼 4…