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 方法。

总结

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

相关文章

  • 解决使用pip安装报错:Microsoft Visual C++ 14.0 is required.

    解决使用pip安装报错:Microsoft Visual C++ 14.0 is required.

    对于程序员来说,经常pip安装自己所需要的包,大部分的包基本都能安装,但是总会遇到包安装不了的问题,下面这篇文章主要给大家介绍了关于如何解决使用pip安装报错:Microsoft Visual C++ 14.0 is required.的相关资料,需要的朋友可以参考下
    2022-09-09
  • Python的高级Git库 Gittle

    Python的高级Git库 Gittle

    Gittle是一个高级纯python git 库。构建在dulwich之上,提供了大部分的低层机制
    2014-09-09
  • Python基于回溯法子集树模板解决马踏棋盘问题示例

    Python基于回溯法子集树模板解决马踏棋盘问题示例

    这篇文章主要介绍了Python基于回溯法子集树模板解决马踏棋盘问题,简单描述了国际象棋马踏棋盘问题,并结合实例形式分析了Python使用回溯法子集树模板解决马踏棋盘问题的具体步骤与相关操作注意事项,需要的朋友可以参考下
    2017-09-09
  • python Gunicorn服务器使用方法详解

    python Gunicorn服务器使用方法详解

    这篇文章主要介绍了python Gunicorn服务器使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python入门教程(三十二)Python的命令行输入

    Python入门教程(三十二)Python的命令行输入

    这篇文章主要介绍了Python入门教程(三十二)Python的命令行输入,Python是一门非常强大好用的语言,也有着易上手的特性,本文为入门教程,需要的朋友可以参考下
    2023-05-05
  • python模仿网页版微信发送消息功能

    python模仿网页版微信发送消息功能

    这篇文章主要介绍了python模仿网页版微信发送消息功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 浅谈机器学习需要的了解的十大算法

    浅谈机器学习需要的了解的十大算法

    这篇文章主要介绍了浅谈机器学习需要的了解的十大算法,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 使用python PIL库批量对图片添加水印的过程详解

    使用python PIL库批量对图片添加水印的过程详解

    平常我们想给某些图片添加文字水印,方法有很多,也有很多的工具可以方便的进行,今天主要是对PIL库的应用,结合Python语言批量对图片添加水印,文章通过代码示例给大家介绍的非常详细,感兴趣的同学可以参考一下
    2023-11-11
  • python学生管理系统

    python学生管理系统

    这篇文章主要为大家详细介绍了python学生管理系统的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • python多线程与多进程及其区别详解

    python多线程与多进程及其区别详解

    这篇文章主要介绍了python多线程与多进程及其区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论