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

相关文章

来自专栏前端说吧

【消灭代办】第一周 - 敏感词判断

  一堆字符串组成的数组,给你一个字符串,让你去查找这个字符串是否在这个数组当中?

851
来自专栏智能算法

Python学习(二)---- 字符串操作、列表字典及深浅拷贝等

https://blog.csdn.net/fgf00/article/details/52061971

1032
来自专栏Python专栏

10个Python面试常问的问题

1635
来自专栏PHP在线

mysql数据类型详解(1)

优化设计不良或索引不佳的架构能把性能提升几个数量级。如果需要高性能,就必须运行特定的查询设计架构和索引,还要评估不同类型查询的性能要求,因为更改某个查询或架构的...

3338
来自专栏SHERlocked93的前端小站

JS 利用高阶函数实现函数缓存(备忘模式)

高阶函数就是那种输入参数里面有一个或者多个函数,输出也是函数的函数,这个在js里面主要是利用闭包实现的,最简单的就是经常看到的在一个函数内部输出另一个函数,比如

4753
来自专栏思考的代码世界

Python编程从入门到实践之字典|第5天

在Python中,字典是一系列键—值对。每个键都与一个值相关联,你可以使用键来访问与之 相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将...

3569
来自专栏SnailTyan

Python代码性能优化

Python使用非常方便、灵活,因此很受欢迎。但正因为如此,导致实现同一功能时,Python代码有很多写法,但不同的写法有不同的性能。因此写Python代码要有...

2158
来自专栏JavaQ

多参数方法进阶

很多高级工程师还在写包含N个参数的方法、使用setter方法构造实例,其实这些方式都是过时并且有很大缺陷的,本篇将深入讲解这些问题及解决方法。 多参数方法的问题...

33911
来自专栏xingoo, 一个梦想做发明家的程序员

const指南

基本词义  意思就就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用!  使用方法 const int a=1;//这里定...

19410
来自专栏企鹅号快讯

【C语言编程锦囊·连载42】scanf函数的返回值是什么?

问题阐述 scanf函数是用于数据输入的,输入变量的值被改变,那么scanf函数本身是否有返回值,返回值是什么意义呢? 专家解答 scanf函数的返回值很少有人...

2158

扫码关注云+社区