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

Python 中 “yield“ 的不同行为

在我们使用Python编译过程中,yield 关键字用于定义生成器函数,它的作用是将函数变成一个生成器,可以迭代产生值。yield 的行为在不同的情况下会有不同的效果和用途。

在这里插入图片描述

1、问题背景

在 Python 中,“yield” 是一种生成器(generator)的实现方式。生成器是一种特殊类型的迭代器(iterator),它可以在运行时动态产生值。然而,在某些情况下,使用生成器可能会遇到令人困惑的行为。

比如,下面有一个函数 x(),它产生一个生成器,该生成器每次调用 next() 方法时都会递减全局变量 a 的值并产生一个 yield 语句:

a = 5def x():global aif a == 3:raise Exception("Stop")a = a - 1yield a

现在,让我们在 Python shell 中调用这个函数并打印出生成的值:

>>> print(x().next())
4
>>> print(x().next())
3

到目前为止,一切正常。但是,如果我们把生成器函数的调用结果赋值给一个变量,然后使用这个变量来产生值,就会出现不同的行为:

>>> a = 5
>>> b = x()
>>> print(b.next())
4
>>> b.next()
StopIteration

这次,在第二次调用 b.next() 时,它没有产生值,而是引发了一个 StopIteration 异常。这是为什么呢?

2、解决方案

要理解这种行为,我们需要了解生成器的工作原理。

当我们调用一个生成器函数时,它并不会立即执行函数体,而是返回一个生成器对象(generator object)。这个生成器对象包含了函数体中的代码,但它不会在调用时执行。当我们使用 next() 方法来产生值时,生成器对象才会开始执行函数体。

在第一次调用 x() 时,我们创建了一个新的生成器对象。这个对象在执行函数体时遇到了 a == 3 这个条件,并引发了一个异常。然后,我们在 Python shell 中打印出了这个异常。

在第二次调用 x() 时,我们又创建了一个新的生成器对象。这个对象在执行函数体时仍然遇到了 a == 3 这个条件,并引发了异常。

但是,当我们把生成器函数的调用结果赋值给变量 b 时,情况发生了变化。这使得我们可以多次调用 b.next() 来产生值。当我们第一次调用 b.next() 时,生成器对象从上次中断的地方继续执行,并产生了值 4

然而,当我们第二次调用 b.next() 时,生成器对象已经执行到了函数体的末尾,没有更多的值可以产生了。因此,它引发了一个 StopIteration 异常。

为了更好地理解这种行为,我们可以使用一个 for 循环来遍历生成器:

def looping(stop):for i in looping(stop):yield i>>> looping(3).next()
0
>>> looping(3).next()
0

注意,每次我们创建一个新的生成器,循环都会从头开始。然而,如果我们存储一个生成器的引用,那么循环会继续从上次中断的地方继续执行:

>>> stored = looping(3)
>>> stored.next()
0
>>> stored.next()
1
>>> stored.next()
2
>>> stored.next()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

在循环期间,每次执行 yield 语句时,代码都会暂停;调用 .next() 继续从上一时间中断的地方继续执行函数。

StopIteration 异常是完全正常的;这是生成器传达它们已经完成的方式。一个 for 循环寻找这个异常来结束循环:

>>> for i in looping(3):
...     print(i)
...0
1
2

通过上述总结我们得知,yield 在不同的上下文中有不同的行为,但都涉及到生成器的创建或者协程的定义。所以说最终选择哪种模式还得更加自身情况来选择。

相关文章:

Python 中 “yield“ 的不同行为

在我们使用Python编译过程中&#xff0c;yield 关键字用于定义生成器函数&#xff0c;它的作用是将函数变成一个生成器&#xff0c;可以迭代产生值。yield 的行为在不同的情况下会有不同的效果和用途。 1、问题背景 在 Python 中&#xff0c;“yield” 是一种生成器&#xff0…...

迅睿CMS中实现关键词搜索高亮

在迅睿CMS系统中实现关键词搜索高亮是提升用户体验和搜索效果的重要手段。当用户搜索某个关键词时&#xff0c;将搜索结果中的关键词高亮显示&#xff0c;可以帮助用户更快速地定位到所需信息。 关键词高亮的实现 在迅睿CMS中&#xff0c;你可以使用内置的dr_keyword_highlig…...

晶振的精度与稳定性有什么关系?

晶振的精度和稳定性是电子设备中非常重要的参数&#xff0c;它们受到多种因素的影响&#xff0c;主要包括&#xff1a; 精度的影响因素&#xff1a; 温度变化&#xff1a;晶体的温度系数会使得频率随温度变化而变化&#xff0c;通常在0C到55C的工业标准温度范围内&#xff0c;…...

【C】137 只出现一次的数字

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 解法一 #include <stdio.h>int singleNumber(i…...

51单片机入门:DS1302时钟

51单片机内部含有晶振&#xff0c;可以实现定时/计数功能。但是其缺点有&#xff1a;精度往往不高、不能掉电使用等。 我们可以通过DS1302时钟芯片来解决以上的缺点。 DS1302时钟芯片 功能&#xff1a;DS1302是一种低功耗实时时钟芯片&#xff0c;内部有自动的计时功能&#x…...

Redis-5 分布式锁

一.为什么要使用分布式锁&#xff1f; 传统的互斥锁synchronized只能作用于同一台虚拟机上的线程&#xff0c;在使用服务器集群部署的情况下&#xff0c;互斥锁就会失效&#xff0c;因此要采用分布式锁来处理不同服务器上的线程访问同一资源的情况。 二.redis的分布式锁是如何…...

音转文工具,9.8k star! 【送源码】

我们经常会遇到将音频转为文字的情况&#xff0c;比如在开会时录音的会议纪要、上课时录下的老师讲课内容。虽然网上也有一些在线的工具可以将音频转为文字&#xff0c;但是考虑到数据安全和费用问题&#xff0c;使用起来也不是很方便。 今天了不起给大家介绍一款开源工具——…...

【首次发布】华为 OD 机试 C卷抽中题库清单(真题库),目前华为OD机考以C卷为主,特殊情况会发送D卷

本篇博客为大家整理华为 OD 考友反馈 C 卷抽中题&#xff0c;经过 1 个的考友复盘&#xff0c;目前已经收录 100 题目&#xff0c;预计在有 2 周可以收集完整。 所有题目&#xff0c;都有考友截图反馈&#xff0c;同时欢迎大家机考过后&#xff0c;提供橡皮擦真题&#xff0c;获…...

【进程等待】waitpid的参数pid | status的位图位操作WIFEXITEDWEXITSTATUS宏

目录 waitpid pid status status位图 status按位操作 输入型参数和输入型参数 宏WIFEXITED&WEXITSTATUS options&非阻塞等待 上篇进程等待我们介绍到怎样去进程等待。我们介绍了wait函数&阻塞等待。本篇我们将介绍waitpid函数的参数pid和status。 waitp…...

unity---常用API

1. Vector3&#xff1a;结构体由x、y、z这3个数值组成&#xff0c;表示一个向量 magnitude变量返回该向量的长度normalized变量返回 magnitude 为 1 时的该向量zero静态变量Vector3(0, 0, 0)one静态变量Vector3(1, 1, 1)forward静态变量Vector3(0, 0, 1)back静态变量Vector3(0…...

设计模式: 模板模式

目录 一&#xff0c;模板模式 二&#xff0c;特点 三&#xff0c;组成部分 四&#xff0c;实现步骤 五&#xff0c;案例 一&#xff0c;模板模式 模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它在超类中定义了一个算法的骨架&#…...

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…...

头文件相互包含 前向声明

当两个类需要相互访问对方的成员或方法时&#xff0c;通常意味着它们之间存在某种依赖关系。这种依赖关系可能源于类的设计或功能需求。以下是一个简单的例子&#xff0c;展示了当两个类需要相互访问对方成员或方法时&#xff0c;如何使用包含对方头文件的方式来解决循环包含的…...

七款好用的上网行为管理软件推荐 |有没有好用的上网行为管理系统

七款好用的上网行为管理软件推荐 |有没有好用的上网行为管理系统 员工上班刷视频&#xff01; 员工上班炒股&#xff01; 员工上班干副业&#xff01; 碰见这种情况怎么办&#xff1f;当然是用电脑监控软件来监视员工的一举一动了&#xff0c;那么这样的软件有哪些呢&#…...

centos7-bcc 安装

检查 内核信息 确保安装的kernel-dev 和内核版本一致!!! rpm -qa|grep kernel kernel-tools-3.10.0-1160.92.1.el7.x86_64 kernel-devel-3.10.0-1160.92.1.el7.x86_64 kernel-headers-3.10.0-1160.92.1.el7.x86_64 kernel-3.10.0-1160.92.1.el7.x86_64 kernel-tools-libs-3.1…...

5.06号模拟前端面试8问

5.06号模拟前端面试8问 1.promise如何实现then处理 在JavaScript中&#xff0c;Promise 是一个代表异步操作最终完成或失败的对象。它有三种状态&#xff1a;pending&#xff08;等待&#xff09;&#xff0c;fulfilled&#xff08;完成&#xff09;&#xff0c;rejected&…...

解读Inscode AI:开启代码智能化的新时代

导语&#xff1a; 近年来&#xff0c;人工智能技术的迅猛发展已经深刻地影响着各个行业&#xff0c;而在软件开发领域&#xff0c;Inscode AI的出现无疑将给代码智能化带来一场革命。本文将为大家解读Inscode AI的特点和应用&#xff0c;探索其如何改变我们的软件开发方式。 一…...

快速了解Vuex

Vuex Vuex使用Vuex Vuex &#x1f4cc;vuex 是一个专为 Vue.js 应用程序开发的状态管理库 &#x1f4cc;vuex 可以在多个组件之间共享数据&#xff0c;并且共享的数据是响应式的&#xff0c;即数据的变更能及时渲染到模板 &#x1f4cc;vuex 采用集中式存储管理所有组件的状态…...

vue管理系统导航中添加新的iconfont的图标

1.在官网上将需要的图标&#xff0c;加入项目中&#xff0c;下载 2.下载的压缩包中&#xff0c;可以选择这两个&#xff0c;复制到项目目录中 3.如果和之前的iconfont有重复&#xff0c;那么就重新命名 4.将这里的.ttf文件&#xff0c;也重命名为自己的 5.在main文件中导入 6.在…...

Docker的介绍及与传统虚拟化技术的区别

Docker是一个开源的应用容器引擎&#xff0c;它使得开发者可以将应用及其依赖包打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于Go语言开发&#xff0c;它的出现极大地简化了应用程序的部署、管理和扩展。 以下是Docker…...

C++ 模板进阶:特化、萃取与可变参数模板

C 模板进阶&#xff1a;特化、萃取与可变参数模板&#x1f4a1; 学习目标&#xff1a;掌握模板进阶技术的核心用法&#xff0c;理解模板特化的深层应用、类型萃取的实现原理&#xff0c;以及可变参数模板的灵活使用&#xff0c;提升泛型编程的实战能力。 &#x1f4a1; 学习重点…...

COMSOL波在可变折射率光纤中的传播

comsol波在光纤中得传播&#xff0c;可变折射率光纤光纤通信系统的性能很大程度上取决于光在纤芯中的传输特性。对于渐变折射率光纤而言&#xff0c;其纤芯折射率呈现非均匀分布&#xff0c;这种结构能有效减小模式色散。在COMSOL中实现这类仿真时&#xff0c;有个特别有意思的…...

STC8051智能电箱控制器硬件设计与多模态通信实现

1. 项目概述STC智能电箱控制器是一款面向低压配电场景的嵌入式集中控制终端&#xff0c;核心目标是实现对家庭或小型商业配电箱内多路负载的本地化、网络化、智能化管理。该控制器并非通用型工业PLC&#xff0c;而是针对AC220V单相入户配电环境定制设计的专用硬件平台&#xff…...

庐山派K230开发板MicroPython编程入门指南:从语法到硬件交互

庐山派K230开发板MicroPython编程入门指南&#xff1a;从语法到硬件交互 最近有不少朋友拿到了庐山派K230开发板&#xff0c;想用Python来玩转硬件&#xff0c;但又觉得从C语言入门门槛太高。别担心&#xff0c;今天我就带你用MicroPython上手&#xff0c;让你用熟悉的Python语…...

Dify与MiniCPM-V-2_6强强联合:可视化构建企业级AI应用

Dify与MiniCPM-V-2_6强强联合&#xff1a;可视化构建企业级AI应用 想自己动手做一个智能客服&#xff0c;或者一个能自动写周报的助手&#xff0c;但又觉得写代码太麻烦&#xff1f;今天&#xff0c;我们就来聊聊一个“零代码”的解决方案。Dify&#xff0c;一个功能强大的AI应…...

Unity游戏开发必备:TextMeshPro超实用标签大全(含动态字体生成技巧)

Unity游戏开发必备&#xff1a;TextMeshPro超实用标签大全&#xff08;含动态字体生成技巧&#xff09; 如果你在Unity里做过UI&#xff0c;尤其是需要处理多语言、富文本或者复杂排版的游戏&#xff0c;那你一定对UGUI自带的Text组件又爱又恨。爱的是它简单直接&#xff0c;恨…...

高效特征工程:使用NumPy优化CCMusic音频处理流程

高效特征工程&#xff1a;使用NumPy优化CCMusic音频处理流程 1. 引言 音频数据处理在音乐信息检索领域一直是个计算密集型任务。特别是处理像CCMusic这样包含1700多首音乐片段的数据集时&#xff0c;传统的循环处理方法往往效率低下&#xff0c;耗时长且资源占用大。 今天我…...

Cosmos-Reason1-7B模型压缩与量化实战:在低显存GPU上的部署优化

Cosmos-Reason1-7B模型压缩与量化实战&#xff1a;在低显存GPU上的部署优化 最近在折腾大模型本地部署的朋友&#xff0c;估计都绕不开一个头疼的问题&#xff1a;显存不够用。动辄几十GB的模型&#xff0c;让很多消费级显卡望而却步。我手头正好有一块RTX 4060&#xff0c;8G…...

LabelMe批量格式转换工具:JSON到其他格式的高效处理

LabelMe批量格式转换工具&#xff1a;JSON到其他格式的高效处理 【免费下载链接】labelme Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). 项目地址: https://gitcode.com/gh_mirrors/lab/labelme …...

优化PDF文件大小:pypdf压缩图片与移除冗余内容的6个技巧

优化PDF文件大小&#xff1a;pypdf压缩图片与移除冗余内容的6个技巧 【免费下载链接】pypdf A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files 项目地址: https://gitcode.com/gh_mirrors/py/pypdf PDF文件…...