zoukankan      html  css  js  c++  java
  • [Python学习笔记-005] 理解yield

    网络上介绍yield的文章很多,但大多讲得过于复杂或者追求全面以至于反而不好理解。本文用一个极简的例子给出参考资料[1]中的讲解,因为个人觉得其讲解最为通俗易懂,读者只需要对Python的列表有所了解即可。

    When you see a function with yield statements, apply this easy trick to 
    understand what will happen:
    
    1. Insert a line result = [] at the start of the function.
    2. Replace each yield expr with result.append(expr).
    3. Insert a line return result at the bottom of the function.
    4. Yay - no more yield statements! Read and figure out code.
    5. Compare function to original definition.

    例如:

    • foo1.py
     1 #!/usr/bin/python3
     2 import sys
     3 
     4 def foo(n):
     5     for i in range(n):
     6         yield i * i
     7 
     8 def main(argc, argv):
     9     for i in foo(int(argv[1])):
    10         print(i)
    11     return 0
    12 
    13 if __name__ == '__main__':
    14     sys.exit(main(len(sys.argv), sys.argv))
    • foo2.py
     1 #!/usr/bin/python3
     2 import sys
     3 
     4 def foo(n):
     5     result = []
     6     for i in range(n):
     7         result.append(i * i)
     8     return result
     9 
    10 def main(argc, argv):
    11     for i in foo(int(argv[1])):
    12         print(i)
    13     return 0
    14 
    15 if __name__ == '__main__':
    16     sys.exit(main(len(sys.argv), sys.argv))
    •  meld foo1.py foo2.py

    •  运行foo1.py 和 foo2.py
    lijin$ ./foo1.py 3
    0
    1
    4
    lijin$ ./foo2.py 3
    0
    1
    4

    那么,问题来了,

    Q1 - yield的含义是什么?

    A:相当于return, 不过返回的是一个生成器函数

    Q2 - 为什么要引入yield?

    A省内存如果使用return一个list, 则list的元素全部储存在内存里;如果使用yield, 那就只需要在访问某个元素时将对应的元素装入内存即可。更多内容,请参考《Python学习手册》第4版第20章。

    参考资料:

    1. What does the "yield" keyword do?
  • 相关阅读:
    试用第三方web推送GoEasy
    使用intellj idea 搭建本地开发环境
    一种基于struts2 拦截器 和 log4j的轻量级crm权限及行为跟踪方式
    Spring AOP声明式事务异常回滚 若干法则
    spring aop 切面测试
    centos 安装 mysql
    只是 换个方式,
    contrller 是 file's owners,
    色差,15,还是15 ,换了颜色 就显的小了,
    一块,分开,还是不分开 一个整体,
  • 原文地址:https://www.cnblogs.com/idorax/p/10209983.html
Copyright © 2011-2022 走看看