当前位置: 首页 > news >正文

Python高频面试题——生成器(最通俗的讲解)

生成器定义

在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时,从当前位置继续运行。yield 函数创建生成器generator。yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行,代码如下:

def num_generator2():yield 1yield 2yield 3gen2 = num_generator2()
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))输出:
print(next(gen2))
StopIteration
1
2
3

上面的代码中我们可以看到:

num_generator2() 是生成器函数,而gen2 是生成器对象;

调用一次next 输出一个值,生成器会记录前一次next的执行位置

当next无值时,抛出异常StopIteration

print(type(gen2)) 输出<class 'generator'>

因为通过next函数可以获取生成器对象的值,所以生成器对象就是迭代器对象 执行下面代码可以证明

from collections.abc import Iterator
print(isinstance(gen2,Iterator))
返回True

再看一个经典的例子

def demo():while True:val = yield 1print("val:", val)g = demo()
print("第一次执行")
print(next(g))
print("第二次执行")
print(next(g))
print("第三次执行")
print(g.send(2))

输出:

第一次执行
1
第二次执行
val: None
1
第三次执行
val: 2
1

对上面的例子进行一下分析

第一次执行输出

1

返回了1,因为 val = yield 1 执行后,程序就结束了,所以 print("val:", val)没有被执行

第二次执行输出

val: None

1

因为记录了上次执行的位置,所以val: None是while上面的print的结果(val没有赋值,所以是None),第二个是return的结果还是1

第三次执行输出

val: 2

1

这里使用了send方法,就是发送一个参数给val,这次 print("val:", val)中的参数val 首先被赋值了2进行了输出,然后在return 1

使用生成器的原因

为什么使用generator呢,最重要的原因是可以按需生成并“返回”结果,而不是一次性产生所有的返回值。比如对于下面的代码。

NUM = 100
for i in [x*x for x in range(NUM)]: # 第一种方法:对列表进行迭代print(i)
for i in (x*x for x in range(NUM)): # 第二种方法:对generator进行迭代print (i)

上面的代码中,两个for语句输出是一样的,代码字面上看来也就是中括号与小括号的区别(创建生成器的一个简单方法是把列表生成式的 [ ] 变为 ( ))。但这点区别差异是很大的,第一种方法返回值是一个列表,第二个方法返回的是一个generator对象。随着NUM的变大,第一种方法返回的列表也越大,占用的内存也越大;但是对于第二种方法没有任何区别,生成器一次只能返回一个值,将大大减小占用内存。

生成器和迭代器的区别

熟悉迭代器的同学发现,生成器和迭代器很像,但必定还是两个东东,二者的主要区别如下:

1. 迭代器是访问容器的一种方式,容器已经出现,我们是从已有元素获取一份副本来为我们此次迭代使用;而生成器则是自己生成元素的。

2. 在用法上生成器只需要简单函数写法,配合yield就能实现;而迭代器真正开发中使用有限

return和yield的区别

主要有两点

return作为结尾的普通函数直接返回所有结果,程序终止不再运行,并销毁局部变量;

yield会产生一个断点,暂停函数,挂起函数,保存当前状态。并且在yield处返回某个值,返回之后程序就不再往下运行了。

具体的解释

带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

相关文章:

Python高频面试题——生成器(最通俗的讲解)

生成器定义在 Python 中&#xff0c;使用了 yield 的函数被称为生成器&#xff08;generator&#xff09;。跟普通函数不同的是&#xff0c;生成器是一个返回迭代器的函数&#xff0c;只能用于迭代操作&#xff0c;更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中…...

品牌软文怎么写?教你几招

软文是什么&#xff1f;软文的本质就是广告&#xff0c;当然不是明晃晃的推销&#xff0c;而是自然隐晦地植入产品信息&#xff0c;引导更多用户自愿下单。 品牌软文对于写手的经验、内容的质量要求都相对较高&#xff0c;否则写出来的软文无法达到预期的效果。品牌软文怎么写…...

Kubernetes (k8s) 污点(Taint)介绍、示例

Kubernetes (k8s) 污点&#xff08;Taint&#xff09; 是一种机制&#xff0c;用于标记一个节点&#xff08;Node&#xff09;不可被调度的状态。它可以将一个污点标记添加到节点上&#xff0c;以防止 Pod 被调度到该节点上。污点可以用于实现各种策略&#xff0c;例如分离故障…...

Docker学习(二十一)构建 java 项目基础镜像

目录1.下载 JDK 包2.编写 Dockerfile3.构建镜像4.创建容器测试1.下载 JDK 包 JDK各版本官网下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/archive/#JavaSE 这里我们以 JDK 8u351 为例&#xff0c;点击 Java SE (8U211 and later)。 点击下载 jd…...

python中的上下文原理

目录with语句上下文管理器原理自定义上下文管理器contextmanager 装饰器with语句 在我们日常使用场景中&#xff0c;经常会操作一些资源&#xff0c;比如文件对象、数据库连接、Socket连接等&#xff0c;资源操作完了之后&#xff0c;不管操作的成功与否&#xff0c;最重要的事…...

可复用测试用例描述要素

测试用例的输入、操作、预期结果和评估标准、前提条件是测试用例不可少的要素&#xff0c;但对于可复用测试用例而言&#xff0c;这是不够的。本文在文献规定的测试用例要素基础上&#xff0c;增加了新的内容。从而从多个角度完整地对可复用测试用例进行了描述&#xff0c;为可…...

lnmp中遇到open_basedir配置无效问题

在使用LNMP包安装PHP时&#xff0c;发现直接修改php.ini的配置是无法生效的&#xff0c;其原因竟然是因为nginx的配置文件&#xff0c;覆盖了php.ini的配置。 解决&#xff1a; 1、找到nginx的open_basedir配置文件&#xff1a;&#xff08;下面是我的文件地址&#xff09; …...

SpringBoot【知识加油站】---- REST开发

SpringBoot【知识加油站】---- REST开发1. REST 简介2. REST 风格3. RESTful 入门案例1. REST 简介 REST&#xff1a;Representaional State Transfer&#xff0c;表现形式状态转换 传统风格资源描述形式 http://localhost/user/getById?id1 http://localhost/user/saveUser…...

三 Go的语言容器

1. 数组 数组是一个由固定长度的特定类型元素组成的序列&#xff0c;一个数组可以由零个或多个元素组成。因为数组的长度是固定的&#xff0c;所以在Go语言中很少直接使用数组 声明语法&#xff1a; var 数组变量名 [元素数量]Typepackage main import ("fmt" ) fu…...

2023年全国最新会计专业技术资格精选真题及答案16

百分百题库提供会计专业技术资格考试试题、会计考试预测题、会计专业技术资格考试真题、会计证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、单选题 1.下列各项关于会计监督职能的表述中&#xff0c;正确的是&#xff…...

模板进阶(仿函数,特化等介绍)

非类型模板参数 模板参数有类型形参和非类型形参&#xff1b; 类型形参&#xff1a;使用typename或者class修饰的参数类型名称 非类型形参&#xff1a;一个普通常量作为模板参数形参&#xff0c;不能为浮点数&#xff0c;字符类型以及类对象&#xff1b; #include<iostrea…...

Beats:在 Docker 中同时部署 Metricbeat 和 Elasticsearch

在本教程中&#xff0c;我们将部署一个 metricbeat 来监控正在运行的容器的健康状况和系统指标。 为什么需要监控&#xff0c;为什么需要 Metricbeat&#xff1f; 一个常见的问题&#xff0c;但很少有人回答。 首先&#xff0c;无论我们部署的是 docker 容器还是老式的金属箱&…...

编码技巧——Redis Pipeline

本文介绍Redis pipeline相关的知识点及代码示例&#xff0c;包括Redis客户端-服务端的一次完整的网络请求、pipeline与client执行多命令的区别、pipeline与Redis"事务"、pipeline的使用代码示例&#xff1b; pipeline与client执行多命令的区别 Redis是一种基于客户…...

ArcGIS制图技巧:制图入门与点、线、面状符号制作

目的&#xff1a; 1、了解地图制作目的&#xff1b; 2、了解在ArcMap平台中制作地图大致过程。 3、掌握地形图生成的操作&#xff1b; 4、掌握地形图的正确输出方法。 5、理解点状符号、线状符号、面状符号的基本概念&#xff1b; 6、理解地形点状符号、线状符号、面状符…...

Java基础 关于字典数据维护接口设计

开发环境 Eclipse2022JDK1.8 目录 1. 概述 2. 实现步骤 2.1 定义通用接口 2.2 定义实体类 2.3 接口扩展 2.4 接口实现 2.5 功能测试 3. 结语 1. 概述 每一个信息系统或多或少都带有一些数据字典&#xff0c;在维护上&#xff0c;基本上分为增删改查&#xff0c;也就是对数据…...

从零开始学架构——复杂度来源

复杂度来源——高性能 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机,从电子管计算机到晶体管计算机再到集成电路计算机,运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高&#xff0c;相应的方法和系统复杂度也是越来越高。现代的计算机CPU集成…...

什么时候需要分表分库?

在当今互联网时代&#xff0c;海量数据基本上是每一个成熟产品的共性&#xff0c;特别是在移动互联网产品中&#xff0c;几乎每天都在产生数据&#xff0c;例如&#xff0c;商城的订单表、支付系统的交易明细以及游戏中的战报等等。对于一个日活用户在百万数量级的商城来说&…...

冰刃杀毒工具使用实验(29)

实验目的 &#xff08;1&#xff09;学习冰刃的基本功能&#xff1b; &#xff08;2&#xff09;掌握冰刃的基本使用方法&#xff1b;预备知识 windows操作系统的基本知识&#xff0c;例如&#xff1a;进程、网络、服务和文件等的了解。 冰刃是一款广受好评的ARK工…...

聊聊图像分割的DICE和IOU指标

目录 1. 介绍 2. dice 和 iou 的联系 3. 代码实现 3.1 dice 3.2 iou 3.3 test 3.4 dice 和 iou 的关系曲线 4. 代码 1. 介绍 dice 和 iou 都是衡量两个集合之间相似性的度量 dice计算公式&#xff1a; iou计算公式&#xff1a; iou的集合理解&#xff1a; iou 其实就…...

软件设计师教程(十)计算机系统知识-结构化开发

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;…...

嵌入式Linux C语言开发核心技术与实践

嵌入式Linux开发中的C语言编程要点解析1. 嵌入式C语言开发概述1.1 嵌入式环境特点在嵌入式Linux开发中&#xff0c;C语言作为主要编程语言具有不可替代的地位。与通用计算机环境相比&#xff0c;嵌入式系统具有资源受限、实时性要求高、硬件接口特殊等特点&#xff0c;这些特性…...

AI原生应用中的个性化推荐算法实战解析

AI原生应用中的个性化推荐算法实战解析 关键词&#xff1a;AI原生应用、个性化推荐、协同过滤、深度学习推荐模型、冷启动问题 摘要&#xff1a;在AI技术深度渗透的今天&#xff0c;“AI原生应用”&#xff08;AI Native Apps&#xff09;已从概念走向落地。这类应用的核心特征…...

nlp_gte_sentence-embedding_chinese-large实战案例:客服工单自动归类与聚类分析

nlp_gte_sentence-embedding_chinese-large实战案例&#xff1a;客服工单自动归类与聚类分析 1. 引言&#xff1a;客服工单处理的痛点与解决方案 每天处理成千上万的客服工单是什么体验&#xff1f;想象一下这样的场景&#xff1a;客服团队每天收到大量用户反馈&#xff0c;从…...

零代码部署YOLOv9:官方镜像5分钟快速上手,实测效果惊艳

零代码部署YOLOv9&#xff1a;官方镜像5分钟快速上手&#xff0c;实测效果惊艳 1. 为什么选择YOLOv9官方镜像 目标检测领域的最新突破YOLOv9已经发布&#xff0c;但很多开发者在尝试部署时遇到了各种环境配置问题。这个官方预构建的镜像解决了三大核心痛点&#xff1a; 环境配置…...

3分钟让静态图像“活“起来:AI肖像动画技术全解析

3分钟让静态图像"活"起来&#xff1a;AI肖像动画技术全解析 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait 静态图像如何突破二维平面的限制&#xff0c;展现动态生命力&#xff1f…...

Akagi:麻将智能决策的创新辅助方法——从牌局困境到战术精通的实践指南

Akagi&#xff1a;麻将智能决策的创新辅助方法——从牌局困境到战术精通的实践指南 【免费下载链接】Akagi A helper client for Majsoul 项目地址: https://gitcode.com/gh_mirrors/ak/Akagi Akagi作为一款专为雀魂玩家设计的AI辅助工具&#xff0c;通过实时牌局分析与…...

解锁戴森电池3大突破:固件破解技术让32次红灯故障电池重生

解锁戴森电池3大突破&#xff1a;固件破解技术让32次红灯故障电池重生 【免费下载链接】FU-Dyson-BMS (Unofficial) Firmware Upgrade for Dyson V6/V7 Vacuum Battery Management System 项目地址: https://gitcode.com/gh_mirrors/fu/FU-Dyson-BMS 当你的戴森吸尘器突…...

WarcraftHelper终极指南:魔兽争霸III现代化增强解决方案

WarcraftHelper终极指南&#xff1a;魔兽争霸III现代化增强解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为经典游戏…...

使用Proteus进行电路仿真:为HunyuanVideo-Foley生成电子音效提供灵感

使用Proteus进行电路仿真&#xff1a;为HunyuanVideo-Foley生成电子音效提供灵感 1. 引言&#xff1a;当电路仿真遇上AI音效生成 想象一下&#xff0c;你正在为一款科幻游戏设计音效。传统的音效库已经用腻了&#xff0c;想要一些真正独特、带有"电路感"的声音效果…...

利用快马平台十分钟搭建yolo目标检测web演示原型

最近在尝试用YOLO算法做目标检测的Web演示&#xff0c;发现用InsCode(快马)平台可以超级快地搭建出原型。整个过程比我预想的简单太多&#xff0c;从零开始到实际运行只用了十分钟左右&#xff0c;特别适合想快速验证想法的时候用。这里记录下我的实现思路和具体步骤&#xff0…...