Skip to main content
 首页 » 编程设计

python之打破循环但 "completing"生成器

2025年05月04日10xing901022

_

考虑以下示例:

def generator(iterable): 
    print('Start') 
    for item in iterable: yield item 
    print('Stop') 
 
for x in generator(range(10)): 
    print(x) 
    if x==3: break 
    print(x) 

输出是

Start 
0 
0 
1 
1 
2 
2 
3 

当然,Python 完全按照它所说的去做。在 x==3 之后不会再次调用生成器,因此永远不会打印“Stop”。生成器抽象是合理的。然而,在这种情况下,我实际上是在尝试实现一种略有不同的抽象,有点像装饰循环以使其成为自定义循环。一些代码应该在循环之前运行,一些在每次迭代时运行,一些在循环之后运行,即使在 break 的情况下也是如此。

当然,我不依赖于这个确切的抽象来使我的程序工作,但它会很好。有没有人对这个案例有什么好的想法?

亲切的问候。

请您参考如下方法:

生成器是循环的良好抽象,但对于前后代码,Python 有另一个抽象——上下文管理器和“with”语句。您可以将这两个一起使用,例如这样:

class generator_context: 
    def __init__(self, iterable): 
        self.iterable = iterable 
 
    def __enter__(self): 
        print('Start') 
        for item in self.iterable: yield item 
 
    def __exit__(self, e_type, e_value, e_traceback): 
        if e_type is None: 
            print('Stop') 
 
with generator_context(range(10)) as generator: 
    for x in generator: 
        print(x) 
        if x==3: break 
        print(x)