• 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 属性返回。

  • 相关阅读:
    域名列入备案黑名单解除教程
    systemView的安装使用
    Vue中的Ajax②(slot插槽)
    3.事务篇【mysql高级】
    【每日一题】同积元组
    MICCAI 2022:使用自适应条形采样和双分支 Transformer 的 DA-Net
    Redis之与SSM集成Spring注解式缓存
    Let 与 Const 区别 (2022.11.7)
    贵金属入门,有以下四个方法
    C/C++中的STL
  • 原文地址:https://blog.csdn.net/qq_41617060/article/details/130871963