在学习廖雪峰的python教程的时候,讲到生成器的时候,有一道练习是这样的:
练习
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
测试代码如下:
# 期待输出:
# [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]
n = 0
results = []
for t in triangles():
print(t)
results.append(t)
n = n + 1
if n == 10:
break
if results == [
[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]
]:
print('测试通过!')
else:
print('测试失败!')
这道题一开始我是用这样的方法解决的:
def triangles():
L = [1]
while True: # 进入持续循环
yield L # 输出数组
L.append(0) # 为数组添加最后一位
L = [L[i - 1] + L[i] for i in range(len(L))]
输出如下:
没想到竟然测试失败,试下把断点打到main函数里面看看results里面是啥:
为什么会多出一个零?
因为在triangles函数中,每次都会在L的末尾加上一个零,python中List是一个可变对象,因为每一次将当前List拷贝进去results的时候只是浅拷贝,可以理解成只拷贝了一个指针,因此加上一个零的操作会影响results中的List。
解决方法
直接贴代码了,其实就是加上了一个切片操作。
def triangles():
L = [1]
while True: # 进入持续循环
yield L[:len(L)] # 输出数组
L.append(0) # 为数组添加最后一位
L = [L[i - 1] + L[i] for i in range(len(L))]
测试通过