python中yield和return差别

发布时间 2023-10-06 23:23:40作者: CloudWk

前言

经常遇到函数当中有关键字yield,它起着什么作用?和return的区别在哪里,下面对return和yield进行浅显易懂的解释。

一、yield关键字到底做了什么?

如果不太好理解yield的功能,其实可以把他看作return的兄弟来看,他们都在函数当中执行,并且履行着返回结果的职责。

这两者的主要区别:

有着return的函数执行遇到return关键字直接返回结果,结束函数并且销毁局部变量;

def test()
	x = 1
    return x
test = test()
print(‘返回结果:’,test)
# 返回结果:1

而有yield的函数则是返回一个可迭代generator(生成器)对象,你可以使用next()或者for循环方法进行遍历生成器对象来获取值。

什么是生成器呢?在python函数当使用了yield关键字的函数就被称为生成器。如果直接通过print打印函数就会返回一个生成器对象。

在调用生成器函数的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息(保留局部变量),返回yield的值, 并在下一次执行next()方法时从当前位置继续运行,直到生成器被全部遍历完。

image

先看一个简单的例子:

def foo():
    for i in range(4):
        yield i
foo =foo()
# 通过for对生成器函数进行遍历:1, 2, 3
for j in foo:
    print(j)
# 或者通过next(foo)对生成器进行迭代:1
print(next(foo))
# 或者通过next(foo)对生成器进行迭代:2
print(next(foo))

生成器函数里面通过yield关键字可以达到暂停的效果,函数只有迭代完所有参数就会终止迭代。

到这里你可能就明白yield和return的关系和区别了,带yield的函数是一个生成器,这个生成器有一个方法就是next,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的。

二、生成器有哪些作用?

如果想具体化数据的形式,通常会将数据存储在一个列表中。但这样做,列表的内容将占用有形内存。列表越大,占用的内存资源就越多。

但是,如果数据集有某种逻辑,就不必存储在一个列表中,只需编写一个生成器,它将在需要时生成这些值,基本不占用内存。