前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Python中什么时候用Yield什么时候用Return

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

作者头像
大数据弄潮儿
发布2017-12-21 11:57:52
2.3K0
发布2017-12-21 11:57:52
举报
文章被收录于专栏:大数据

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

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

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

最重要的事情先讲。

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

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

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

我们来看一个例子:

代码语言:javascript
复制

def simpleGeneratorFun():
代码语言:javascript
复制
    yield 1
代码语言:javascript
复制
    yield 2
代码语言:javascript
复制
    yield 3
代码语言:javascript
复制
for value in simpleGeneratorFun():
代码语言:javascript
复制
    print(value)

这个代码的输出是:

代码语言:javascript
复制

1
代码语言:javascript
复制
2
代码语言:javascript
复制
3

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

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

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

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

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

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

这个代码的输出是:

代码语言:javascript
复制
1
代码语言:javascript
复制
4
代码语言:javascript
复制
9
代码语言:javascript
复制
16
代码语言:javascript
复制
25
代码语言:javascript
复制
36
代码语言:javascript
复制
49
代码语言:javascript
复制
64
代码语言:javascript
复制
81
代码语言:javascript
复制
100

就是这样!

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档