python3学习笔记:生成器generator

来源:互联网 发布:儿童桌面软件 编辑:程序博客网 时间:2024/05/16 17:24

跟着廖大学python3一段日子了,这里简单了解下生成器generator,主要是yield的返回值和send的传参,记录下。

生成器的基本属性

generator = 函数 + yield
简单说,就是一个函数,里面用到了关键字yield,就成为了一个生成器
生成器和函数的不同主要在于:

  • 直接调用生成器,不会执行;
    • 举个栗子:a = f() #这里f()是个生成器
    • 运行上面这句,f()不会执行,首次执行需要使用next(a)或a.send(None),后面会细讲
  • 每次执行,会暂时中断在yield关键字处,而且通过yield可以返回一个参数
  • 下次再接着执行,会从上次中断的yield处接着执行,并可以通过send()传递参数,当然继续中断在下一个yield处
  • 如果通过send()或next()执行generator,而没有找到下一个yield,会报错

yield返回值&&传参

总结就是:

  • return = send(msg)
    • 传递参数msg给当前中断yield前面的变量
    • 同时返回下一个yield后面的参数给return
  • return = next(a)
    • 没有传递参数或者说传递参数None给当前中断yield前面的变量
    • 同时返回下一个yield后面的参数给return

直接看下面的栗子,直观明了

#生成器def f():    print('start')    a = yield 1 #可以返回参数1,并接收传递的参数给a    print(a)     print('middle')    b = yield 2 #可以返回参数2,并接收传递的参数给b    print(b)    print('next')    c = yield 3 #可以返回参数3,并接收传递的参数给c    print(c) #这里貌似永远不会执行,因为总会在上一行的yield处结束a = f() #这里不会执行,即没有任何打印信息#a.next() #这种写法在python3里面会报错return1 = next(a)#输出start,中断在yield 1处,返回yield后面的1给return1#return1 = a.send(None) #效果同上一条语句#return1 = a.send('test') #这里会报错#如果首次执行generator,就传递一个非None的参数,因为第一次执行不是从一般的中断yield处执行起,所以没有yield关键字来接收传参,就会报错print(return1)return2 = next(a)#传入参数为None,即a=None,返回2给return2print(return2)return3 = a.send('msg')#传入参数msg,即b=msg,返回3给return3print(return3)

执行结果如下:

start1Nonemiddle2msgnext3[Finished in 0.7s]
0 0