杨辉三角python 生成器实现
记录python学习过程中的问题:
问题描述,在利用python Regenerator 实现杨辉三角的过程中出现一个问题,经过几个小时的思考终于解决了这个问题。记录一下,并希望对以后有帮助:
问题:
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
##初始代码
def triangles():
m = -1
L = [1]
while (True):
yield L
m = m + 1
if m <= 0:
L.append(L[0])
else:
L1 = [1,1]
for i in range(m):
num = L[i] + L[i+1]
L1.insert(-1,num)
L = L1
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
print(results)
#
for t in results:
print(t)
输出结果:
[1, 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]
修改后的代码
def triangles():
m = -1
L = [1]
#yield L
while (True):
yield L
m = m + 1
if m <= 0:
L1 = [1,1]
else:
L1 = [1,1]
for i in range(m):
num = L[i] + L[i+1]
L1.insert(-1,num)
L = L1
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
print(results)
#
for t in results:
print(t)
```c
输出结果:
[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]
讨论
可以发现两个代码主要的差异在于第一行list的输出,经过反复Debug调试,发现代码问题出在此行代码:
L.append(L[0])
调试至此行代码时:
results中的结果会从 [[1]] 变为[[1,1]]。而此时L的结果为[1,1]。因此,初不判断,yield中断输出后,再返回继续执行代码的过程中,L的改变会继续影响上一次中断输出的值。因此这时候就需要避免在下次yield中断输出前对L进行操作(可从改进代码中看出)。