Python中Yield的基本用法

作者:半杯茶的小酒杯 时间:2021-08-30 15:34:55 

带有yield的函数在Python中被称之为generator(生成器),也就是说,当你调用这个函数的时候,函数内部的代码并不立即执行 ,这个函数只是返回一个生成器(Generator Iterator)。


def generator():
for i in range(10) :
 yield i*i

gen = generator()
print(gen)

<generator object generator at 0x7ffaad115aa0>

1. 使用next方法迭代生成器

generator函数怎么调用呢?答案是next函数。


print("first iteration:")
print(next(gen))

print("second iteration:")
print(next(gen))

print("third iteration:")
print(next(gen))

print("fourth iteration:")
print(next(gen))

程序输出:

first iteration:
 0
 second iteration:
 1
 three iteration:
 4
 four iteration:
 9

在函数第一次调用next(gen)函数时,generator函数从开始执行到yield,并返回yield之后的值。

在函数第二次调用next(gen)函数时,generator函数从上一次yield结束的地方继续运行,直至下一次执行到yield的地方,并返回yield之后的值。依次类推。

2. 使用send()方法与生成器函数通信


def generator():
x = 1
while True:
 y = (yield x)
 x += y

gen = generator()

print("first iteration:")
print(next(gen))

print("send iteration:")
print(gen.send(10))

代码输出:

first iteration:
 1
 send iteration:
 11

生成器(generator)函数用yield表达式将处理好的x发送给生成器(Generator)的调用者;然后生成器(generator)的调用者可以通过send函数,将外部信息替换生成器内部yield表达式的返回值,并赋值给y,并参与后续的迭代流程。

3. Yield的好处

Python之所以要提供这样的解决方案,主要是内存占用和性能的考量。看类似下面的代码:


for i in range(10000):
 ...

上述代码的问题在于,range(10000)生成的可迭代的对象都在内存中,如果数据量很大比较耗费内存。

而使用yield定义的生成器(Generator)可以很好的解决这一问题。

参考材料

  • https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html

  • https://liam.page/2017/06/30/understanding-yield-in-python/

来源:http://www.banbeichadexiaojiubei.com/index.php/2020/10/17/python%e4%b8%ad%e7%9a%84yield%e7%94%a8%e6%b3%95/

标签:python,yield
0
投稿

猜你喜欢

  • Go项目实现优雅关机与平滑重启功能

    2023-07-16 07:36:13
  • python 使用事件对象asyncio.Event来同步协程的操作

    2023-02-24 12:46:41
  • 从Web查询数据库之PHP与MySQL篇

    2009-09-19 16:58:00
  • js鼠标动画特效

    2007-09-26 18:31:00
  • 详细讲解SQL Server数据库的文件恢复技术

    2009-01-15 12:54:00
  • MSSQL中部分字段重复数据的删除方法

    2008-12-29 13:59:00
  • ASP伪造REFERER方法

    2008-07-03 12:48:00
  • 设计地址栏透明icon图标方法

    2008-10-25 16:42:00
  • asp连接access数据库表代码实例

    2008-04-13 06:18:00
  • Python数据正态性检验实现过程

    2022-07-10 15:46:14
  • python实现邮箱发送信息

    2023-02-25 15:11:51
  • Golang二维数组的使用方式

    2023-07-21 07:29:16
  • JavaScript 实现模态对话框 源代码大全

    2023-08-22 20:32:24
  • 几个优化WordPress中JavaScript加载体验的插件介绍

    2023-11-03 12:03:08
  • ASP使用xmlhttp调用WEBSERVICE文档

    2008-05-30 13:56:00
  • 从SNS看社会化界面设计(一)

    2009-02-23 12:21:00
  • python数据可视化Pyecharts库sankey修改桑葚图颜色

    2023-09-04 08:56:13
  • 书写高效的CSS - 漫谈CSS的渲染效率

    2008-07-13 14:20:00
  • CSS在Internet Explorer 6, 7 和8中的差别

    2009-10-26 18:14:00
  • 浅谈图表参数化设计

    2010-08-29 18:03:00
  • asp之家 网络编程 m.aspxhome.com