收益率和回报有何不同?
How are yield and return different from one another?
我经常遇到这个术语,这个函数产生一些东西,或者这个函数返回一些东西。我试图理解这一点并阅读一些 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 的内存,并使我的系统停止运行。这就是生成器存在的原因 - 根据需要加载数据而不是一次加载所有数据(可能还有其他一些用途(。尝试阅读这篇文章,它有几个例子,将更详细地介绍。
- 在C++中,我如何接受不同于同一行的用户输入
- 如何创建从同一类继承的不同对象的向量
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 获取从C++中同一类中的构造函数调用的方法返回的值
- C++如何将同一类的实例作为属性
- 在TFHE(完全快速同态加密)上执行除法
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 如何使用运算符在同一行中多次调用函数
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- C++交换来自同一类成员的参数值,处理多个类
- C++找出覆盖同一行的数组
- 使用同一类中的方法重新分配字段时出现问题
- 如何在同一行内打印和返回?
- 类成员函数无法访问同一类的私有结构节点?
- MOVNTI 存储是否相对于由同一线程创建的其他 MOVNTI 存储重新排序?
- 同一线程 ID 是否可以在同一进程中重复使用?
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- C++ 如何在同一行中和在一条线上?
- 将shared_ptr同为己有安全吗?