Python3之生成器

来源:互联网 发布:华盛顿大学网络课程 编辑:程序博客网 时间:2024/06/06 19:38
  1. 生成器本质:迭代器

  2. 自带yeild 关键字,调用此函数得到一个生成器

  3. 多次调用函数就得到多个生成器

  4. send、yeild、while True循环要配套使用
    使用send前要初始化将程序停到yeild位置将程序挂起,然后send()可以执行,直到遇到下一个yeild程序挂起并将下一个yeild后面的值返回(精华,理解了这句话就真正理解了send的用法)

  5. yeild返回值的时候不管yeild在什么位置都可以将其后面的值返回,可能要返回的值代码在yeild的后面,而return必须位于函数体尾部就是说在返回值代码的后面,结束该函数
    协程函数

  6. 协程函数:包含yeild和send关键字

表达式形式的yield:调用foo()得到一个生成器,此时函数内的代码不会执行,当调用next()时,函数被触发执行,碰到yield程序挂起,然后调用g.send(数值),程序从挂起时开始执行,此时数值给了yield,然后yield赋值给x,程序继续执行,直到碰到yield程序挂起,并将yield后的结果返回给函数。如果此时再次调用next(g)那么yield的值就是None然后赋值给x,程序继续执行,这个效果和g.send(None)一样。So,send的作用有两个:

1.将值传递给yield,然后yield赋值给x。
2.触发函数的执行,直到遇到yield停止,yield后的值返回给函数,此步的操作和next()一样。

注意:要使用send()传值,必须要先将程序挂起,也就是初始化,这样才能完成传值,否则会报如下错误:
类型错误

PS:生成器

当调用foo()时,函数不会执行,但是得到一个生成器g,生成器调用next()方法时会触发函数foo()执行,当函数执行碰到yield时,程序挂起并将yield后的返回值返回,然后再次调用next()时,程序会从yield挂起时继续执行,直到碰到下一个yield,当没有下一个yield,也就是没有返回值时会报StopIteration异常,这就是函数运行的完整流程。next()要有返回值才行,没有就会抛异常。也就是next()必须要得到一个返回值,这个值也必须由yield返回,没有yield必然没有返回值。