python生成器及关键字yield

Python生成器:理解yield关键字 生成器是一种迭代器,它可以通过yield关键字逐个生成值。与普通函数不同,生成器函数在每次调用时不会重新运行整个函数,而是从上次暂停的地方继续执行,直到遇到下一个yield语句。这种特性使得生成器非常适合处理大数据流或无限序列,因为它可以按需生成值,而无需一次性将所有值加载到内存中。生成器是 Python 中一种强大的工具,通过yield关键字,可以实现惰性计算和高效的内存管理。生成器适用于处理大数据流、无限序列和管道式数据处理。掌握生成器的使用方法和高级特性,可以帮助你编写出更高效、更简洁的代码。 阅读详情

生成器是什么

生成器继承于迭代器,故生成器有迭代器的特性,是一个可以通过循环获取数据的对象

但生成器保存的是生成数据的算法,不保存数据,迭代器是一组数据。

python已有的列表生成器 list(range(1,11))无法解决内存限制的问题,所有产生的数据都在内存里,如果数据很大就会有内存溢出的问题

生成器是保存了生成数据的算法,不保存数据,同时也会保存游标的位置,记录当前取到哪个数据,下次继续从游标位置获取新数据

可以通过next()方法,一直通过生成器生成新数据,而不占用内存

生成器用到的关键字yield


yield用于给生成器函数返回数据,遇到yield后,函数暂停执行,将yield的值返回给调用方,下一次遇到next()时,再继续接着上一次执行的位置继续执行

def testfib():
    a = 0
    b = 1
    while True:
        yield b
print('b={}'.format(b))
        a,b = b,a+b
    return "done"
if __name__ == '__main__':
    a = testfib()
    print(next(a))
    print(next(a))
    print(next(a))
----------------
结果
1
b=1
1
b=1
2

testfib生成器保存了生成斐波那契数列数据的算法,
a= testfib() 定义了生成器a对象

main方法中调用了3次next(a),第一次next(a),程序返回b的值1,并暂停执行
第二次next(a),继续接着上一次的游标位置执行,先打印b=1,接着a,b= 1,1,下一次循环,遇到yield,返回当前b的值1
第三次next(a),继续接着上一次的游标位置执行,先打印b=1,接着a,b= 1,2,下一次循环,遇到yield,返回当前b的值2

* print(a)会打印<generator object testfib at 0x0000000002341DE0>,而不会打印done
只要在函数中有yield关键字,那么当前这个函数是属于生成器中保存的算法,算法实现的功能就是生成b


【说明】
遇到yield后,函数暂停执行,有一个例外:当直接把生成器转化为list、元祖时,会一直持续执行yield下面的语句,并不断产生数据

def testfib(num):
    a = 0
    b = 1
    n = 0
    while n<num:
        yield b
        a,b = b,a+b
        n +=1
    return "done"
if __name__ == '__main__':
    print(list(testfib(10)))
-------------
结果 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]


main函数中直接将生成器转化为list,那么遇到yield,将数据返回后,也会继续执行下面的内容

 但是,如果生成器中循环没有结束条件,是while True ,那么使用(list(testfib(10))会无限循环打印列表数据,进入死循环


生成器用到的函数

  • next({generate})利用next让生成器 产生一个数据
  • {generate}.colse()遇到close,生成器终止产生数据,close后再次使用next()获取数据,会报错StopIteration
  • {generate}.seed(param) seed同next一样,也会让生成器 产生一个数据,不同的是,通过seed可以传递参数给生成器,且使用seed前需要先使用next 启动生成器
def testfib():
    a = 0
    b = 1
    n = 0
    num = yield
    while n< num:
        yield b
        print('n={}'.format(n))
        a,b = b,a+b
        n+=1
    return "done"
if __name__ == '__main__':
    a = testfib()
    next(a)
    print(a.send(3))
    print(a.send(3))
    print(a.send(3))
    print(a.send(3))
----------
返回:
1
n=0
1
n=1
2
n=2
Traceback (most recent call last):
  File "D:/python-workspace/pythontest/base/test1.py", line 983, in <module>
    print(a.send(3))
StopIteration: done


举例中通过seed传递参数3给生成器,生成器中判断当n<3时,允许产生数据
1.首先在seed传参前,调用next(a)启动生成器,代码执行到生成器的 num = yield这暂停,yield后没有跟数据,故本次next()不会产生数据
2.首次用a.seed(3)让生成器产生数据,程序接着num =yield执行,num被赋值为3,函数继续向下执行,n=0,n<num,yield 返回b
3.继续使用a.seed(3)再次成功产生2个数据,此时n=2
4.第4次使用a.seed(3)让生成器产生数据,接着上面一步继续执行,打印完n=2后,a,b进行复制,n+1,n=3,再去判断n<num不满足,终止生成数据,报错StopIteration

使用seed传参时,生成器及调用方有固定写法

def generator():
n= yield
while True:
{code with n}#这里是用到seed传递的n的代码
{code with return num}#这里是生成数据算法的部分,改变每次生成数据的值 如num= random()
yield num
return
if __name__ == '__main__':
#调用时先定义生成器对象
obj= generator()
next(obj)#启动生成器
a=obj.seed(5)#传递参数给生成器

Python生成器(Generator)与yield关键字:惰性计算的魅力 生成器是Python中一种特殊的迭代器,通过yield关键字实现惰性计算,能够显著提高内存效率和处理大数据集的能力。生成器函数在调用时不会立即执行,而是返回一个生成器对象,只有在迭代时才会逐步产生值。生成器的核心特点包括内存高效、惰性求值、状态保持和无限序列表示。与普通函数相比,生成器函数返回生成器对象,惰性执行,内存占用极低,适用于大数据集或无限序列。生成器表达式是创建生成器的简洁方式,语法类似列表推导式,但使用圆括号。生成器支持send()方法进行双向通信,yield from语法用于简化嵌套生成器的代 阅读详情

相关推荐

画了多年板子才搞懂:Allegro内电层负片连接,Thermal Relief和Anti-Pad避坑全解析

本文深入解析Allegro内电层设计中Thermal Relief与Anti-Pad的关键技术要点,帮助工程师避免常见设计陷阱。通过六层板实战案例,详细阐述负片连接逻辑、热风焊盘参数设计及隔离盘优化策略,提升PCB设计的可靠性与EMI性能。

weixin_28731223的博客 265

python generator(生成器)类型初探

python generator(生成器)类型初探

sl530311的博客 7439

C# 实现文件和字符串的AES加密解密

C# 实现文件和字符串的AES128加密解密

m0_72044573的博客 5935

在 Python 中检查生成器是否为空

在此代码段中,检查 Path 对象以确保它是一个目录或一个具有布尔值作为返回值的文件。在这个片段中,空生成器由一个耗尽的迭代器和一个对象的用法表示。两个函数工作时的返回值都是布尔值。路径或文件也可以命名为零字节文件,并且可以是没有内容或数据的不同类型。这样做之后,我们必须定义非空文件或空文件可以指向空文件的变量。请记住,包含没有数据的元数据的文件不属于空文件的范畴。它们的实现将返回 True 或 False 的输出,将目录或文件显示为对象。在空生成器的情况下,条件满足,并且实现返回一个空生成器作为其输出。

迹忆客 989

局部,全局(外部),static等变量详解

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。 变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block sc...

归根结底不优秀的博客 1322

5G R18标准:AI/ML如何重塑空口优化与网络架构

人工智能与机器学习正逐步成为通信网络优化的核心技术。其核心原理在于通过数据驱动模型,从海量网络数据中学习信道变化、用户行为等统计规律,替代传统的基于固定规则的优化方法。这一技术范式能显著提升网络性能与效率,尤其在空口资源管理、干扰协调和能耗控制等场景中价值突出。在5G Advanced(R18)标准化框架下,AI/ML被系统性地引入空口设计,聚焦于信道状态信息反馈增强、波束管理与预测等关键用例。通过定义网络侧AI、终端侧AI及联合学习的标准化接口与流程,R18旨在实现跨厂商设备的智能协同,推动无线网络向自适

weixin_35671843的博客 244

python基础 — 可迭代对象,迭代器和生成器

2. `send(value)`:除了具有 `next()` 方法的功能外,还可以向生成器函数发送一个值,并将该值作为当前 `yield` 表达式的结果,并使生成器函数从上次暂停的地方继续执行。生成器使用yield语句来定义,当调用生成器函数时,它会返回一个迭代器对象,通过迭代器可以逐步获取生成的值。在上述示例中,可迭代对象 my_list的__iter__()方法返回了一个迭代器对象,而迭代器对象的__next__()方法逐个取出可迭代对象中的元素,知道元素取完会抛出StopIteration异常。

个人博客 3225

VsCode安装和配置c/c++环境(超完整,小白专用)

1. vsCode配置C/C++环境 1. vsCode下载和安装 1. 下载Microsoft vsCode [vsCode在这里插入图片描述官网下载: https://code.visualstudio.com/ 2. 安装vsCode 3. 下载中文插件 我这边已经下载过,刚卸载但是没有重启编译器,所以界面显示了中文 2. MinGW编译器下载和配置 1. 下载MinGW 在线安装——下载MinGW-W64-install.exe(速度慢) 下载压缩包——×86_64-posix-

黄化的多多 60万+

python核心--生成器

生成器 1.啥是生成器 生成器也是一种迭代器,但是它有迭代器的其他功能。那它有什么特殊的功能呢?我们不妨举个例子。 如果我们要产生一个很大的列表,但是又不全拿出来,这时候列表所有数据都在内存中,大量数据的话将会非常耗内存。这时候如果列表元素按照某种算法推算出来,我们需要时,就提出来,这样就会省去大量的空间。 2.咋判断它是生成器 判断生成器,也就是看生成器的标志:yield 。 有了它就...

qq_41962204的博客 282

【ComfyUI】【Nunchaku】【diffusers报错解决】秋叶整合包安装 Nunchaku 报错的解决方法

最近在折腾 AI 绘图时,我尝试在秋叶的 ComfyUI 整合包中安装 `ComfyUI-nunchaku` 插件(版本 0.3.3),结果启动后直接报错,提示无法从 `accelerate.utils.memory` 中导入 `clear_device_cache`,让我一度怀疑插件是否兼容。查阅了一堆 issue 和源码之后,总算找到了原因和解决方法。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1856

Vivado报错-4 [Routed 35-3424] SLL Assignment failed ILP VU19P

Vivado报错[Routed 35-3424] SLL Assignment failed ILP VU19P

weixin_39896700的博客 1409

Python学习 之 迭代器和生成器

1. 迭代器 2. 生成器 3. 推导式

yang_kaiyue的博客 395

CAD二次开发c# .net加载cui\cuix菜单文件

public static void LoadMyCui(string cuiFile) { Document doc = Application.DocumentManager.MdiActiveDocument; object oldCmdEcho = Application.GetSystemVariable("CMDECHO"); object oldFileDia = Application.GetSys..

2127

Python 关键字yield:生成器的魔法

生成器是一种特殊的迭代器,它可以在需要的时候生成值,而不是一次性生成所有的值并存储在内存中。这使得生成器在处理大量数据时非常高效,因为它只在需要的时候生成值,避免了内存的过度占用。yield关键字是 Python 中一个非常强大的工具,它为我们带来了生成器的概念,使得我们能够以一种高效且灵活的方式处理大量数据。通过理解yield的用法和关键要点,我们可以在实际编程中充分发挥生成器的优势,提高程序的性能和可维护性。

liuhailong0511的博客 1416

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python生成器实现及yield关键字

Python生成器实现及yield关键字 我在另一篇文章中介绍了Python迭代器,https://blog.youkuaiyun.com/weixin_43790276/article/details/90346387 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。也就是说在迭代的时候生成数据,边迭代边生成。 但是,我们在实现一个迭代器时,关于当前迭代到的状态...

weixin_43790276的博客 929

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Python Generators(生成器)——yield关键字

PythonGenerators(生成器) 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。 生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。 生成器的特点: 生成器是一个函数,而且函数的参数都会保留。

小小程序员的世界 4万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[Python]生成器和yield关键字

概述:​ 它指的是 generator, 类似于以前学过的: 列表推导式, 集合推导式, 字典推导式…作用:​ 降低资源消耗, 快速(批量)生成数据.实现方式:​ 1.推导式写法.​ 2.yield写法.yield i # yield会记录每个生成的数据, 然后逐个的放到生成器对象中, 最终返回生成器对象.问题: 如何从生成器对象中获取数据?​ 答案:​ 1.for循环遍历​ 2.next()函数, 逐个获取.

weixin_57336987的博客 662

python之生成器与yield关键字

python生成器与yield关键字

missasd1的博客 448

python生成器yield原理_生成器yield关键字详解

鉴于yield关键字的原理大家理解的都不是很深刻,今天我们主要就这一课题进行探讨。生成器可以用什么方式得到?方法一:利用推导式的方式得到生成器#列表推导式list1=[iforiinrange(9)]print(list1)#得到生成器generator=(iforiinrange(9))print(generator)执行结果:[0,1,2,3,4,5,6...

weixin_39842029的博客 355

python生成器——yield关键字的用法

python生成器

weixin_51409218的博客 668

python生成器——yield关键字

关于生成器yield关键字 带有 yield 的函数在 Python 中被称之为 generator(生成器) 那么什么是生成器呢? 看看下面这个例子: def fab(max): n, a, b = 0, 0, 1 L = [] while n &amp;amp;lt; max: L.append(b) a, b = b, a + b ...

ykersimple的博客 813

【python】关键字yield——生成器

Python 的关键字 yield 有哪些用法和用途? yield 的用法有以下四种常见的情况: 一个是生成器, 二是用于定义上下文管理器, 三是协程, 四是配合 from 形成 yield from 用于消费子生成器并传递消息。 这四种用法,其实都源于 yield 所具有的暂停的特性,也就说程序在运行到 yield 所在的位置 result = yield expr 时,先执行 yield expr 将产生的值返回给调用生成器的 caller,然后暂停,等待 caller 再次激...

weixin_44412076的博客 513

Python 生成器(Generator)与 yield 关键字的用法

生成器是一种特殊的迭代器,它通过yield关键字来返回值,并且能够在每次调用时记住上一次的状态。与普通函数不同的是,生成器不会立即执行代码块中的所有操作,而是会在遇到yield语句时暂停执行并返回值,然后在下一次调用时从暂停的地方继续执行。生成器的主要优点在于其延迟计算特性,这意味着它们只在需要时才生成数据,从而节省了内存资源。这对于处理大数据集或无限序列非常有用。生成器和yield是 Python 中一个强大且灵活的功能,特别适用于处理大规模数据或需要延迟计算的场景。

2501_91228841的博客 479

python 生成器函数 yield关键字

python生成器,yield关键字小结,自用笔记

superDE009的博客 616

yield python_Python Yield关键字创建生成器

yield pythonPython provides different features some of them do not exists in other programming languages. In this tutorial we will look one of them. yieldkeyword is used with generators. Generators a...

cunjiu9486的博客 157
上一篇: python——多继承下的调用优先级
下一篇: 接口自动化测试用例层对接口参数的传递(二)
日日记
博客等级 码龄11年 43粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值