生成器

python之生成器 生成器 1.生成器 生成器(generator)也是一种迭代器,在每次迭代时返回一个值,直到抛出 StopIteration 异常。它有两种构造方式: (1).生成器表达式 和列表推导式的定义类似,生成器表达式使用 () 而不是 [] ,比如: 可以看出生成器表达式无法像列表推导式那样直接输出,它和可迭代对象一样只能采用for循环调用next()函数 (2).生成器函数 含有 yield 关键字的函数,调用该函数时会返回一个生成器。 可以看到,上面的函数没有使用 return 语句返 阅读详情

生成器

  • 什么是生成器

    ​ 通过列表生成式,可以直接生成一个列表,但是由于受到内存的限制,列表的容量肯定是有限的。而且在创建一个包含极大元素个数的列表,不仅会占用很大的内存空间,如果我们只需要访问列表中的前几个元素,那么后面很多的元素就占用了很大的空间,白白浪费了空间。如果列表元素可以按照某种算法推算出来,那我们是不是就可以再循环中不断推算出后面的元素呢?这样就不必创建完整的列表,从而节省了大量的内存空间。

    ​ 在Python中,这种一边循环一边计算的机制,称之为生成器:generator

  • 创建生成器方法1

    ​ 想要创建一个生成器,第一种方法很简单,只要把一个列表生成式的[ ] 改成( )就行

    In [2]: a = [x for x in range(5)]
    
    In [3]: a
    Out[3]: [0, 1, 2, 3, 4]
    
    In [4]: b = (x for x in range(5))
    
    In [5]: b
    Out[5]: <generator object <genexpr> at 0x7f86c8009780>

    ​ 在上面的代码中,a是一个列表,b是一个生成器,那么怎么打印b中的而每个元素呢?

    ​ 可以通过next()函数来获取生成器的下一个返回值

    In [6]: next(b)
    Out[6]: 0
    
    In [7]: next(b)
    Out[7]: 1
    
    In [8]: next(b)
    Out[8]: 2
    
    In [9]: next(b)
    Out[9]: 3
    
    In [10]: next(b)
    Out[10]: 4
    
    In [11]: next(b)
    <hr />
    
    StopIteration                             Traceback (most recent call last)
    <ipython-input-11-641a931447e8> in <module>()
    ----> 1 next(b)
    
    StopIteration: 
    

    ​ 生成器中保存的是算法 当我们每次调用next(b)时,就会计算出b的下一个元素的值,直到最后一个元素,没有更多的元素是就会抛出StopIteration异常。我们可以使用for循环来迭代它,也不用关心StopIteration异常的问题。

    In [14]: b = (x for x in range(5))
    
    In [15]: for x in b:
     ....:     print(x)
     ....:     
    0
    1
    2
    3
    4
    
    In [16]: 
    
  • 创建生成器方式2

    ​ generator非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现。

    ​ 比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

    ​ 1, 1, 2, 3, 5, 8, 13, 21, 34, …

    ​ 斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

    
    def fib(times):
      n = 0
      a, b = 0, 1
      while n < times:
          print(b)
          a, b = b, a + b
          n += 1
    
    fib(6)

    ​ 打印结果:1, 1, 2, 3, 5, 8

    ​ 上面的例子可以看出,函数实际上就是定义了Fibonacci数列的推算规则,可以很据算法推算出后面的值,想要将函数变成生成器,只需要将print(b)改成yield b 就可以了:

    def fib(times):
      n = 0
      a, b = 0, 1
      while n < times:
          yield b
          a, b = b, a + b
          n += 1
    
    for x in fib(6):
      print(x)

    ​ 打印结果:1, 1, 2, 3, 5, 8

  • yield和send

    ​ 只要函数中有yield,那就不能称之为函数了,应该叫生成器。

    ​ 第一次执行时,从头开始执行,当碰到yield时,会将yield后面的变量的值返回,第二次执行的时候,会从yield之后开始执行。

    ​ 取值时可以用for循环来取值,就不用担心异常的问题。

    ​ send和next相同,都是会从上次停止的地方开始运行。

    ​ 如果首次调用生成器对象,让其产生一个值,一定要用next()或者send(None)
    ​ 取值的时候,只能一个一个的取,不能跳着取值。

  • 总结

    ​ 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

    生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

    ​ 生成器的特点:

    • 节约内存
    • 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
Python学习之 ---生成器+生成器函数 生成器★★★★ 知识导图 生成器generator ● 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 ● 生成器对象,是一个可迭代对象,是一个迭代器 ● 生成器对象,是延迟计算、惰性求值的 生成器函数 ●函数体中包含yield语句的函数,就是生成器函数,调用后返回生成器对象. 生成器函数 def inc(): ... 阅读详情

相关推荐

什么是python的生成器

【前言】 我们可以通过列表生成式直接创建一个列表,但是受内存限制,列表的容量肯定是有限的。而且如果创建一个包含1000万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那么我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的内存空间。在python中这种一边循环一边计算的机制,称为生成器(Generator)。 所以说生成器也是一种迭代器,但是你只能对

Be_Nice的博客 2661

生成器(generator)

调用生成器函数(yield)的时候,php会返回一个属于Generator类的对象.这个对象可以使用foreach()函数进行迭代.每次迭代,php会要求Generator实例计算并提供下一个要迭代的值.生成器每次产出一个值之后,生成器的内部状态都会停顿,向生成器请求下一个值时,内部状态又会恢复.生成器的内部状态会一直在停顿和恢复之间切换,直到函数的末尾或遇到空的return;语句为止, 节...

zhyke 713

生成器和生成器表达式

本节主要内容: 1. 生成器和生成器函数 2. 列表推导式 一. 生成器 什么是生成器. 生成器实质就是迭代器. 在python中有三种方式来获取生成器: 1. 通过生成器函数 2. 通过各种推导式来实现生成器 3. 通过数据的转换也可以获取生成器 首先, 我们先看一个很简单的函数: 把函数中的return换成yield就是生成器函数 运行...

wbj_code_life的博客 2158

使用 Generator 代码生成器

说明:Generator 作为一个生成工具,不光局限于 SpringBoot 、SSH  、SSM ,它只是一个工具。仅以 mysql 为例, 会生成对象文件至  D:/source1、 添加 Mavne 库&lt;dependency&gt;     &lt;groupId&gt;com.baomidou&lt;/groupId&gt;     &lt;artifactId&gt;mybatis...

sardine-z 2412

Python 中的生成器

生成器是按需运行的,因此不仅内存效率高 还提供了一种在需要时生成值的方法。生成器表达式可用于动态创建简单的生成器(也称为匿名函数),而无需编写特殊的方法。一直以来,把无限流数据放入内存都是一个挑站,这个问题可以用生成器很方便地解决,因为迭代器一次只加载一项数据。在 Python 中,生成器是一种生成迭代器的方便的方法,可以通过实现生成器函数实现的。生成器函数和普通函数类似,唯一的不同点是,生成器函数使用。生成器送入该生成器的质数的平方。相比之前的代码,这个用生成器生成迭代器的代码,简洁多了。

dowhileprogramming的专栏 1486

ffmpeg(一) ffmpeg+QT开发环境搭建

(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)

小道士写程序 8205

Generator 快速理解

  你理解的 Generator 是什么?     Generator 算是 ES6 中难理解的概念之⼀了,Generator 最⼤的 特点就是可以控制函数的执⾏。在这⼀⼩节中我们不会去讲什么是 Generator,⽽是把重点放在 Generator 的⼀些容易困惑的地 ⽅。   直接调用一个generator和调用函数不一样,foo(5)仅仅是创建了一个generator对象,还没有去...

qq_35859392的博客 521

Revit Dynamo实战:用Excel数据批量生成桥梁模型(附自适应族技巧)

本文详细介绍了如何利用Revit Dynamo结合Excel数据实现桥梁参数化建模,重点讲解了数据驱动建模、自适应族优化及大型项目性能管理三大核心技巧。通过结构化Excel数据、高级自适应族创建和分块处理策略,显著提升桥梁建模效率与设计变更响应能力。

weixin_42520025的博客 387

python 生成器

函数生成器 python函数中有yield关键字,函数就变成了生成器。 #!/usr/bin/env python3 #coding:utf8 def fun(): n=0 while True: n+=1 yield n g=fun() print(type(g)) print(next(g)) python3 g.py <class 'generator'> 1 案例 使用函数生成器打印斐波那契数列。 cat fib.py #!/usr/bin/

weixin_40548182的博客 5909

扫地机器人自动回充技术大揭秘:红外、蓝牙、雷达哪种更适合你家?

本文深入解析扫地机器人自动回充技术的三种主流方案:红外、蓝牙和雷达/LiDAR,详细比较它们的原理、优缺点及适用场景。红外技术成本低但易受干扰,蓝牙穿透性好但精度随距离降低,雷达精度最高适合复杂环境。根据户型大小和家居环境,提供选购建议,帮助用户选择最适合自己家庭的自动回充方案。

weixin_29070721的博客 504

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

python生成器

生成器(generator)是一种返回一个值的迭代器,每次从该迭代器取下一个值。生成器表达式生成器函数生成器函数,通用生成器协程生成器委托生成器子生成器生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要迭代器的类一样写__iter__()和__next__()方法了,只需要一个yield关键字。当一个生成器函数被调用的时候,它返回一个迭代器,称为生成器或者生成器对象。生成器一定是迭代器(反之不成立),因此任何生成器也是以一种惰性加载的模式生成值。

acktomas的博客 1017

CMOS图像传感器系列--(四)HDR之LOFIC技术

CMOS图像传感器HDR技术之LOFIC解析 LOFIC(横向溢出积分电容器)技术是当前高动态范围成像的重要方案,通过在像素光电二极管旁设置高密度电容器收集溢出电荷,有效保留高光细节。该技术采用特殊像素结构,通过skim level触发电荷转移,实现单帧HDR成像。然而LOFIC存在显著局限性:高光区域噪声明显且难以消除,动态范围拓展不均衡(主要优化亮部),需复杂MIM工艺导致成本升高。为应对挑战,行业提出混合方案(如结合DCG技术)和工艺改进方向。OmniVision最新车载传感器OX08D10就采用了L

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 5808

python生成器有几种写法,python生成器的作用

生成器(generator)是一种返回一个值的迭代器,每次从该迭代器取下一个值。生成器表达式生成器函数通用生成器协程生成器委托生成器子生成器生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要迭代器的类一样写__iter__()和__next__()方法了,只需要一个yield关键字。当一个生成器函数被调用的时候,它返回一个迭代器,称为生成器或者生成器对象。生成器一定是迭代器(反之不成立),因此任何生成器也是以一种惰性加载的模式生成值。

gk12336的博客 1048

OTA(Over-The-Air)升级

OTA(Over-the-Air)是一种通过无线方式进行数据传输和更新的技术,通常用于电子设备(如智能手机、汽车、物联网设备等)的软件、固件或配置更新。OTA可以在设备与服务器之间进行远程传输,用户无需将设备接入电脑或进行有线操作。通过OTA,用户只需要通过Wi-Fi或移动网络连接,便能自动接收并安装最新的更新,而无需手动干预。OTA的优点是便捷和高效,能够确保设备随时保持最新状态,同时减少用户的操作负担。:如智能家居设备、路由器、汽车等硬件设备的固件更新。:确保设备上的应用保持最新版本。

weixin_50127894的博客 5071

如何在多 GPU 配置上运行 Unsloth:数据并行或模型并行

当工作负载受限于内存(模型或批次无法放入单张显卡)、或受限于计算且计算与通信比率较高时(即每块 GPU 的额外计算量超过同步参数的开销,如在 DDP 中,或超过传递激活值的开销,如在模型并行中),多 GPU 配置才开始显现优势。在松散连接的显卡上(尤其是 PCIe 版本的 H100 或 A100),额外的设备间数据传输会导致性能显著低于单 GPU 运行。让我们厘清概念,明确说明如何通过模型并行(将模型拆分到多个 GPU)或数据并行(在每个 GPU 上复制模型)来跨多 GPU 运行 Unsloth。

人工智能领域专家 647

函数生成器

生成器 生成器 generator 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 生成器对象,是一个可迭代对象,是一个迭代器 生成器对象,是延迟计算、惰性求值的 生成器函数 函数体中包含 yield 语句的函数,就是生成器函数,调用后返回生成器对象 普通函数调用,函数会立即执行直到执行完毕,生成器函...

weixin_44737199的博客 7011

手把手教您国内安装 Claude Code 并配置自定义大模型(包含New-API中转和可视化管理工具的使用)

国内免魔法畅用 Claude Code!手把手教你 Windows 安装、配置文件写法、对接阿里百炼 / DeepSeek / 智谱✨,附完整参数、正确命令、三方工具管理方案,新手一次成功!✅

XiaoqiangClub的博客 3786

【Python】生成器

生成器摘要 生成器是一种特殊的迭代器,通过yield关键字实现按需生成数据的特性。与普通函数不同,生成器函数可以暂停和恢复执行,保持中间状态,适用于大数据处理、无限序列等场景。创建方式包括生成器函数(含yield)和生成器表达式。关键特点包括: 惰性计算,节省内存 支持send()传值、throw()抛异常等交互操作 通过yield from实现生成器委托 遵循迭代器协议(__iter__和__next__方法) 典型应用包括流式数据处理、大文件读取和协程实现。

m0_72516377的博客 1270

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【JS】生成器与生成器对象

关于生成器的浅见

ccuucc的博客 1568

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

自动论文生成器 python_python生成器

python生成器python高级特性首先, 所有的生成器都是迭代器, 因为生成器完全实现了迭代器的接口。在python中, 有两种不同的方式提供生成器:1. 生成器表达式2. 生成器函数什么是生成器?生成器是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:>>>mygenerator=(x*xforxinrange(3))>&g...

weixin_39567046的博客 2610

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Python生成器

生成器是Python中非常强大的工具,它通过使用yield语句实现了按需生成值的能力。生成器可以帮助我们处理大数据集、实现无限序列、优化性能等方面。掌握生成器的概念和使用方法对于高效编写Python代码非常重要。

qq_41631913的博客 1198
上一篇: Python-文件操作
下一篇: 迭代器
西红柿炒番茄丶丨
博客等级 码龄10年 73粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值