Python生成杨辉三角

 

正题部分

先上代码

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

解释
通过观察杨辉三角可知,下一行的每一个元素都依次由本行中每两个相邻元素之和得到,这个方法可以用一个技巧实现,即:将本行list拷贝出两个副本,将两个副本错1位,然后加在一起。由于错位后,前后各多了一个元素,所以要在错位后的两个list的前后各加一个[0]来补齐(其实,这个0是理所当然的,是杨辉三角的一部分)。

如下图,同一行中前后相邻两个元素相加(这是杨辉三角的构成规则),就相当于两个本行元素错位相加。而zip方法,就是从这两行中分别取出第i个位置的元素组成元组(这也是添“0”的原因)。sum()函数正好求出它们的和,进而求出了下一行。然后用yield函数把这一行“塞入”generator–也就是本例中的triangles()

一点微小的改进

def triangles():
    a = [1]
    while True:
        yield a
        a = list(map(lambda x, y: x + y, [0] + a, a + [0]))  # 此处改为使用Python内置的map函数

以下为输出部分的代码:

n = 0
for t in triangles():
    print(t)
    n = n + 1
    if n == 10:  # 此处,我们只想输出杨辉三角的前10行
        break

注:特别感谢id名为风袭6729的网友提供的原始代码;以及id名为昙华洛少FaiChou的网友提供的改进意见。