协程和生成器都使用yield关键字。但是协程更像是对生成器语法的一些扩展
- 在生成器中, yield 只对外产出值
- 在协程中,yield能对外产出值,而且能接收通过send()方法传入值
下面是一段生成器的代码
def simple_generator():
c = yield 1
if c is None:
print("c is None")
# 代码运行后,返回结果为
# generator = simple_generator()
# next(generator) -> 1
# next(generator) -> c is None
可以发现生成器语法中, generator不返回值。
上面的代码等价于
def simple_generator():
yield 1
下面是一段协程的代码
def simple_coro2(a):
print("-> Started: a =", a)
b = yield a
print("-> Received: b: =", b)
c = yield a + b
print("-> Received: c=", c)
可以看到在生成器中,每次调用send()方法时,yield语句对外返回yield右侧的值,再将输入的值赋值给左侧的变量。所以协程在yield上做了拓展。能接收一些参数
协程有四个状态
- GEN_CREATED
- GEN_RUNNING
- GEN_SUSPEND
- GEN_CLOSED
每个协程在使用时,必须进行初始化。否则抛出异常
TypeError: can't send non-None value to a just-started generator