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

作者:python学习者0 时间:2022-10-17 18:22:56 

最简单、直观的认识,将 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 方法。

来源:https://www.cnblogs.com/xxpythonxx/p/15463109.html

标签:Python,yield,生成器
0
投稿

猜你喜欢

  • GoLang切片并发安全解决方案详解

    2024-05-09 09:54:15
  • 详解python字符串驻留技术

    2023-09-25 21:49:25
  • 基于OpenCV实现视频循环播放

    2023-07-13 09:10:33
  • 分享一个超好用的php header下载函数

    2023-09-03 21:31:43
  • 计算机程序设计并行计算概念及定义全面详解

    2023-02-20 22:35:59
  • Python基础之值传递和引用传递详解

    2023-06-16 08:53:35
  • 在TensorFlow中实现矩阵维度扩展

    2021-09-21 17:50:15
  • Python的MongoDB模块PyMongo操作方法集锦

    2021-02-05 17:59:03
  • js简单的分页器插件代码实例

    2024-04-29 13:23:22
  • Go语言同步与异步执行多个任务封装详解(Runner和RunnerAsync)

    2024-05-28 16:14:16
  • Python 更快进行探索性数据分析的四个方法

    2021-01-15 05:22:31
  • Python一行代码识别增值税发票实现示例

    2022-07-10 04:36:48
  • Mysql技术内幕之InnoDB锁的深入讲解

    2024-01-19 12:16:21
  • Go中的应用配置管理详解

    2023-06-21 00:40:55
  • Python import自定义模块方法

    2022-08-23 06:57:27
  • python爬虫之模拟登陆csdn的实例代码

    2021-05-04 22:49:47
  • 端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!

    2023-08-23 06:29:31
  • VSCode 使用Settings Sync同步配置(最新版教程,非常简单)

    2022-10-17 08:50:47
  • Golang设计模式之外观模式的实现

    2024-05-28 15:22:44
  • Go语言对字符串进行MD5加密的方法

    2024-05-09 14:54:38
  • asp之家 网络编程 m.aspxhome.com