首页 > 应用开发 > Python > Python生成器对象的恢复
# 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/ ,如需转载,请注明出处,否则将追究法律责任。