Python小白学习教程从入门到入坑------第三十二课 生成器(语法进阶)

目录

一、生成器 generator

1.1 生成器表达式

1.1.1 表达式一

1.1.2 表达式二

二、可迭代对象、迭代器、生成器三者之间的关系

2.1 定义与特性

2.2 关系与区别



一、生成器 generator

在Python中,生成器(Generators)是一种用于迭代对象的特殊类型函数。

它们允许你生成一个序列的元素,但不像列表(list)那样一次性将所有元素加载到内存中,而是逐个生成元素,从而节省内存空间。

生成器函数使用yield关键字来暂停函数执行并产生一个值,然后在下一次迭代时从上次暂停的位置继续执行。

1.1 生成器表达式

1.1.1 表达式一

在Python中生成器表达式类似于列表推导式,不同的只是列表推导式中的 [ ] 变成了()

eg:

# 列表推导式
li = [i*5 for i in range(5)]
print(li)
# 输出内容:[0, 5, 10, 15, 20]# 生成器表达式
gen = (i*5 for i in range(5))
print(gen)
# 输出内容:<generator object <genexpr> at 0x00000202DB56B648>

那么我们该如何从对象gen中进行取值呢?

这就需要用到上一节课中用到的 next 方法去进行取值

eg:

gen = (i*5 for i in range(5))
# print(gen)
# 输出内容:<generator object <genexpr> at 0x00000202DB56B648>
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))

输出结果:

0
5
10
15
20进程已结束,退出代码 0

如果再多运行一个print(next(gen)就会引发StopIteration报错,与迭代器一样

1.1.2 表达式二

生成器函数(重要):Python中,使用了yield关键字的函数就称之为生成器函数

yield的作用:
1.类似return,将指定值或者多个值返回给调用者
2.yield语句一次返回一个结果,在每个结果中间,挂起函数,执行next(),再重新从挂起点继续往下执行,简而言之,yield就是使函数中断,并保存中断的状态

生成器函数在每次调用时,会暂停其执行状态,并在下一次调用时从上次暂停的地方继续执行

基本用法:
在生成器函数中,yield语句用于返回一个值给调用者,并暂停函数的执行,下一次调用生成器的__next__()方法(或在循环中迭代生成器)时,函数会从上次yield语句之后的地方继续执行

eg:

# 定义一个名为simple_generator的生成器函数
def simple_generator():yield 1   # 使用yield返回一个值1给调用者,并在此处暂停函数的执行,挂起状态# 下一次迭代时,函数将从这里恢复运行,但不会重新进入函数体开始处yield 2   # 当函数恢复执行时,继续执行到这里,并返回值2给调用者# 再次暂停函数的执行yield 3   # 同理,函数再次恢复执行时,返回值3给调用者,然后函数再次暂停# 创建一个simple_generator生成器对象
gen = simple_generator()# 使用for循环来迭代生成器对象
for i in gen:print(i)  # 在每次迭代中,从生成器中获取一个值(1, 2, 或 3),并打印出来
# 输出:
# 1  # 第一次迭代,打印出生成器返回的第一个值
# 2  # 第二次迭代,打印出生成器返回的第二个值
# 3  # 第三次迭代,打印出生成器返回的第三个值
# 循环结束后,生成器对象已经被耗尽,不会再产生新的值

状态保持:
生成器函数能够保持其局部变量和执行状态,直到下一次被调用

eg:

# 定义一个名为counter的生成器函数
def counter():count = 0  # 初始化计数器变量count为0while True:  # 使用无限循环来不断产生新的计数值count += 1  # 每次循环时,将计数器count的值加1yield count  # 返回当前的计数值给调用者,并暂停函数的执行# 创建一个counter生成器对象
c = counter()# 使用next()函数调用生成器对象,获取并打印第一个计数值(1)
# 此时,生成器函数执行到第一个yield语句,返回1并暂停
print(next(c))  # 输出: 1# 再次使用next()函数调用生成器对象,获取并打印下一个计数值(2)
# 生成器函数从上次暂停的地方继续执行,执行到下一个yield语句,返回2并再次暂停
print(next(c))  # 输出: 2# 第三次使用next()函数调用生成器对象,获取并打印下一个计数值(3)
# 同理,生成器函数继续执行,返回3并暂停
print(next(c))  # 输出: 3

与for循环结合:
生成器通常与for循环一起使用,因为for循环会自动调用生成器的__next__()方法,直到引发StopIteration异常,这标志着生成器的结束

eg:

# 定义一个简单的生成器函数
def simple_generator():# 使用yield返回一个值1,并在此处暂停函数的执行# 生成器函数的状态会被保存,以便下次从这里继续执行yield 1  # 返回1给调用者,并暂停# 当生成器函数再次被调用时(通过next()或迭代),它会从这里继续执行# 并返回下一个yield语句的值yield 2  # 返回2给调用者,并再次暂停# 同理,这里返回3并暂停,直到生成器被完全迭代完yield 3  # 返回3给调用者,然后生成器函数执行完毕,准备抛出StopIteration# 创建一个生成器对象
gen = simple_generator()# 使用for循环来迭代生成器对象
# for循环会自动调用生成器的__next__()方法,直到捕获到StopIteration异常
for i in gen:  # 开始迭代生成器对象# 在每次迭代中,从生成器中获取一个值,并赋值给变量i# 然后执行循环体中的代码print(i)  # 打印出从生成器中获取的值# 当生成器被完全迭代完(即所有yield语句都执行过),for循环会自动结束
# 输出将会是:
# 1
# 2
# 3
# 此时,生成器对象已经被耗尽,即它不会再产生新的值了

二、可迭代对象、迭代器、生成器三者之间的关系

 

2.1 定义与特性

可迭代对象:

        定义:实现了__iter__()方法的对象

        特性:可以通过iter()函数获取其迭代器,从而进行遍历

        示例:列表、元组、字符串、字典、集合等都是可迭代对象

迭代器:

        定义:实现了__iter__()和__next__()方法的对象

        特性:

        1、迭代器对象自身实现了迭代协议,即它既是自己的迭代器

        2、可以通过next()函数或迭代器的__next__()方法逐个获取元素,直到抛出StopIteration异常,表示迭代结束

        示例:通过调用可迭代对象的__iter__()方法或iter()函数获得的对象就是迭代器

生成器:

        定义:一种特殊的迭代器,通过函数中的yield语句来生成值

        特性:

        1、生成器函数在调用时不会立即执行函数体中的代码,而是返回一个生成器对象

        2、生成器对象实现了迭代器的所有方法,包括__iter__()和__next__()

        3、每次调用生成器的__next__()方法时,函数会从上次暂停的地方继续执行,直到遇到下一个yield语句或函数结束

        4、生成器具有惰性求值的特性,即只在需要时才生成值

        示例:包含yield语句的函数就是生成器函数,调用该函数会返回一个生成器对象

2.2 关系与区别

三者之间的关系:

可迭代对象包含迭代器:任何迭代器都是可迭代对象,因为迭代器实现了__iter__()方法(通常返回自身)。但并非所有可迭代对象都是迭代器,因为可迭代对象只需要实现__iter__()方法,而不需要实现__next__()方法

生成器是迭代器的一种特殊形式:生成器自动实现了迭代器协议(即__iter__()和__next__()方法),因此生成器对象既是生成器又是迭代器,

需要注意迭代器并不一定是生成器,它是python提供的通过简便的方法写出迭代器的一种手段

三者之间的区别:

可迭代对象:主要用于表示一个可以遍历的数据集合,但不直接支持通过索引访问元素

迭代器:提供了对可迭代对象进行遍历的统一接口,即__next__()方法。迭代器对象可以在遍历过程中保持内部状态,以便跟踪迭代进度

生成器:通过函数中的yield语句按需生成值,具有惰性求值的特性。生成器在迭代过程中不会一次性生成所有值,而是根据需要逐个生成,从而节省内存空间


今天的分享就到这里了,希望能够对大家有所帮助~

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

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

相关文章

商业iOS端路由架构演进

背景 目前商业SDK中的点击事件&#xff0c;会根据不同的「事件类型」「业务类型」&#xff0c;去执行不同的路由跳转逻辑&#xff0c;然而不同的跳转事件内部又有着很复杂的跳转逻辑&#xff0c; 痛点 不同的跳转逻辑之间存在耦合 例如&#xff0c;在deeplink的跳转逻辑之中…

数据结构(单向链表——c语言实现)

链式存储的优缺点&#xff1a; 优点&#xff1a; 1、动态分配内存&#xff1a; 链式存储不需要在数据插入之前分配固定大小的数组或内存块&#xff0c;因此它更适合存储动态变化的数据 2、高效的插入和删除操作&#xff1a; 在链表中插入或删除元素只需要调整相邻节点的指…

【SQL】E-R模型(实体-联系模型)

目录 一、介绍 1、实体集 定义和性质 属性 E-R图表示 2. 联系集 定义和性质 属性 E-R图表示 一、介绍 实体-联系数据模型&#xff08;E-R数据模型&#xff09;被开发来方便数据库的设计&#xff0c;它是通过允许定义代表数据库全局逻辑结构的企业模式&#xf…

Pytest-Bdd-Playwright 系列教程(12):步骤参数 parsers参数解析

Pytest-Bdd-Playwright 系列教程&#xff08;12&#xff09;&#xff1a;步骤参数 & parsers参数解析 前言一、什么是步骤参数&#xff1f;二、pytest-bdd 的步骤参数用法2.1 简单字符串解析2.2 自定义正则表达式解析2.3 参数类型转换 三、案例&#xff1a;基于 pytest-bdd…

vscode 快捷键生成代码

1. &#xff01;Tab/回车键 便捷生成html初始结构代码&#xff08;注意&#xff01;是英文字符&#xff09; 2. Alt B 快捷默认浏览器打开 3. Ctrl / 增加注释 4. 光标放到该行即可&#xff0c;直接ctrlC&#xff0c;ctrlv&#xff0c;即可在下面复制一行 5. 选中要修改的标签…

前端接入Paymax支付请求

材料指南 开发者平台 &#xff1a;配置开发必备信息&#xff08;appid&#xff0c;商户号&#xff0c;公钥私钥&#xff09;,此处与请求参数appId、merchantNo有关。 PayerMax Apis&#xff1a;各支付接口信息,本文以收银台支付API为请求展开,请求url为orderAndPay,测试环境基…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

CSS遮罩:mask

CSS属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。 // 一般用位图图片做遮罩 mask: url(~/assets/images/mask.png); mask-size: 100% 100%;// 使用 SVG 图形中的形状来做遮罩 mask: url(~/assets/images/mask.svg#star);…

Zmap+python脚本+burp实现自动化Fuzzing测试

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

15. Python中的os.path模块/路径操作相关

这个专栏记录我学习/科研过程中遇到的一些小问题以及解决方案&#xff0c;一些问题可能比较蠢请见谅。自用&#xff0c;仅供参考。 ------------------------------------------------------------------------------------ Python中的os.path模块详解&#xff08;包括一些常…

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息&#xff1a; 简介: 本文讨论的背景是大型语言模型&#xff08;LLMs&#xff09;的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪

这里写目录标题 1.目标检测 Detection2.实例分割 segment3.图像分类 classify4.关键点估计 Keypoint detection5.视频帧检测 video detect6.视频帧分类 video classify7.旋转目标检测 obb detect8.替换yolo11模型 给我点个赞吧&#xff0c;谢谢了附录coco80类名称 笔记本 华为m…

图像处理学习笔记-20241118

文章目录 霍夫变换基本原理霍夫变换的步骤使用 OpenCV 实现直线检测示例&#xff1a;标准霍夫变换 示例&#xff1a;概率霍夫变换参数解释霍夫变换检测圆 基于GAN的样本生成GAN的基本原理基于GAN的数据增广流程实现代码示例 同态滤波&#xff08;Homomorphic Filtering&#xf…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

当科技照进现实 机器人带着机器狗乘空轨

湖北日报讯&#xff08;记者魏铼、通讯员张璨龙&#xff09;11月14日&#xff0c;武汉东湖高新区空轨高新大道站&#xff0c;在光谷装上“智慧大脑”的人形机器人&#xff0c;乘空轨&#xff0c;看AI展&#xff0c;与小朋友在生态大走廊斗舞。 京天博特&#xff1a;光谷“智慧大…

freertos任务调度学习

首先创建任务&#xff0c;创建好任务后&#xff0c;开启任务调度器&#xff0c;任务才能执行 1.开启任务调度器 2.启动第一个任务 3.任务切换

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;13届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每…

MySQL系列之数据授权(privilege)

导览 前言Q&#xff1a;如何对MySQL数据库进行授权管理一、MySQL的“特权”1. 权限级别2. 权限清单 二、授权操作1. 查看权限2. 分配权限3. 回收权限 结语精彩回放 前言 看过博主上一篇的盆友&#xff0c;可以Get到一个知识点&#xff1a;数据授权&#xff08;eg&#xff1a;g…

C++为函数提供的型特性——缺省参数与函数重载

目录 一、缺省参数 二、函数重载 一、缺省参数 C为函数提供了一项新的特性——缺省参数。缺省参数指的是当前函数调用中省略了实参自动使用的一个值。这极大地提高了函数的灵活性 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值 。在调⽤该函数时&#xff0c;如果没有…