在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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2787
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4224
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3675
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39110
来自专栏落花落雨不落叶

canvas画简单电路图

85811
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

27310
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3007
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8718
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3015

扫码关注云+社区