廖雪峰老师博客学习《通过生成器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 2 3 4 5 6 7 8 9 10 | [ 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有什么好处(比较表面):
- 从产生和存放杨辉三角的角度,来说说generator:triangles()函数完全可以不用yield,例如通过一个行数参数打印输出一个杨辉三角(这就需要在一个变量来存放一个完整的杨辉三角,最后再return整个杨辉三角)。使用yield,函数就返回了一个生成器对象,这个对象又是可迭代的,通过迭代再输出杨辉三角。前者通过函数时就生成了杨辉三角存放到内存中,然后从打印输出;后者这是一边生成一遍输出,根本就没有在内存中存放完整的杨辉三角。可以说生成器就是节约内存存储空间。
- 看到上面,有人就会说了,就算不是使用生成器,将函数只返回指定的行,然后再循环调用输出,就不用在内存中存放一个完整的。确实,但是生成器还有一个特点就是可迭代,直接就可以用for 语句,那就是可迭代的优点了。
- 初学 者能力有限,感觉自己也没真正解剖出来。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步