首页 > 编程语言 >python生成器

python生成器

时间:2024-07-30 23:29:42浏览次数:11  
标签:python send 生成器 value yield 执行 异常

一 前言

环境: python3.10 win10

二 生成器

1 关于生成器

先看一个例子
image

    定义了一个函数,当我们运行该函数时,并未像普通函数那样执行函数体内的代码
    从其中的英文可知,执行函数得到了一个生成器对象,这个生成器对象也叫做generator iterator(生成器迭代器),generator iterator也属于前面说的迭代器,通常也叫做生成器(generator)

    像这种包含关键字yield的函数,严格来说叫做生成器函数,

    前面的迭代器介绍过,可用next()不断返回迭代器中的元素或者用在for循环中,生成器对象既然属于迭代器,这里也尝试一下
image

    可以看到,每执行一次next(),就可以执行函数内的代码到遇到关键字yield处暂停,并返回yield value中的value作为next()的返回值,再次执行时,会从上次暂停处继续执行到下一个yield处暂停,如此循环,一直到最后没有yield时引发StopIteration异常(就像迭代器一样,一直调用next(),最后没有可返回的数据时引发StopIteration异常)

执行生成器时除了可以使用next(generator),也可以使用generator.send(xxxx)
image

    如上,第一次执行生成器时,如采用方法send(),则必须传递参数None
    如果不是第一次(即恢复执行生成器时),则可以在方法send(value)中添加参数value,value将传进生成器内作为yield 表达式的值,看一个例子
image

    如上,利用send(None)开始执行生成器时,执行到第一个yield表达式暂停,此时只执行了表达式右边即yield 0 这一部分,左边部分给v的赋值时没有执行的。

    第2次执行send(value)时,第一处yield左边部分给v的赋值才开始执行(value的值作为v的值),然后暂停到第2处yield的位置,第2处yield处v的赋值要到下一次执行时间,如此循环

    所以照此推理,第一次执行send()时,应该是第0处的yield处的左边部分赋值开始执行,但第0处是不存在的,所以,第一次的参数必须为None即send(None)

    这里需要注意的是,yield value中的value是从生成器传到外面作为next()或者send(xxx)的结果,而send(value)中的value是传到生成器里面去替换掉yield xxx作为v的值

2 生成器的一些方法

  • generator__next__:
        此方法通常是隐式调用,通过for循环或者内置的next()函数

  • generator.send(value):-

  • generator.throw(type, value, traceback)
        在生成器暂停位置(yield处)引发一个异常(传入一个异常到生成器里面去,让生成器带着异常继续执行代码)
        若异常发生后,生成器能继续产生下一个值,则将下一个值作为throw()的结果。此时相当于是send(value),只不过value参数是一个异常
        若异常发生后,生成器没有继续产生下一个值,则将引发StopIteration异常,从而退出执行
        如果生成器函数没有捕获传入的异常,或是引发了另一个异常,则该异常会被传播给调用方即throw()处

    type: 一个异常类
    value: 可选参数
    traceback: 可选参数

  • generator.close()
        在生成器暂停位置(yield处)引发GeneratorExit从而关闭生成器的执行(同样是传递一个异常到生成器里面去)
        注意,GeneratorExit直接继承自 BaseException 而不是 Exception,不会像Exception类异常那样(Exception类异常未被处理时,则会显示该异常信息)
        和throw()类似的是,传入该异常后,生成器若没有继续产生下一个值,GeneratorExit只会停止代码的执行并返回到调用方即close()处
        传入该异常后,如果生成器产生了下一个值,则将引发异常 RuntimeError,但不会像throw()那一样得到下一个值作为结果
        如果生成器引发了任何其他异常,它将被传播给调用方

image
    如上,我们传进去一个异常ZeroDivisionError后,异常被except 语句捕获,excep与finally中 都没有yield关键字能产生下一个值,所以在finally语句后引发了异常StopIteration,该异常被传递给调用方,即throw()方法的执行处

image
    如上,和上面一个例子的异常捕获稍微有点区别。在死循环里面放置了一个异常捕获的try语句。
这意味着只要没有异常或者符合捕获条件的异常,该循环依然可以继续执行下去

    上面利用throw()方法传进去异常ZeroDivisionError,这个异常类属于Exception的子类,所以执行了Exception中的代码,然后继续执行循环,遇到yield产生了生成器的下一个值,所以没有引发上一个例子的异常StopIteration,继续执行循环

    后面执行close()方法传递进去一个GeneratorExit异常,然后继续执行,由于该异常不属于Exception类型,所以就跳出了死循环,将异常传给了外面的try语句,然后执行了finally。
这种异常不会显示异常信息,所以就没像上个例子那样在后面显示异常信息

image
    如上,这个例子利用except BaseException 捕获到了传进去的GeneratorExit,并在后面的执行中遇到了yield,也就是生成器产生了下一个值,所以这里引发了异常RuntimeError
    但这里没有像throw()那样,把产生的下一个值返回作为close()的结果

四 生成器例子

image
执行结果
image

标签:python,send,生成器,value,yield,执行,异常
From: https://www.cnblogs.com/MyRecords/p/18330689

相关文章

  • 生成MySQL-oracle-SQL server数据字典(附Python代码)
    生成数据字典,早年写的,请注意新的版本变化。(1)MySQL元数据SQLUSEinformation_schema;#取出库和表。select  TABLE_SCHEMAAS'数据库名称',  TABLE_NAMEAS'表名',  TABLE_TYPEAS'表类型',  ROW_FORMATAS'行格式',  ENGINEAS'数据库引擎',  TABL......
  • Python - Method Resolution Order (MRO)
    TheorderinwhichPythonsearchesforattributesinbaseclassesiscalledmethodresolutionorder(MRO).Itgivesalinearizedpathforaninheritancestructure.PythoncomputesanMROforeveryclassinthehierarchy;thisMROiscomputedusingthe‘C3......
  • 计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 【自动化测试必学语言】python:语言基础
    目录Python介绍语言的分类注释单行注释多行注释变量定义变量使用变量变量名的命名规范数据类型数字类型非数字类型type()函数input输入print输出格式化输出快捷键(小操作)运算符算术运算符 比较运算符Python介绍作者:吉多·范罗苏姆(Guidov......
  • Python基础知识笔记——常用函数
    一、range()函数range()函数用于生成一个整数序列。它通常用于循环结构中,例如for循环,以提供循环的迭代次数。range()函数可以有1到3个参数。#range(start,stop,step)range(2,6,2)#生成从2开始,到6结束(不包括6),步长为2的一串数字#参数指定不完全时,默认从0开始,步长......
  • [python] 启发式算法库scikit-opt使用指北
    scikit-opt是一个封装了多种启发式算法的Python代码库,可以用于解决优化问题。scikit-opt官方仓库见:scikit-opt,scikit-opt官网文档见:scikit-opt-doc。scikit-opt安装代码如下:pipinstallscikit-opt#调用scikit-opt并查看版本importskosko.__version__'0.6.6'0背景介......
  • 门控循环单元(GRU)预测模型及其Python和MATLAB实现
    ##一、背景循环神经网络(RNN)是处理序列数据的一类神经网络,尤其适用于时间序列预测、自然语言处理等领域。然而,传统的RNN在长序列数据的训练中面临梯度消失和爆炸的问题,导致模型对长期依赖的学习能力不足。为了解决这一问题,研究人员提出了多种改进的RNN结构,其中包括长短期记忆......
  • 长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现
    ##LSTM预测模型背景长短期记忆网络(LongShort-TermMemory,LSTM)是一种特殊的递归神经网络(RNN),于1997年首次由SeppHochreiter和JürgenSchmidhuber提出。LSTM主要用于处理和预测序列数据中的时间依赖关系,能够有效地解决传统RNN在处理长序列时遇到的梯度消失和梯度爆炸问题。因......
  • 2024年华为OD机试真题-结队编程 -(C++/Java/python)-OD统一考试(C卷D卷)
     2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】题目描述某部门计划通过结队编程来进行项目开发,已知该部门有N名员工,每个员工有独一无二的职级,每三个员工形成一个小组进行结队编程,结队分组规则如下:从部门中选出序号分别为i、j、k的3名员工,他们的职级分贝为......
  • Centos7 安装 Python3环境,兼容python2
     一、安装Python3查看是否已经安装Python。Centos7默认安装了python2.7.5.因为一些命令要用它比如yum它使用的是python2.7.5。使用python-V命令查看一下是否安装Python。 然后使用命令whichpython查看一下Python可执行文件 安装依赖yuminstallzlib-develbz......