Skip to main content
 首页 » 编程设计

python之静态变量simultaion : classes vs generators

2025年05月04日11mq0036

我对在 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())。是否合适取决于。