使用break时在python生成器中的yield语句之后运行代码

我有一个简单的生成器:

def counter(n): 
   counter = 0
   while counter <= n:
      counter += 1
      yield counter
   print(f"Nice! You counted to {counter}")

def test_counter(): 
   for count in counter(6): 
      print(f"count={count}")
      if count > 3: 
         break

在这个例子中,当计数达到 3 时有一个中断。但是代码的唯一问题是中断在 yield 语句终止了生成器的执行。它不会在 yield 语句之后运行 print 语句。有没有办法在发生中断时在 yield 语句之后的生成器中执行代码?

示例运行:

# What happens: 
>>> test_counter()
count=1
count=2
count=3
count=4

# What I'd like to see: 
>>> test_counter()
count=1
count=2
count=3
count=4
Nice! You counted to 4

回答

你必须把它print放在一个finally-block 中:

def counter(n): 
    try:
        counter = 0
        while counter <= n:
            counter += 1
            yield counter
    finally:
        print(f"Nice! You counted to {counter}")

def test_counter(): 
    for count in counter(6): 
        print(f"count={count}")
        if count > 3: 
            break


以上是使用break时在python生成器中的yield语句之后运行代码的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>