用generator写杨辉三角

def triangles():
    L = [1]
    while True:
        yield L
        L = [sum(i) for i in zip([0]+L, L+[0])]

首先储存杨辉三角第一行:1

然后用生成器计算出之后的所有行:

zip()函数求出两个参数对应项匹配起来,例如:

x = [x1, x2]
y = [y1, y2]
zip(x,y) = [(x1, y1), (x2,y2)]

zip()函数详情
点击这里

函数第一次运行到

L = [sum(i) for i in zip([0]+L, L+[0])]

时,L为[1], zip( [0]+L, L+[0] )等价于zip( [0]+[1], [1]+[0]),  即zip( [0, 1], [1, 0] ),匹配为[ (0, 1), (1, 0)]

通过列表生成式List Comprehensions)得到L = [1, 1],这样杨辉三角第二行便计算完成了

依次循环得到更多行的杨辉三角。

def triangles():
    L = [1]
    while True:
        yield L
        L = [1] + [x+y for x,y in zip(L[:-1],L[1:])] + [1]

这段代码不同处在于

L = [1] + [x+y for x,y in zip(L[:-1],L[1:])] + [1]

更容易理解,zip()传入的参数是两个切片得到的list

L[: -1],原应写作L[0: -1],意为从第一个元素开始索引到最后一个元素为止(不包括最后一个元素)

L[1:],意为从第二个元素开始(第一个元素下标记为0),索引完整个列表(包括最后一个元素)

我们取杨辉三角第五行为例:1 4 6 4 1

L[: -1]得到[1, 4, 6, 4]    L[1:]得到[4, 6, 4, 1]

那么下面一段代码

[x+y for x,y in zip(L[:-1],L[1:])]

就会得到[5, 10, 10, 5],再依照代码前后各加上[1],就变成了[1, 5, 10, 10, 5, 1]即杨辉三角第六行

感谢博主
张沐阳的博客

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/S_E_iTachi/article/details/79163943
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞