用简单实例解释说明 yield 的执行方式

【Python】一篇文章读懂yield基本用法 一个例子搞定 yield 机制 阅读详情

一. yield 的基本概念

1. yield 的作用是将函数变成生成器函数,即含 yield 的函数返回的是一个生成器对象 generator

# 普通函数
def func_1():
    return 1

# 含 yield 的生成器函数
def func_2():
    yield 1

print(type(func_1()))  # 返回相应的数据对象 <class 'int'>
print(type(func_2()))  # 返回生成器对象     <class 'generator'>

2. 调用生成器函数时,生成器函数不会完整执行整个函数的代码;当执行到 yield 代码处时,返回迭代值后,中断运行

3. 当生成器函数被下次迭代调用时,将从上次执行到的 yield 代码的下一句代码开始执行;这时生成器函数的本地变量保持跟上次中断执行时的状态完全一样

4. 因此,生成器函数的执行方式是中断式的处理方式,在调用和被调用的函数代码间,交叉执行; 生成器函数当次调用的后续代码,需要等下次调用时,才会继续执行;或当调用完全结束时,再由系统自动执行

二. 生成器函数运行方式的实例设计

本实例代码,设计如下:

1. 设计了2个生成器函数 a1(), a2(), 一个主调函数 test()

2. a1() 生成器函数中,设置了2处 yield 代码;

3. a2() 生成器函数中调用了 a1(); 

4. main()调用 a2()

代码如下。大家在运行代码前,可根据自己对 yield 代码运行方式的理解,自行分析并手写一下运行结果,看是否跟实际结果一致。

def a1():
    i = 0
    while i<=1:
        print('a1:i =', i)
        yield i
        print('a1:i =', i, "继续")
        i += 1

    j = 0
    while j<=1:
        print('a1:j =', j)
        yield j
        print('a1:j =', j, "继续")
        j += 1


def a2():
    for x in a1():
        print("a2:x =", x)
        yield x
        print("a2:x =", x, "继续")


def main():
    for y in a2():
        print("main:y =", y)
        print("")
        
    print("--------------------")


if __name__ == "__main__":
    main()

结果如何,不用急着运行看答案,自己能理解分析透彻,是最重要的。

... ...

三. 生成器函数实例运行结果说明

执行结果结果说明
a1:i = 0
a2:x = 0
main:y = 0
 

第1轮迭代:

  • main() 调用 a2()  
  • a2() 调用 a1()
  • a1() 中,此时 i=0, 打印输出 “a1:i=0”;运行 yield i 后, 运行中断
  • 返回 a2(), 此时 x等于返回值0,打印输出 “a2:x=0”,运行 yield x 后,运行中断
  • 返回main(), 此时 y 等于返回值0,打印输出 “main:y=0”,
  • main()继续运行,打印一个空行后,开始进行下一轮迭代

a2:x = 0 继续
a1:i = 0 继续
a1:i = 1
a2:x = 1
main:y = 1

第2轮迭代:

  • main() 调用 a2()
  • a2() 从上次中断处继续运行,此时a2()的本地变量 x 保持为0,打印输出 “a2:x=0 继续”
  • a2() 调用 a1()
  • a1() 从上次中断处继续运行,此时a1()的本地变量 i 保持为0,打印输出 “a1:i=0 继续”
  • a1() 继续运行,i += 1, 满足条件,继续循环运行,打印输出 “a1:i=1”; 运行 yield i 后,运行中断
  • 返回a2(), 此时 x等于返回值1,打印输出 “a2:x=1”, 运行 yield x 后,运行中断
  • 返回main(), 此时 y 等于返回值1,打印输出 “main:y=1”
  • main()继续运行,打印一个空行后,开始进行下一轮迭代

a2:x = 1 继续
a1:i = 1 继续
a1:j = 0
a2:x = 0
main:y = 0

第3轮迭代:

  • main() 调用 a2()
  • a2() 从上次中断处继续运行,此时a2()的本地变量 x 保持为1,打印输出 “a2:x=1 继续”
  • a2() 调用 a1()
  • a1() 从上次中断处继续运行,此时a1()的本地变量 i 保持为1,打印输出 “a1:i=1 继续”
  • a1() 继续运行,i += 1, 不满足条件,停止 i 的循环运行,继续后面的处理;
  • a1() 中此时 j=0, 打印输出 “a1:j=0”;运行 yield j 后, 运行中断
  • 返回 a2(), 此时 x等于返回值0,打印输出 “a2:x=0”,运行 yield x 后,运行中断
  • 返回main(), 此时 y 等于返回值0,打印输出 “main:y=0”,
  • main()继续运行,打印一个空行后,开始进行下一轮迭代

a2:x = 0 继续
a1:j = 0 继续
a1:j = 1
a2:x = 1
main:y = 1

第4轮迭代:

  • main() 调用 a2()
  • a2() 从上次中断处继续运行,此时a2()的本地变量 x 保持为0,打印输出 “a2:x=0 继续”
  • a2() 调用 a1()
  • a1() 从上次中断处继续运行,此时a1()的本地变量 j 保持为0,打印输出 “a1:j=0 继续”
  • a1() 继续运行,j += 1, 满足条件,继续循环运行,打印输出 “a1:j=1”; 运行 yield j 后,运行中断
  • 返回a2(), 此时 x等于返回值1,打印输出 “a2:x=1”, 运行 yield x 后,运行中断
  • 返回main(), 此时 y 等于返回值1,打印输出 “main:y=1”
  • main()继续运行,打印一个空行后,开始进行下一轮迭代

a2:x = 1 继续
a1:j = 1 继续

--------------------

迭代结束:

  • main()调用 a2()
  • a2() 从上次中断处继续运行,此时a2()的本地变量 x 保持为1,打印输出 “a2:x=1 继续”
  • a2() 调用 a1()
  • a1() 从上次中断处继续运行,此时a1()的本地变量 j 保持为1,打印输出 “a1:j=1 继续”
  • a1() 继续运行,j += 1, 不满足条件,停止 j 的循环运行,迭代结束
  • 返回 a2() , 终止迭代,迭代结束
  • 返回 main(),终止迭代, 结束循环处理
  • main()打印终止提示符“--------------------”
  • main() 运行结束

Python: 用简单的代码解释yield的用法 最近看到好几篇关于关键字yield的文章,一说与stack pop相近,一说与return相近?Generator? 搞得一团糟糟的… 直接上官网查找下相关资料,搜索结果: Python yield官方网站搜索 PEP 342 – Coroutines via Enhanced Generators PEP 255 – Simple Generators PEP 380 – Syntax for... 阅读详情

相关推荐

C# yield return 的作用简单说明

好久没写C# 今天心血来潮突然看了下C#的代码 看到了一个yield 想知道这个是什么用途的情况下才有了这篇文章 百度了一下这个东西出来代码都是写了一堆的东西,看着太累人了去官网看了下大致知道这个是什么用的了 下面就非常简单的说下作用直接给代码加备注 using System; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string..

ManGo丨XYZ 639

关于yield()方法详解

线程状态处于BLOCKED或WAITING或TIME_WAITING这三种统称为堵塞状态。作用:提出释放CPU时间片的请求。不会释放锁,线程依然处于RUNNABLE状态。方法调用后线程只是暂时的将调度权让给别人,但立刻可以回到竞争线程锁的状态;由于这个特性,一般编程中用不到此方法,但在很多并发工具包中,,我在这篇文章里有详细解析和代码示例,这里不在赘述。状态时,线程就保留了随时被调度的权利。状态,线程不会进入堵塞状态。方法调用后线程处于阻塞状态。关于线程状态,详见文章。方法后,线程依然处于。

weixin_68009402的博客 1137

Discrete Optimization (Coursera) 学习笔记 Week 1 introduction (开个帖子)

Week 1 Introduction 这位教授Pascal Van Hentenryck 真的算是优化领域神级别的人物了吧?截一张Google scholar的图大家感受一下… 居然在Coursera上看到了他开的课:Discrete Optimization。试听了几节后,发现讲得很有激情,而且深入浅出。遂决定花暑假跟完这一门课。 这门课每周花两三个小时介绍基础概念,然后得花十几个小时写作业(coding)… 一开始以为Coursera上的课的作业应该不会太难,然后第一次作业(knapsack)我就被

ZJ_11701的博客 656

深入理解多线程中的yield方法

例如,在一个生产者-消费者模型中,当生产者生产完数据后,可以调用yield方法暂停自己的执行,让消费者线程有机会执行。yield方法是多线程编程中的一项重要技术,通过使用yield方法,我们可以实现线程的协作执行和提高线程的响应性。换句话说,yield方法可以将线程的执行权交给其他线程,从而实现线程的切换和调度。因此,在使用yield方法时,需要仔细考虑线程之间的依赖关系,确保不会出现死锁的情况。使用yield方法时,应该兼顾线程的公平性,避免某个线程长时间占用CPU资源而导致其他线程无法得到执行的情况。

m0_74117571的博客 2551

瑞昱RTL8735B开发板深度评测:如何用200元板子搞定1080P视频流+AI推理?

本文深度评测瑞昱RTL8735B开发板(AMB82 MINI),解析其如何在200元预算内实现1080P视频流处理与边缘AI推理。该板搭载0.4TOPS NPU算力,支持H.264/H.265编码,适合物联网开发者构建高性价比边缘计算方案,并详细介绍了硬件架构、AI模型优化及实战项目搭建。

weixin_33712987的博客 522

模拟滤波器的基础知识和设计

使用Python实现多种模拟滤波器

faltas的博客 3530

Java基础之03 守护线程与yield 与其他方法 153

守护线程与yield public final void setDaemon(boolean on) 将此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。 public final boolean isDaemon() 测试这个线程是否是守护线程。 public static void yield() 暂停当前正在执行的线程对象,并执行其他线程。(...

C_time的博客 256

3分钟学会SQL中的断点去重技术,轻松搞定连续重复数据去重问题?

传感器采集的温度数据中,存在连续重复的值,需仅在数值变化时保留记录(例如:温度从 25°C 变为 26°C 时记录一次)。:判断逻辑,current_value!若当前温度与前一行的温度不同(或为第一条记录),则保留该行。的技术,常用于时间序列或状态日志中。:将连续相同值的记录合并,只保留断点处的记录。保留断点处的记录(即温度变化时的第一条)。原始数据表 sensor_data。最终仅保留值变化的断点记录。获取前一行的温度值。

石榴姐yyds 1019

yield的使用

通过使用 yield 定义迭代器,可在实现自定义集合类型的IEnumerable和IEnumerator模式时无需其他显式类(无需通过new List-再retuenIEnumerable) yield是一个语法糖 看msdn 的解释总是让人感觉生硬难懂。其实yield关键字很好理解。首先我们对于性质有个了解。yield是一个语法糖。既然yield是在C#中的一个语法糖,那么就说明y...

weixin_30696427的博客 257

45 - Android系统源码-crosvm 实战:基于 KVM 的 Rust 安全虚拟机监控器核心技术

摘要:crosvm 是 Google 开发的基于 KVM 的轻量级虚拟机监控器(VMM),采用 Rust 语言编写,专为 ChromeOS 和 Android 设计。其核心特点包括: 安全架构:通过 Rust 的内存安全特性和多进程隔离(每个设备运行在独立沙箱进程)大幅降低攻击面 性能优化:基于 KVM 的硬件虚拟化支持,结合异步 I/O (io_uring/epoll) 实现高效设备模拟 模块化设计:清晰的 trait 抽象层(Hypervisor/Vm/Vcpu)支持跨平台扩展 Android 集成

保持专注,保持热爱 226

openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用openclaw-cn的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

RIME中州韵输入法lua配置获取当前时间(二)

1.农历 Rime是一款可以高度自定义的输入法,前文讲述了time,date,week的定义方式 文章链接:RIME输入法获取当前时间(一)_惜洛-Jankin的博客-优快云博客 现介绍获取当前农历时间的配置,效果如下(我定义了lunar关键字): 实现如下: ①在用户文件夹中新建一个rime.lua文件加入如下代码 lunar_translator = require("lunar") ②在文件夹Lua中新建文件lunar.lua(此处的文件名必需与上文require中的内容相同).

惜洛-Jankin的博客 3139

论文深度解析:基于大语言模型的城市公园多维度感知解码与公平性提升

本文针对城市公园感知测量的精细化不足与公平性评估缺口,提出了一套融合社交媒体数据与大语言模型(LLM)的创新分析框架。通过领域适配微调开发的Park-Perception-LLM模型,实现了对感知可达性、可用性、吸引力三大核心维度83%-91%的高精度分类。将该感知指标创新性地融入增强两步浮动集水区法(E2SFCA),以香港高密度城市为案例,系统揭示了公园质量与数量的空间不平等及错配模式。借助多元回归模型,深入挖掘了公园内部特征、宏观建成环境、微观街道景观及时间因素对感知的影响机制。

May the Force be with you 1014

Python中yield的用法详解——最简单,最清晰的解释 | 生成器/面试必看(2026版)

首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的retur...

mieleizhi0522的博客 100万+

ThingsBoard移动应用详细讲解

ThingsBoard移动应用详细讲解

AldrichEugene 527

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

python中yield的用法详解——最简单,最清晰的解释+补充说明&傻傻的for循环

转自:https://blog.youkuaiyun.com/mieleizhi0522/article/details/82142856/ 补充说明在最后. (冯爽朗 2019-04-02 13:29:31 232342 已收藏 1023) 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。 接下来是正题: 首先,如果你...

ahmcwt的专栏 842

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python中yield的用法详解——最简单,最清晰的解释

from:https://blog.youkuaiyun.com/mieleizhi0522/article/details/82142856 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。 接下来是正题:...

夏天的风的专栏 704

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

python yield解释

python核心技术详解

weixin_45226922的博客 220

Python中的yield

它可以在函数内部暂停执行并返回一个值,但是保留了函数的状态,使得函数可以在后续调用时恢复执行,从上次暂停的地方继续执行。是一种方法,它允许在生成器函数内部抛出一个指定的异常,并使生成器处理该异常。这种方法可以用于在生成器的每次迭代中向其提供值,以及控制生成器的行为。方法,我们可以在生成器的每次迭代中向其提供值,并控制生成器的行为。方法,我们可以在生成器函数中抛出异常,并根据需要进行处理。在 Python 中有着不同的作用,尽管它们都可以用于函数中的值的返回,但它们之间有着关键的区别。在 Python 的。

xy_optics的博客 1833

SQL Server SOS_SCHEDULER_YIELD等待事件说明及案例分析

此外,一个常被忽略但需要调查的原因是服务器的电源管理功能。说明由于cpu存在压力,SOS_SCHEDULER_YIELD指标的信号等待达到总等待的99.99%原因,意味着有于sql os给每个线程4ms的运行时间片,导致线程频繁的自愿让出cpu资源,然后进入runnable队列,如此往复,造成恶性循环。因此,当高 SOS_SCHEDULER_YIELD 等待类型值出现时,应该根据如下三种不同的场景去排查,主要取决于 SOS_SCHEDULER_YIELD 是否频繁出现,以及它是否伴随较高的信号等待时间。

weixin_43230594的博客 1521

python中yield的用法详解——最简单,最清晰的解释(转载)

本文转载自:https://blog.youkuaiyun.com/mieleizhi0522/article/details/82142856 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个ret

ZHH的博客 226

yield的最简单解释 :yield就是可以用多次的return——每日10行代码22

经常看别人的代码里有yield 子句,不知道是什么意思,今天花功夫了解了下,总结起来就是:yield就是可以用多次的return。 为什么会有yield? yield是为了能够返回多个数据,可能有人会问,我返回多个数据用数组不就可以了吗? 是的,但是假如我要返回的数据有上1亿个,上百亿个呢?要知道数组是放在内存里的,在内存里放百亿个数据,内存不马上就被占满了?所以这时就有了yield。yield的功能就是把所有要返回的数据依次返回。这样就不会占多的内存了。 先看代码: def foo(): yiel

天天卡丁的博客 1129

Java线程中yield()使用方法简介说明

Java线程中yield()使用方法简介说明

qq_25073223的博客 1555
上一篇: 用Keras实现图片风格迁移的算法详解
下一篇: python 虚拟环境的原理分析
快乐清风客
博客等级 码龄19年 191粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值