菜单
  

    首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器),好了,如果你对这些不明白的话,那先把yield看做return,然后直接看下面的程序,你就会明白yield的全部意思了:

    def foo():

        print("starting...")

        while True:

            res = yield 4

            print("res:",res)

    g = foo()

    print(next(g))

    print("*"*20)

    print(next(g))

    就这么简单的几行代码就让你明白什么是yield,代码的输出这个:

     

    starting...

    4

    ********************

    res: None

    4

    我直接解释代码运行顺序,相当于代码单步调试:

     

    1.程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)

     

    2.直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环

     

    3.程序遇到yield关键字,然后把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g))的结果,

     

    4.程序执行print("*"*20),输出20个*

     

    5.又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,

     

    6.程序会继续在while里执行,又一次碰到yield,这个时候同样return 出4,然后程序停止,print函数输出的4就是这次return出的4.

    到这里你可能就明白yield和return的关系和区别了,带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

     

    ****************************************************************************************************************************************

     

    def foo():

        print("starting...")

        while True:

            res = yield 4

            print("res:",res)

    g = foo()

    print(next(g))

    print("*"*20)

    print(g.send(7))

    再看一个这个生成器的send函数的例子,这个例子就把上面那个例子的最后一行换掉了,输出结果:

     

    starting...

    4

    ********************

    res: 7

    4

    先大致说一下send函数的概念:此时你应该注意到上面那个的紫色的字,还有上面那个res的值为什么是None,这个变成了7,到底为什么,这是因为,send是发送一个参数给res的,因为上面讲到,return的时候,并没有把4赋值给res,下次执行的时候只好继续执行赋值操作,只好赋值为None了,而如果用send的话,开始执行的时候,先接着上一次(return 4之后)执行,先把7赋值给了res,然后执行next的作用,遇见下一回的yield,return出结果后结束。

  1. 上一篇:自带白胡子的绅士喵绅士
  2. 下一篇:阿里云ntp服务器地址和端口
  1. 高中生环境意识培养现状调查问卷

  2. 高中力学学习情况问卷调查表

  3. 中共党史学习教育心得体会800字

  4. 党史学习教育心得体会

  5. 中国联通的流量营销调查问卷

  6. 公共财政支出在经济适用...

  7. 体育兴趣小组在中小学开展现状调查问卷表

  8. 上市公司债务税盾文献综述和参考文献

  9. 淮安乐天玛特连锁超市4P营销策略分析

  10. 小学课堂教学效率国内外研究现状和参考文献

  11. Bootstrap的OpenGL人体模型仿真

  12. PLC焊机电气控制系统设计开题报告

  13. MATLAB动车组列车牵引变流...

  14. 跨国企业全球营销策略的市场定位调查

  15. 友谊质量调查问卷表

  16. PLC启闭机液压系统设计及其故障诊断

  17. 多智能体系统一致性问题研究

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回