收益率和回报有何不同?

How are yield and return different from one another?

本文关键字:何不同 回报 收益率      更新时间:2023-10-16

我经常遇到这个术语,这个函数产生一些东西,或者这个函数返回一些东西。我试图理解这一点并阅读一些 python 文章。然后我在 c++ 中遇到了相同的语句,它说:

某些表达式生成对象,但将它们作为右值而不是左值返回。

任何人都可以帮助以独立于语言的方式或详细的方式理解这两个术语,以便我可以轻松掌握它。

编辑 - 如果它们在两种语言中不同,请用两种语言或您知道的任何一种语言进行解释。

在 Python 中,yield用于生成。例如:

def func():
i =0
while True:
i += 1
yield i

如果我没记错的话,这应该允许这个函数基本上暂停执行并一遍又一遍地调用。这可以生成一些序列,例如{0,1,2,3...}

另一方面,return只返回单个值并结束执行:

def func():
i =0
while True:
i += 1
return i

这应该总是返回0,因为函数完全结束执行,所以i每次都超出范围。


另一方面,据我所知,C++没有直接的实际等价物yield(除了显然在新的 C++20 中,它正在添加等价物(,因为它确实有一个等价物(在所有版本中(在这里return。当然,它被称为return.

也就是说,C++可以使用静态变量实现类似于我们的收益示例:

int func() {
static i = 0;
return i++;
}

但是,这并不是说静态变量可以替代C++中的yield。只是您可以在C++这个(以及可能的其他(示例中使用静态变量实现相同的目标。


因此,简而言之,return结束两种语言的函数执行,而yield允许函数恢复执行。至少在 C++20 之前,Python 在C++yield没有真正的等价物。

您是否曾经尝试过遍历整个对象数据库?这就是我第一次尝试的,它很快消耗了我所有 16GB 的内存,并使我的系统停止运行。这就是生成器存在的原因 - 根据需要加载数据而不是一次加载所有数据(可能还有其他一些用途(。尝试阅读这篇文章,它有几个例子,将更详细地介绍。