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]即杨辉三角第六行
感谢博主
张沐阳的博客