正题部分
先上代码:
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的网友提供的改进意见。
PREVIOUS有一种爱,在定义之外
NEXT浅析decorator