新闻动态

Python中yield返回生成器的详细方法

发布日期:2021-12-14 21:07 | 文章来源:脚本之家

最简单、直观的认识,将 yield 看做 return 对待,只是 return 返回一个值,而 yield 返回一个生成器。

要理解 yield 的作用,必须理解生成器是什么?

在理解生成器之前,必须先理解迭代器。

一、迭代器

逐项读取列表,称为迭代。

mylist = [1, 2, 3]
for i in mylist: # 可迭代对象
 print(i)

列表解析式同样是一个迭代器。

mylist = [x*x for x in range(3)]
for i in mylist:
 print(i)
'''
0
1
4
'''

所有 for...in... 都是迭代器,包括列表、字符串、文件等等。

但是,迭代器所有的值都存储在内存中,十分浪费内存。

因此有了生成器的概念。

二、生成器

生成器是一种迭代器,这种迭代器只能迭代一次。

生成器不会一次性存储所有的值,而是会动态的生成值。

mygenerator = (x*x for x in range(3))
for i in mygenerator:
 print(i)

生成器只可执行一次,再次执行时不会输出任何东西。

三、yield

1.例子一

yield 类似于 return 关键字,只是函数将返回一个生成器。

# 创建生成器
def createGenerator():
 mylist = range(10)
 for i in mylist:
  print(i) # 验证函数调用时并无执行
  yield i*i
mygenerator = createGenerator() 
print(mygenerator) 
# <generator object createGenerator at 0x0000029E88FDCA50>
# 使用生成器
for i in mygenerator:
 print(i)
# 再次执行 返回为空 没有值了

函数将返回一组只需要读取一次的值,可以大大的提升代码性能。

在调用函数时,函数体中的代码并不会执行,函数只返回生成器对象。

代码每次从使用生成器时停止的地方继续。

2.例子二

#Python学习交流群:531509025
# 学习另外一个例子
def foo():
 print("starting...")
 while True:
  res = yield 4 # 函数并不真正执行
  print("res:", res)
g = foo() # 得到一个生成器对象
print(next(g)) # 真正执行
print("*"*20)
print(next(g)) # 从上一次停止的地方继续执行
'''
starting...
4
********************
res: None
4
'''
print(g.send(7))

执行 yield 之后,才会跳出 while 循环。

next 函数用于执行下一步操作。

send 函数用于发送一个参数给生成器。且 send 方法中包含 next 方法。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本站的更多内容!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部