一个yield使用例子

129 篇文章 0 订阅
96 篇文章 0 订阅

一、yield使用例子

不使用 yield

使用yield

 参考:

廖雪峰《Python yield 使用浅析》

菜鸟教程《Python3 迭代器与生成器》

二、yield使用

yield 是一个关键字,在 Python 等编程语言中经常遣用,特别在创建生成器(generator)时。生成器是一种特殊的迭代器,它允许进行惰性计算,也就是说,在需要数据的时候才计算和返回数据,这对于内存使用和计算效率都有好处。
以下是一些 yield 的用法:
1. 生成器函数:一个包含 yield 语句的函数会被认为是一个生成器函数。调用此函数将返回一个生成器对象,但不会立即执行函数体内的代码。    

    def simple_generator():
        yield 1
        yield 2
        yield 3

    # 创建生成器    

generator = simple_generator()

    # 通过生成器取值

    for value in generator:
        print(value)

    执行上面的代码将输出:

    1
    2
    3

2. yield 可以用于产生一个值,然后暂停函数的执行,等待下一次的迭代请求。
3. 使用 yield 可以避免创建大型的列表来保存数据,从而节约内存(特别是处理大量数据时)。
4. 生成器可以使用 next() 进行迭代,每次调用都会返回 yield 语句产出的下一个值,直到没有更多的值产出,此时会产生一个 StopIteration 异常。
5. 除了简单值,yield 还可以返回一个从迭代器或可迭代对象中获得的值。
6. Python 3.3 引入了 yield from 语法,可以用来简化嵌套生成器的处理。它允许生成器委托部分操作给另一个生成器。   

   def generator1():
       yield from generator2()
       yield from [4, 5, 6]

   def generator2():
       yield from [1, 2, 3]

   for value in generator1():
       print(value)

   输出将会是:   

   1
   2
   3
   4
   5
   6

   yield 的这些用法在解决特定编程问题时非常有效,比如构建协程、处理大规模数据集或非阻塞 I/O 操作时。

三、yield解决特定编程问题时非常有效的理解

yield 是 Python 语言中一个非常有用的关键字,主要用在生成器(generators)中。它使得函数能够像迭代器那样一次返回一个值,并在每次产生值后,保持函数的状态,从而允许函数在下次被调用时从上次返回值的位置继续执行。这种行为带来了多种编程问题的高效解决方案,尤其对于以下场景:
1. 构建协程:协程是一种程序组件,可以进行挂起和恢复,而不是按照常规的入栈/出栈方式执行。在 Python 中,yield 可以使函数挂起其执行状态,这非常适用于协程的创建,因为它们依赖于能够在特定的执行点暂停和恢复执行。
2. 处理大规模数据集:对于需要处理大规模数据如大文件或大数据流的应用程序,使用常规的数据加载方法可能会导致内存不足。由于 yield 可以逐步处理数据,一次只生成数据集中的一小部分,生成器可以一次只读取并处理数据集的一部分,极大地减少了内存的需求。
3. 非阻塞 I/O 操作:在执行 I/O 操作(如文件读取或网络请求)时,程序通常会等待操作完成,这会导致程序的其他部分无法同时执行,尤其是在 I/O 操作较慢的时候。使用 yield,程序可以在等待 I/O 完成时暂停函数执行,释放出控制流,允许其他操作并行执行,从而提高程序的响应性和效率。
4. 惰性计算:生成器函数允许惰性计算(lazy evaluation),意味着只有在结果真正需要时才计算它。这可以带来性能上的优化,并允许我们处理无限序列的概念,例如无限数据流。
5. 流水线处理:生成器可以很容易被组合在一起,形成数据处理的流水线(pipeline),这相当于是一个惰性处理链,只有在取得最终结果的时候,数据才会真正流过整个处理链,减小了每一步操作的开销。
通过使用 yield 关键字和生成器,程序员可以编写出内存使用效率更高、并发能力更强和响应性更佳的代码。因此,在需要这些特性的编程场景中,yield 的使用是非常有效的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

109702008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值