zoukankan      html  css  js  c++  java
  • 廖雪峰老师博客学习《通过生成器generator生成列表式杨辉三角》

    • 说明:这是我接触生成器概念后,自己对它的理解,可能比较表面,没深入理解,也可能有错误。后续校正错误认知,将有关generator作为一个tag了!
    • 希望以后能活用。
    • 先贴出自己写的triangles()生成器,习题需求查看url页面最后:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000
    • #在线编辑器真难用!!
    • # /usr/bin/env python3
      # coding:utf-8
      # author:zhangjiaqi<1399622866@qq.com>
      
      
      def triangles():
          lt = [1]
          while True:
              yield lt
              if lt.__len__() == 1:
                  lt.append(1)
              else:
                  len = lt.__len__()
                  tmplist = [v for v in range(len-1)]   #构建一个临时列表,临时列表相较于最后生成,去掉了头尾。
                  for n in range(len-1):
                      tmplist[n] = lt[n] + lt[n+1]
                  lt = [1] + tmplist + [1]
      
      
      if __name__ == '__main__':
          g = triangles()
          for i in range(10):
              print(next(g))
      • 运行结果
    [1]
    [1, 1]
    [1, 2, 1]
    [1, 3, 3, 1]
    [1, 4, 6, 4, 1]
    [1, 5, 10, 10, 5, 1]
    [1, 6, 15, 20, 15, 6, 1]
    [1, 7, 21, 35, 35, 21, 7, 1]
    [1, 8, 28, 56, 70, 56, 28, 8, 1]
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
    • 思路:
      • 首先,杨辉三角,除了第一行和第二行之间没发现规律,就已特例直接产生
      • 然后,从第三行开始,出去头尾的元素,中间元素是前一行列表元素两两的和,那么我就构造一个中间元素的临时列表,然后根据前一行列表产生临时列表的值
      • 最后,给中间元素列表头尾添加上[1],这样就产生了后续列表的算法。
    • 别人的思路:网上的思路是发现这样一个算法规律:后一行是用前一行构造两个分别是头尾加上[0]的列表,然后两个列表zip()一下。就得到需求列表。
      • 思路不同,用到的实现手法就不同。
      • 见识了zip()的应用。什么叫人生苦短,****!
      • 自己的思路就没那么简洁。
    • 解剖一下和生成器generator有什么好处(比较表面):
      1. 从产生和存放杨辉三角的角度,来说说generator:triangles()函数完全可以不用yield,例如通过一个行数参数打印输出一个杨辉三角(这就需要在一个变量来存放一个完整的杨辉三角,最后再return整个杨辉三角)。使用yield,函数就返回了一个生成器对象,这个对象又是可迭代的,通过迭代再输出杨辉三角。前者通过函数时就生成了杨辉三角存放到内存中,然后从打印输出;后者这是一边生成一遍输出,根本就没有在内存中存放完整的杨辉三角。可以说生成器就是节约内存存储空间
      2. 看到上面,有人就会说了,就算不是使用生成器,将函数只返回指定的行,然后再循环调用输出,就不用在内存中存放一个完整的。确实,但是生成器还有一个特点就是可迭代,直接就可以用for 语句,那就是可迭代的优点了。
      3. 初学 者能力有限,感觉自己也没真正解剖出来。
  • 相关阅读:
    软考解析:2014年上半年下午试题
    软考解析:2014年下半年下午试题
    软考解析:2015年下半年下午试卷
    软考解析:2015年上半年下午试卷
    怎样完善和推广自己的理论模型?
    怎样完善和推广自己的理论模型?
    Android开发——常见的内存泄漏以及解决方案(一)
    聊聊Android5.0中的水波纹效果
    JVM——自定义类加载器
    JVM——Java类加载机制总结
  • 原文地址:https://www.cnblogs.com/ZJiQi/p/8535091.html
Copyright © 2011-2022 走看看