声明:
我写此文的目的是帮助和我一样在廖雪峰老师官网上学习Python3的同学更好的理解和学习Python的知识,所以本博文及后续文章会跟着我的学习进度来走,主要内容是廖雪峰老师官网Python资料中每节知识点后的复习题的答案和解析,有一些是我自己原创的,有一些是网上整理的大神写的简洁但对新手并不是很明了的答案,我会尽可能的给出我的解析。*
题目
杨辉三角定义如下:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
把每一行看作一个list,试写一个 generator,不断输出下一行的list。
期待输出:
[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] n=0 for t in triangles(): print(t) n=n+1 if n == 10: break
答案 1
def triangles(): a=[1] while True: yield a a=[sum(i) for i in zip([0]+a,a+[0])] n=0 for t in triangles(): print(t) n=n+1 if n == 10: break
解析:
在讲解答案之前首先要给大家简单的讲解 zip() 这个函数,举个例子: x = [x1 ,x2] y = [y1, y2] zip( x , y ) = [( x1 , y1 ) , (x2 , y2)] 这个答案的解决想法就是 “ 错位 ”,借助的是 zip() 函数实行 “ 错位 ”,最后 利用 sum() 函数相加。 我们模拟一下代码初次运行: 1行,定义 triangles() 2行,给 a 赋值,题目要求输出 list ,所以我们赋值就是一个 list,注意,此时 a= [1] 4行,函数遇到 yield, 返回a=[1] 的值 ps: 这块比较抽象 5行,我们把这行代码分开分析,zip([0]+a , a+[0]) 等价于zip([0]+[1] , [1]+[0]),既 zip([0,1] , [1,0])=[(0 , 1) , (1 , 0) ] , 所以 a = sum(i) = [(0 + 1),(1 + 0)]=[1 , 1], 这样,杨辉三角的第二行就出来了。 其余的代码并不是很难所以就留给你们自己思考(其实很简单啦Q,Q!)
答案 2
def triangles(): a = [1] while True: yield a a=[sum(i) for i in zip([0] + a,a + [0])] if __name__ == "__main__": g=triangles() for n in range(10): print(next(g))
解析:
这个答案和上面的思路是一样的,只是输出的部分很有趣,因为也是刚接触,怕说不好,所以留个坑等我琢磨一下再来填上。
答案 3
def triangles(): N=[1] while True: yield N N.append(0) N=[N[i-1] + N[i] for i in range(len(N))] n=0 for t in triangles(): print(t) n=n+1 if n == 10: break
解析:
当我在廖雪峰老师官网上看到有人给出这个答案的时候很震撼,因为这个答案原理虽然和上面的一样都是“错位相加”,但是上面用到的是我们没接触过的zip()函数,而这个答案完全就是用廖雪峰老师前面讲过的非常基础的知识解答出来的。
还是让我们过一遍代码:
1行,定义函数 2行,给N赋值 4行,函数遇到yield返回N=[1] 5行,给N添加一个元素,此时N=[1,0] 6行,高潮来啦,还是分开讲,range(len(N))=[0,1], so, N = [N[i-1]+N[i] for i in [0,1]] so, N = [N[0-1]+N[0] , N[1-1]+N[1]] so, N = [0+1 , 1+0] = [1,1]
这样,杨辉三角的第二行就出来啦!
其他答案
def yanghui(max): n=[[1]] yield(n[0]) while len(n)<max: n.append([1]+[ n[len(n)-1][m]+n[len(n)-1][m+1] for m in range(len(n)-1) ] +[1]) yield(n[len(n)-1]) for y in yanghui(6): print(y) 结果输出 [1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1]
def triangles(s): L = [1] while len(L) < s: yield L L = [1] + [L[x] + L[x + 1] for x in range(len(L) - 1)] + [1] for i in triangles(10): print(i) 结果输出 [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]
出处:http://blog.csdn.net/zmy_3/article/details/51173580
未经允许请勿转载:程序喵 » Python扩展教程 —— 生成杨辉三角讲解