zoukankan      html  css  js  c++  java
  • python生成器的惰性计算

    最近学习了python的迭代器和生成器,生成器的是有一个特点的,就是用到数据时才会去取来用!请观察下面代码思考问题,想明白了,你就会明白什么是惰性计算了!

     1 def add(s, x):
     2     return s + x
     3 
     4 
     5 def gen():
     6     for i in range(4):
     7         yield i
     8 
     9 
    10 base = gen()
    11 for n in [1, 10]: 
    12     base = (add(i, n) for i in base)  
    13 print(list(base)) 

    输出:[20, 21, 22, 23]            很不解吧,请往下看

    这个题的关键点在于下面几点:

    1.因为循环在做的事是用生成器表达式生成数据,而生成器有个惰性计算特点,导致把我们引上一条不归路,我们被假象迷惑,其实它并没做任何事,而是单纯的走了两边过程

    2.生成器就是等到用的(比如:打印或者next函数取值等)得时候才会进行计算生产,所以等到最后打印的时候才开始计算

    3.当开始生产数据的时候,循环已经进行的两次n的值也因此变成了10

    4.第一次循环生成器生产数用到的base还是绑定的gen取0,1,2,3经过加工(add函数加操作),生成器生产出10,11,12,13,然后base顺利占据了生成器

    5.第二次循环在进行向base取值时,base已经不再是gen而是上次循环重新绑定的base,所以取到的值是10,11,12,13然后经过自己的加工生产出20,21,22,23,到这时大功告成。

    6.千万别把  for   n   in   [1,10]   想成了      for n in range (1,10)

    7.可能n变成了10很意外,但是理解了惰性之后也就明白了为神魔n在为1时没进行运算

    8.一定要理清base在某时某刻的绑定关系,尤为重要

    希望这篇博客能帮助你们!谢谢!轻点问候!

  • 相关阅读:
    若依项目上传下载附件实现
    若依项目实现导入功能
    若依项目开发实践
    若依项目人员选择器实现
    springboot打成Jar包后部署至Linux服务器上
    linux下启动tomcat----Cannot find ./catalina.sh
    Linux下更换jdk和配置环境变量
    若依项目分模块集成uflo2
    若依项目模块化开发
    Java中涉及到金额业务的处理
  • 原文地址:https://www.cnblogs.com/bosha/p/9344688.html
Copyright © 2011-2022 走看看