ITPub博客

首页 > 应用开发 > Python > Python生成器对象的恢复

Python生成器对象的恢复

原创 Python 作者:raptors 时间:2025-11-12 16:18:07 0 删除 编辑

# Python生成器对象的恢复


生成器是Python中一种特殊的迭代器,它可以暂停和恢复执行。当生成器函数被调用时,它返回一个生成器对象,但不会立即执行函数体。每次调用`next()`或使用`for`循环时,生成器会执行到下一个`yield`语句处暂停。


## 生成器恢复执行的几种方式


1. **使用next()函数** - 最常见的恢复方式

   ```python

   def simple_gen():

       yield 1

       yield 2

       yield 3

   

   gen = simple_gen()

   print(next(gen))  # 输出: 1

   print(next(gen))  # 输出: 2

   print(next(gen))  # 输出: 3

   ```


2. **使用send()方法** - 可以向生成器发送值

   ```python

   def gen_with_send():

       x = yield "Ready"

       yield f"Received: {x}"

   

   g = gen_with_send()

   print(next(g))      # 输出: Ready

   print(g.send(42))   # 输出: Received: 42

   ```


3. **使用for循环** - 自动处理迭代

   ```python

   for value in simple_gen():

       print(value)

   # 输出:

   # 1

   # 2

   # 3

   ```


4. **使用throw()方法** - 向生成器抛出异常

   ```python

   def gen_with_exception():

       try:

           yield "Normal"

       except ValueError:

           yield "Error handled"

   

   g = gen_with_exception()

   print(next(g))              # 输出: Normal

   print(g.throw(ValueError))  # 输出: Error handled

   ```


5. **使用close()方法** - 终止生成器

   ```python

   g = simple_gen()

   print(next(g))  # 输出: 1

   g.close()

   # 再次调用next(g)会抛出StopIteration

   ```


## 生成器状态


生成器有四种状态:

- "CREATED" - 已创建但未开始执行

- "RUNNING" - 正在执行

- "SUSPENDED" - 在yield处暂停

- "CLOSED" - 执行结束或已关闭


可以使用`inspect.getgeneratorstate()`检查状态:

```python

import inspect


gen = simple_gen()

https://zq.zhaopin.com/moment/71124873

https://zq.zhaopin.com/moment/71124353

https://zq.zhaopin.com/moment/71124299

https://zq.zhaopin.com/moment/71124189

https://zq.zhaopin.com/moment/71124003

https://zq.zhaopin.com/moment/71123665

https://zq.zhaopin.com/moment/71123581

https://zq.zhaopin.com/moment/71123282

https://zq.zhaopin.com/moment/71123226

https://zq.zhaopin.com/moment/71123176

https://zq.zhaopin.com/moment/71122766

https://zq.zhaopin.com/moment/71122375

https://zq.zhaopin.com/moment/71122373

https://zq.zhaopin.com/moment/71122368

https://zq.zhaopin.com/moment/71122329

https://zq.zhaopin.com/moment/71122304

https://zq.zhaopin.com/moment/71122284



print(inspect.getgeneratorstate(gen))  # GEN_CREATED

next(gen)

print(inspect.getgeneratorstate(gen))  # GEN_SUSPENDED

```


## 注意事项


1. 恢复生成器必须使用`next()`或`send(None)`,不能直接发送非None值

2. 生成器执行完毕后会抛出`StopIteration`异常

3. 生成器只能遍历一次,要再次使用需要重新创建生成器对象

4. `yield from`语法可以简化生成器的嵌套使用


生成器的这种暂停和恢复特性使其非常适合处理大数据流或实现协程。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34366/viewspace-3101099/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-29

  • 博文量
    20
  • 访问量
    20448