在Python中什么时候用Yield什么时候用Return

许多Python开发人员在代码中使用yield,而不考虑他们是否真的需要。这篇文章解释了你什么时候应该使用它。

最近,我看到很多在结构中使用yield关键字的项目,无论是否需要。

所以我决定研究一下,和大家分享一些相关信息。

最重要的事情先讲。

yield语句仅在定义生成器函数时使用而且仅在生成器函数的主体中使用。

在函数定义中使用yield语句足以导致该定义创建生成器函数,而不是正常函数。

yield语句暂停函数的执行,并将值返回给调用者,但保留足够的状态以使函数能够恢复到停止的地方。当恢复时,函数在最后一次收益运行后立即继续执行。这允许它的代码随着时间的推移产生一系列值,而不是一次计算它们并将它们像列表一样发回。

我们来看一个例子:

def simpleGeneratorFun():
    yield 1
    yield 2
    yield 3
for value in simpleGeneratorFun():
    print(value)

这个代码的输出是:

1
2
3

当yield语句被执行时,生成器的状态被冻结,并且expression_list的值被返回给next()的调用者。通过“冻结”,我们表示保留了所有本地状态,包括局部变量的当前绑定,指令指针和内部评估堆栈。足够的信息被保存,以便下次调用next()时,函数可以一样进行,而yield语句只是另一个外部调用。

yield语句不允许在try ... finally结构的try子句中使用。难点在于不能保证生成器永远不会被恢复,因此不能保证finally组将被执行。

return将指定的值发送回调用者,而yield可以产生一系列值。

当我们想迭代一个序列,但不想将整个序列存储在内存中时,我们应该使用yield。

yield在Python生成器中使用。生成器函数的定义与普通函数一样,但是每当需要生成一个值时,都会使用yield关键字而不是返回值。如果def的主体包含yield,则该函数将自动成为生成器函数。

def nextSquare():
    i = 1;
    # 一个产生squares的无限循环
    while True:
        yield i*i                
        i += 1  # 继续下一次执行
                # 从这个点开始   
for num in nextSquare():
    if num > 100:
         break   
    print(num)

这个代码的输出是:

1
4
9
16
25
36
49
64
81
100

就是这样!

原文链接:https://dzone.com/articles/when-to-use-yield-instead-of-return-in-python

原文作者:Orcun Yilmaz

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逆向技术

逆向课程第三讲逆向中的优化方式,以及加减乘

              逆向课程第三讲逆向中的优化方式,以及加减乘 一丶为什么要熟悉优化方式 熟悉优化方式,可以在看高级代码的时候浮现出汇编代码,以及做逆向...

18910
来自专栏苍云横渡学习笔记

【day 6】python编程:从入门到实践学习笔记-函数(末附练习答案代码)

学习笔记目录 【day 1】python编程:从入门到实践学习笔记-安装、变量和简单数据类型 【day 2】python编程:从入门到实践学习笔记-列表以及其操...

3015
来自专栏生信宝典

18式优雅你的Python

文章授权转载自 Python与算法之美,粗体文字为生信宝典的修改和补充。文后有生信宝典原创的系列Python学习教程(Python2和Python3)。

982
来自专栏苍云横渡学习笔记

【day 2】python编程:从入门到实践学习笔记-列表以及其操作

学习笔记目录 【day 1】python编程:从入门到实践学习笔记-安装、变量和简单数据类型 【day 2】python编程:从入门到实践学习笔记-列表以及其操...

3156
来自专栏前端架构与工程

【翻译】ES6生成器简介

原文地址:http://davidwalsh.name/es6-generators ES6生成器全部文章: The Basics Of ES6 Generat...

1777
来自专栏未闻Code

使用有限状态机原理实现英文分词

使用Python开发一个英文句子分词程序,把一段英文句子切分为每一个单词。不能导入任何官方的或者第三方的库,也不能使用字符串的split()方法。

551
来自专栏程序员互动联盟

【答疑释惑】C语言里面结构体大小统计方法

之前说过一个关于结构体在内存中所占字节数的问题,我们知道结构体长度的计算并不是所有成员长度的相加,而是因为编译器优化会对其进行对齐,这样会优化访问速度等。 那...

2847
来自专栏程序员叨叨叨

6.8 控制流语句(Control Flow Statement)

程序最小的独立单元是语句(statement),语句一般由分号结尾,缺省情况下,语句是顺序执行的,但是当涉及逻辑判断控制时,就要求有控制流程序语句。控制流程序语...

923
来自专栏WindCoder

网易MySQL微专业学习笔记(六)-内置函数

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

471
来自专栏木宛城主

浪客剑心:位图法Bitmap算法分析

看了一篇文章《一道腾讯前端试题,谁来试试身手》,正好以前了解过位图法,确实不错。位图法适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不...

2516

扫码关注云+社区