我对在 python 中使用静态变量感到好奇,结果发现:Why doesn't Python have static variables?
在被接受的答案中,我发现它提供了很多信息,它说“如果你希望你的函数的行为在每次调用时都改变,你需要的是一个生成器”。
但是我有点困惑,因为那里使用的例子也可以用一个类来完成:
class Foo(object):
def __init__(self, bar):
self.bar = bar
def __call__(self):
self.bar = self.bar * 3 % 5
return self.bar
foo = Foo(bar)
print foo()
print foo()
这对我来说更有意义(但可能只是因为我之前没有正确使用过生成器)。
所以我的问题是,当函数每次调用时都需要更改行为时,使用生成器而不是类是否还有其他一些优势。
请您参考如下方法:
生成器(简单的生成器,不进入协程)有一个非常具体的目的:编写迭代器。为此,您获得局部变量的隐式捕获和一个关键字以暂停(与“终止”相反 - 您可以恢复)执行并为调用者提供迭代器的下一个值。优点是:
- 逻辑读起来更自然,因为您不需要将其分成多个方法调用 - 所有 状态都将保留,包括程序计数器 - 您可以在 yielding 中使用控制流。您可以将
yield x替换为results.append(x)并在末尾使用return results并获得等同于list 的函数(the_original_generator(...))。 - 您不需要通过将值放入
self中来显式地使值长期存在 - 减少输入和阅读。 - 您不需要带有两个方法声明的类声明(几行样板代码,这对于 Python 标准来说是相当多的)。
您可以使用“捕获局部变量”来实现一个可迭代对象,它的行为如下,除了您可以有多个并且您不调用函数而是使用迭代器(next_val = next(vals) 而不是 next_val = vals())。是否合适取决于。
