zoukankan      html  css  js  c++  java
  • yield函数的执行顺序

    例子:

    上图中标明了  行号出现的顺序

    从顺序中可以看到

    1.开始先执行for循环,执行到93行yield_test(1)时,会调用函数yield_test(),所以打印了79行内容

    2.到80行时,遇到了yield,yield可以理解为return,所以93行yield_test(1)得到返回值0

    3.接着开始执行94-96行代码

    4.当再一次执行93行(for循环)时,从上图顺序中可以看到,程序执行了81-83行。因为n是1,所以这边程序也就停止执行了。

    执行结果

    从上面的结果中可以看到,yield函数被再次调用时,并不是从函数第一行代码开始执行,而是从yield语句后面一行开始的。

    把上面例子中n改成3

     1 def yield_test(n):
     2     for i in range(n):
     3         print(str(sys._getframe().f_lineno) + " before.")
     4         yield call(i)
     5         print(str(sys._getframe().f_lineno) + " after.")
     6         print('i====', i)  # 输出的是当前的i值
     7         print(str(sys._getframe().f_lineno) + " afterPrint.")
     8 
     9 
    10 def call(i):
    11     return i * 2
    12 
    13 
    14 #print(yield_test(4))  # <generator object yield_test at 0x0000000001DE9200>
    15 
    16 
    17 for i in yield_test(3):
    18     print(str(sys._getframe().f_lineno) + " forb.")
    19     print('i=', i)  # 输出的是yield函数的返回值  yield函数,相当于一个return语句:下次迭代时候,代码从yield的下一个语句开始执行
    20     print(str(sys._getframe().f_lineno) + " fora.")

    结果:可以看到下面结果,yield后面语句执行完成后,才继续从yield函数的第一行继续执行。   yield可以看做return,但是return后面语句将不再执行,而yield在下一次执行时,会将yield后面语句先执行完成。

     1 79 before.
     2 94 forb.
     3 i= 0
     4 96 fora.
     5 81 after.
     6 i==== 0
     7 83 afterPrint.
     8 79 before.
     9 94 forb.
    10 i= 2
    11 96 fora.
    12 81 after.
    13 i==== 1
    14 83 afterPrint.
    15 79 before.
    16 94 forb.
    17 i= 4
    18 96 fora.
    19 81 after.
    20 i==== 2
    21 83 afterPrint.

    参考:

    https://blog.csdn.net/mieleizhi0522/article/details/82142856

    https://blog.csdn.net/wxyangid/article/details/79514040

  • 相关阅读:
    动态生成java、动态编译、动态加载
    boostrap标签
    Java后端WebSocket的Tomcat实现
    编程过程与规范
    敏捷开发过程
    软件过程模型
    软件过程
    ISO9126 质量模型
    手机淘宝架构演化实践
    蒋勋:知识分子应具备怎样的美学修养
  • 原文地址:https://www.cnblogs.com/moonpool/p/11386142.html
Copyright © 2011-2022 走看看