gpt4 book ai didi

python - Ruby 生成器与 Python 生成器

转载 作者:IT老高 更新时间:2023-10-28 20:48:39 25 4
gpt4 key购买 nike

我一直在研究 Ruby 和 Python 生成器(在 Ruby 中称为 Enumerators)之间的相似之处/不同之处,据我所知,它们几乎是等价的。

然而,我注意到的一个区别是 Python 生成器支持 close() 方法,而 Ruby 生成器不支持。从 Python 文档中,close() 方法据说执行以下操作:

Raises a GeneratorExit at the point where the generator function was paused. If the generator function then raises StopIteration (by exiting normally, or due to already being closed) or GeneratorExit (by not catching the exception), close returns to its caller."

Ruby Enumerators 不支持 close() 方法有充分的理由吗?或者是偶然的遗漏?

我还发现 Ruby Enumerators 支持 rewind() 方法,但 Python 生成器不支持……这也有原因吗?

谢谢

最佳答案

这个 documentation for the rewind method在细节上有点稀缺。但是为了“重新开始”,生成器必须做以下两件事之一:

  • 记住它的完整输出,倒带后重复该输出,然后恢复之前的操作
  • 重置其内部状态,从而导致重复相同的输出而不会产生其他不必要的副作用

其中第二个并不总是可能的;例如,如果生成器从网络发出字节缓冲区,则输出不完全是内部状态的函数。但是任何使用第一种技术的生成器都必须在使用时在内存中建立一个越来越大的缓冲区。与列表相比,此类生成器几乎没有性能优势。

因此,我得出结论,Ruby rewind 方法必须是可选的,并不总是由具体的枚举器类支持。因此,如果 Python 设计者重视 Liskov substitution principle ,这将导致他们不需要在所有生成器中都使用这种方法。

关于python - Ruby 生成器与 Python 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3794762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com