用yield关键字创建生成器

Python中如何用yield生成斐波那契数列? 在这个函数中,我们使用了 while 循环来实现无限长的序列,并且在 yield 语句中返回当前的斐波那契数。在每次迭代过程中,我们使用 a 和 b 来更新斐波那契数列,并且使用 yield 语句返回当前的斐波那契数。斐波那契数列是数学上一个经典的问题,指的是第n个数是由前两个数相加得到的,即f(n) = f(n-1) + f(n-2),其中f(0) = 0,f(1) = 1。其中最简单的是使用yield。对于斐波那契数列,我们可以使用yield语句来生成一个无限长的序列,每次调用时返回下一个斐波那契数。 阅读详情

Python使用 生成器(generator) 对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

  • 什么是生成器?

生成器其实是一种特殊的迭代器(iterator),但是不需要像迭代器一样自己去实现__iter__()和__next__()方法,简单的说生成器是通过一个或多个yield表达式构成的函数,如果一个函数包含yield关键字,这个函数就会变为一个生成器。生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。

由于 生成器(generator) 自动实现了迭代器协议,而迭代器协议对很多人来说,也是一个较为抽象的概念。所以,为了更好的理解生成器,我们需要简单的梳理一下迭代器协议的概念。

迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。

可迭代对象就是:实现了迭代器协议的对象。

协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具 (如for循环,sum,min,max函数等) 使用迭代器协议访问对象。

  • 两种不同的方式提供创建生成器
    • **生成器函数:**使用yield关键字语句定义的常规函数就被认为是一个生成器,但而不是return语句返回结果。因为其中的区别是yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。而return语句一旦退出就真的退出函数体了。
    • **生成器表达式:**类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

我们主要说的就是如何使用yeild关键字创建的生成器。如下例子是一个关于计算斐波那契数列的生成器。其中 fibonacci 函数中我们没有用 return 关键字。你也可以看到当运行 fib = fibonacci(20) 的时候,我们打印出它的类型信息显示它返回的是一个生成器对象。如果你直接调用这个(生成器的)实例对象fib,并不会运行 fibonacci 函数中的代码。前面我们提到过,因为生成器其实是一种特殊的迭代器(iterator),所以我们可以看到在代码最后部分只有当循环调用 next() 的时候才会真正运行其中的代码。而且用这种方式,我们可以不用担心它会使用大量的内存资源。

def fibonacci(n):
    x, y = 0, 1
    for _ in range(n):
        yield x
        x, y = y, x + y

fib = fibonacci(20)
print(type(fib))
# 输出如下:
# <class 'generator'>

for _ in fib:
    print(next(fib))
# 输出如下:
# 1
# 2
# 5
# 13
# 34
# 89
# 233
# 610
# 1597
# 4181

相反,如果不用生成器,我们用常规函数定义的话就会像下面这样写。如果我们传入的参数n值增大,返回的列表占用的空间将会显著提升,这显然是我们不希望看到的。

def fibonacci(n): 
   i, a, b = 1, 0, 1 
   L = [] 
   while i < n: 
       L.append(b) 
       a, b = b, a + b 
       i = i + 1 
   return L

fib = fibonacci(20)
print(type(fib))

for f in fib:
    print(f)
  • 判断函数是否是生成器

我们可以用inspect类里的isgeneratorfunction类方法判断是否是一个生成器函数,以及使用 isgenerator类方法判断是否是一个生成器。

from inspect import isgeneratorfunction, isgenerator

print(f'fibonacci is a generator function: {isgeneratorfunction(fibonacci)}')
print(f'f is a generator: {isgenerator(f)}')

# 输出如下:
# fibonacci is a generator function: True
# f is a generator: True
  • 应用生成器的场景与好处
    • 生成器可用于产生数据流,而且并不立刻产生返回值,而是等到被需要的时候才会产生返回值,相当于一个主动拉取的过程(pull),比如现在有一个日志文件,每行产生一条记录,对于每一条记录,不同部门的人可能处理方式不同,但是我们可以提供一个公用的、按需生成的数据流。
    • 还有做爬虫的时候,爬取大量数据的时候如果使用生成器每次需要的时候执行输出也可以大大降低资源的消耗。

使用生成器的好处当然不仅限于此,让我们来看一下下面的例子,我们打算读取小说《三国演义》的所有文字内容,如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。而且同时通过 yield来执行每次输出,就可以轻松实现文件读取。

from pathlib import Path

file = Path('三国演义.txt')

def read_file(fpath): 
   BLOCK_SIZE = 1024 
   with file.open(encoding='GB18030') as f: 
       while True: 
           block_content = f.read(BLOCK_SIZE) 
           if block_content: 
               yield block_content 
           else: 
               return
            
for c in read_file(file):
    print(c)
生成关键字图片墙 * 初始化图片; * 遍历关键词; * 如果可以横放或者竖放,就把关键词放入图片,然后在矩阵上标注画过的部分; * 最后把图片输出出来。 立即下载

相关推荐

关键字生成工具 组合排列

关键字生成工具 关键字 生成 组合工具 组合排列

python利用yield关键字实现斐波那契数列

斐波那契数列(Fibonacci): F(1) = 1 F(2) = 1 F(3) = 2 ...... F(n)= F(n-1) + F(n-2) python生成器可以控制循环的迭代行为,即控制循环的方式,每次只输出一个值,在很大的程度上节约了大量的空间 代码如下: # 斐波那契数列 def Fibonacci(): n, a, b = 0, 0, 1 n...

zswdhy的博客 1345

Cherry Studio部署MCP服务报错全记录:从零解决‘Connection closed‘问题

本文详细记录了在Cherry Studio中部署MCP服务时遇到‘Connection closed’报错的完整排查与解决过程。文章从环境依赖(UV、Bun)的安装验证、绝对路径配置、网络镜像源设置,到服务端手动调试与Cherry Studio配置检查,提供了一套系统性的解决方案,帮助开发者彻底解决此类连接问题。

g9h0i1的博客 761

使用Python的yield关键字生成斐波那契数列及其原理

代码如下: def fab(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 print("print(fab(5)):",fab(5)) for n in fab(5): print(n) yield存在于函数中,就将函数变成了一个generator(生成器),调用fab(5) 并不会直接运行 fab 函数,返回的是一个可迭代对象(如实验结果),每次迭.

luoluo3664的博客 804

【鸿蒙南向开发】OpenHarmony——分布式数据对象之功能实践

通过本文的学习可了解到分布式数据对象的主要接口、大致调用方法和功能实现等。结合对应内容,可以进一步对分布式数据对象同步机制做深度学习。下一步,(1) 着重理解同步组网的构建原理。(2) 着重理解同步组网内,监听change和status变化的实现。●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。

HarmonyOS_666的博客 1089

从OAuth到DID:Web4.0身份验证协议的技术演进图谱

在数字身份体系从Web2.0向Web4.0跨越的进程中,身份验证协议正经历着从中心化授权到自主主权的范式转移。本文通过对比OAuth 2.0、OpenID Connect等传统方案与W3C DID、ION等去中心化协议的技术架构,揭示身份验证技术在性能、安全、隐私三大维度的代际差异。基于对GitHub、欧盟数字身份钱包等典型系统的实测数据分析,量化评估中心化授权服务器的单点故障风险与DID链上验证的吞吐量瓶颈。结合零知识证明、分布式密钥管理等前沿技术,为开发者提供面向Web4.0的渐进式身份架构迁移策略。

水务人 833

python3 生成器 yield的使用以及实现斐波那契数列

‘’‘用生成器实现斐波那契数列’’’ ‘’‘如果一个函数里面出现yield就表示这是生成器’’’ ‘’‘yield特点:程序在执行的时候遇到yield会暂停执行,如果yield后面有返回值, 先返回值再暂停,再次启动生成器获取数据的时候会从暂停的地方开始执行’’’ ‘’‘return只返回一次值,后面的代码不执行 yield可以多次返回值’’’ def fibo(num): a=0 b=0 cur...

weixin_44737399的博客 742

软件自动化测试脚本如何编写,编写自动化测试脚本的几点注意事项

我们需要自动化测试脚本的原因:1、验收测试是一项非常复杂和费力的被用来确保软件质量的环节。它的目的就是使软件能得到充分运行并且能使其符合原始需求。2、测试的目的无非就是满足了两个结果:测试通过或测试不通过。为了能实现每个测试结果,必须要明确每个测试用例。并且对于整个系统而言在合同中必须定义测试用例的失败标准,而且这个失败标准数必须是可接受的。3、测试用例的通过条件必须有一个清晰的标准,标准可以被定...

weixin_39575775的博客 2251

Python生成器、实现斐波那契数列

Python生成器、实现斐波那契数列 """ 生成器 按照一定规则不断产生新元素的对象 无法直接输出生成器里面的内容 生成器保存的是数据的算法/规则,每一次调用产生一个 生成器创建使用yield关键字 函数可以有返回值,返回值返回给调用者 yield 跟return功能类似, return直接返回直观结果 ...

dushine2008的博客 3041

别再卡在Google验证了!用Header Editor插件5分钟搞定TryHackMe注册(附最新.json规则)

本文提供了使用Header Editor插件快速解决TryHackMe注册时Google验证失败问题的详细指南。通过导入特定的JSON规则文件,用户可以轻松绕过网络限制,5分钟内完成账号注册,无需复杂设置。文章包含完整的配置步骤、常见问题解决方案以及安全使用建议。

weixin_30736301的博客 462

麒麟操作系统提示“默认密钥环已上锁”的解决办法

麒麟操作系统提示“默认密钥环已上锁”的解决办法

太极淘的博客 1万+

python:yield关键字,创建一个生成器

def fun(): while True: print("before") yield 4 print("after") # 函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象) g = fun() # 到调用next方法,foo函数正式开始执行 print("..............first") print(next(g)) # 程序执行到yield关键字,return了一个4之后,程序停止

kakazai.cn 287

PoP(Package on Package)封装技术探讨

PoP(Package on Package)封装技术摘要 PoP是一种3D封装技术,通过垂直堆叠已完成封装的器件(如SoC+DRAM)实现高密度集成,典型应用于智能手机等空间受限场景。其核心优势包括:节省主板面积(垂直堆叠)、优化高速信号完整性(短互连路径)、提升供应链灵活性(独立测试与选型)。PoP结构分为底封装(通常为Flip-Chip BGA的SoC)和顶封装(如FBGA存储芯片),通过焊球阵列互连,一次回流焊完成组装。

sinat_15150363的博客 366

Python中的生成器的创建方法 (生成式改写 + yield关键字)

在Python中,一边循环一边计算的机制,称为生成器:Generator 1. 生成器的应用 性能限制时需要用到,比如在读取一个10G的文件时,如果一次性将10G的文件加载到内存处理的话(read方法),内存肯定会溢出;但使用生成器把读写交叉进行,如使用(readline和readlines)就可以在循环读取的同时不断处理,这样就可以节省大量的内存空间。 如:使用列表生成式时,会将打印好的内容一次性全部输出,如果我们写成range(10000000)等待时间就会很长,此处也能验证什么时候需要生成器?这一点

ly_qiu的博客 704

Android SystemUI——车载CarSystemUI加载(八)

车载 CarSystemUI 是指专门为汽车环境设计的用户界面和用户体验(UI/UX),它通常与 Android Automotive OS 或其他嵌入式操作系统一起工作,为驾驶者和乘客提供安全、直观且高效的交互方式。Android Automotive OS 是 Google 专门为汽车开发的操作系统版本,它基于 Android 平台,并针对车辆内部的使用进行了优化。

小旭的专栏 2172

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Python进阶 - 生成器的基本概念 用yield关键字创建迭代器

🌟 Python生成器(Generator)摘要 生成器是Python中高效处理大数据流的核心工具。通过yield关键字,生成器实现了惰性求值和按需计算,相比传统列表具有显著优势: 1️⃣ 内存效率:生成器对象仅占用112字节左右,而同等规模的列表可能消耗数十MB内存 2️⃣ 工作原理:生成器函数执行到yield时会暂停并保留状态,下次调用时继续执行 3️⃣ 核心特性: 可表示无限序列(如斐波那契数列) 支持send()和throw()方法进行交互式控制 4️⃣ 典型应用场景: 大文件逐行处理(避免内存溢

千淘万漉虽辛苦,吹尽狂沙始到金 7643

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

生成器yield关键字

yield是一个类似return的关键字,只是这个函数返回的是个生成器 当你调用这个函数时,函数内部代码并不立即执行,这个函数只是返回一个生成器对象。 当你使用for迭代时,函数中的代码才会执行。 #使用yield方式创建一个生成器 def createGenerator(): for i in range(10): yield i**2 pass m...

青玄的博客 388

python中yield关键字方法详解

yield 就是保存当前程序执行状态。你用 for 循环的时候,每次取一个元素的时候就会计算一次。用 yield 的函数 叫 generator,和 iterator 一样,它的好处是不用一次计算所有元素,而是用一次算一次,可以节省很多空间。generator 每次计算需要上一次计算结果,所以用 yield,否则一 return,上次计算结果就没了。 yield可以简单理解为return操作,但和return又有很大的区别,执行完return,当前函数就终止了,函数内部的所...

IT之一小佬的博客 2万+

如何理解Python关键字yield

语句中的对象都可以叫做可迭代对象,例如:lists,strings,files等等。这些可迭代对象使用非常方便因为它能如你所愿的尽可能读取其中的元素,但是你不得不把所有的值存储在内存中,当它有大量元素的时候这并不一定总是你想要的。可迭代对象是任何你可以从其得到一个迭代器对象的任意对象(译注:调用内建函数iter()),迭代器是能让你在可迭代对象上进行迭代的对象(译注:这里好绕,迭代器实现了。方法的类都是可迭代对象,此外,可迭代对象还可以用在zip,map等函数中,当一个可迭代对象作为参数传递给内建函数。

mohen_777的博客 2093

Python yield

生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器。 如果一个函数包含yield关键字,这个函数就会变为一个生成器。 操作:#用yield来创建生成器def func(): forainrange(5); yielda# 用列表来创建生成器[aforainrange(5)]# 调用>&g...

heima201907的博客 143

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

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

liuhailong0511的博客 1416

Python —— 生成器与yield

yield与生成器的使用

julong187的博客 2480

Python的yield关键字

忽然得知Python有个叫yield的关键字,好奇之下去查了查,花了点时间基本弄明白了,故写在此备忘,顺便充充字数。yield关键字用来定义生成器(Generator),其具体功能是可以当return使用,从函数里返回一个值,不同之处是用yield返回之后,可以让函数从上回yield返回的地点继续执行。也就是说,yield返回函数,交给调用者一个返回值,然后再“瞬移”回去,让函数继续运行, 直到吓一跳yield语句再返回一个新的值。使用yield返回后,调用者实际得到的是一个迭代器对象,迭代器的值就是返回值

tossgoer的专栏 1728

python--yield详解

yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个生成器,生成器对象可以被迭代,每次迭代都会从函数中的 yield 语句处恢复执行,并返回对应的值,直到函数执行完毕或者遇到了 StopIteration 异常。它是一种特殊的生成器函数,它可以使用 yield from 语法来将控制权传递给另一个生成器函数,并从中获取值,在使用委托生成器时,生成器函数的状态会被暂停,并且委托生成器会接管执行,直到它结束或者发生异常。

liulanba的博客 2509

yield生成器之keras模型训练代码实现

1 . 何为yield? 包含yield的函数,会生成一个生成器generator ,听过next函数可以不断生成一批数据. 示例: &gt;&gt;&gt; def test(): ... testData = ['a' , 'b' , 'c' , 'd' , 'e' ,'f'] ... for x in testData: ... yield x ......

Chown先森 2627
上一篇: Python中的迭代器与可迭代
itanders
博客等级 码龄19年 178粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值