• python 生成器


    生成器 

            Python生成器是一种特殊的函数,它可以在需要时生成一系列值,而不是一次性生成所有值。生成器使用yield关键字来暂停函数的执行,并返回一个值。当函数再次被调用时,它将从yield语句停止的地方继续执行。所以生成器非常适合处理大量数据或无限序列。 


    • 生成器的两种用途:
    1. 一是调用它创建一个生成器对象,也就是生成器迭代器,然后用迭代器驱动生成器函数分部运行,产生你想要的数据;
    2. 二是当协程函数用,控制程序流。

    • 生成器的作用:

            如果想具体化数据的形式,通常会将数据存储在一个列表中。但这样做,列表的内容将占用有形内存。列表越大,占用的内存资源就越多。

            但是,如果数据集有某种逻辑,就不必存储在一个列表中,只需编写一个生成器,它将在需要时生成这些值,基本不占用内存。


    • 生成器存储:

            是一种规则或者说方法,普通集合存储的是数据,数据量大的话,内存消耗大,但是规则几乎不占内存。


    • yieldreturn的区别:
    1. return函数直接返回所有结果程序终止不再运行并销毁局部变量
    2. yield的函数返回一个可迭代的 generator(生成器)对象,你可以使用for循环或者调用next()方法遍历生成器对象来提取结果。

    • yield fromreturn yield from:

        yield from 是 Python 3.3 引入的一个语法,用于简化生成器中的嵌套。它可以将一个可迭代对象中的所有值逐个返回,从而避免了使用嵌套的 for 循环,使代码更加简洁易读。

    以下是一个示例代码,展示如何使用 yield from

    1. def generator1():
    2. for i in range(3):
    3. yield i
    4. def generator2():
    5. yield from generator1()
    6. for i in generator2():
    7. print(i)

           代码中,generator1 和 generator2 都是生成器函数。generator2 中使用了 yield from generator1() 来返回 generator1 生成的所有值,从而避免了使用嵌套的 for 循环

            除了简化嵌套之外,yield from 还可以用于在协程中调用其他协程,从而实现协程的嵌套和协程之间的通信。例如,可以使用 yield from 将一个协程的输出作为另一个协程的输入

            另外,return yield from 语句可以在生成器函数中提前结束生成器,并将最终的值作为返回值。例如:

    1. def generator3():
    2. yield from [1, 2, 3]
    3. return "done"
    4. g = generator3()
    5. print(next(g)) # 输出 1
    6. print(next(g)) # 输出 2
    7. print(g.send(4)) # 输出 3,将 4 发送给生成器
    8. try:
    9. print(next(g)) # 抛出 StopIteration 异常,因为生成器已经结束
    10. except StopIteration as e:
    11. print(e.value) # 输出 "done"

            代码中,generator3 中使用了 yield from 返回一个列表中的所有值,并在最后使用了 return 语句返回一个字符串。在使用 next 方法和 send 方法逐步获取生成器的值时,可以看到生成器在遇到 return 语句后提前结束,并将最终的值作为 StopIteration 异常的 value 属性返回。

  • 相关阅读:
    基于java人脸识别考勤签到系统设计与实现毕业设计毕设作品
    CSDN黑名单的使用方法,希望大家永远不需要用到这个功能~
    [附源码]计算机毕业设计招聘系统Springboot程序
    elementui el-table在有summary-method时,table数据行将合计行遮挡住了
    Python中time模块
    记一次 Windows10 内存压缩模块 崩溃分析
    (附源码)springboot高校机房自动排课系统 毕业设计 211004
    C 风格的枚举还存在 “成员名称全局有效” 和 “可以隐式转换为整型” 的缺陷
    牛客小白赛60(F.被抓住的小竹)&61(E.排队)(数学+推公式)
    为什么同样是测试,他能年薪50W?
  • 原文地址:https://blog.csdn.net/qq_41617060/article/details/130871963