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

 更新时间:2021年11月03日 15:54:50   作者:python学习者0  
这篇文章主要介绍了Python中的yield返回生成器,生成器是Python编程进阶中的重要知识点,需要的朋友可以参考下,希望能够给你带来帮助

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

总结

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

相关文章

  • Python实现时间序列变化点检测功能

    Python实现时间序列变化点检测功能

    平稳性是时间序列分析与预测的核心概念,在平稳条件下,时间序列的统计特性(如均值)在时间维度上保持不变,仅存在随机波动,但是时间序列通常会经历结构性断裂或变化,本文给大家介绍了Python实现时间序列变化点检测功能,需要的朋友可以参考下
    2024-09-09
  • python使用jenkins发送企业微信通知的实现

    python使用jenkins发送企业微信通知的实现

    公司使用的是企业微信,因此考虑Jenkins通知企业微信机器人的实现方式,本文主要介绍了python使用jenkins发送企业微信通知的实现,感兴趣的可以了解一下
    2021-06-06
  • Python反爬实战掌握酷狗音乐排行榜加密规则

    Python反爬实战掌握酷狗音乐排行榜加密规则

    最新的酷狗音乐反爬来袭,本文介绍如何利用Python掌握酷狗排行榜加密规则,本章内容只限学习,切勿用作其他用途!!!!! 有需要的朋友可以借鉴参考下
    2021-10-10
  • Python学习之名字,作用域,名字空间(下)

    Python学习之名字,作用域,名字空间(下)

    这篇文章主要介绍了Python学习之名字,作用域,名字空间,紧接上一篇文章内容展开全文,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-05-05
  • Django 路由控制的实现代码

    Django 路由控制的实现代码

    这篇文章主要介绍了Django 路由控制的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 线程安全及Python中的GIL原理分析

    线程安全及Python中的GIL原理分析

    这篇文章主要介绍了线程安全及Python中的GIL原理,较为详细的分析了线程安全及Python中的GIL相关概念、原理、理解及操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Python实现批量获取当前文件夹下的文件名

    Python实现批量获取当前文件夹下的文件名

    这篇文章主要为大家详细介绍了如何利用Python实现批量获取当前文件夹下的文件名,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Python中类创建和实例化的过程详解

    Python中类创建和实例化的过程详解

    这篇文章主要介绍了Python中类创建和实例化过程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • Python实现常见网络通信的示例详解

    Python实现常见网络通信的示例详解

    这篇文章主要为大家详细介绍了Python实现常见网络通信的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴就跟随小编一起学习一下吧
    2025-04-04
  • Python常用内置模块之xml模块(详解)

    Python常用内置模块之xml模块(详解)

    下面小编就为大家带来一篇Python常用内置模块之xml模块(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论