Python生成器实现杨辉三角

在学习廖雪峰的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里面是啥:
可以看到每一项的末尾都多出了一个0

为什么会多出一个零?

因为在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))]  

测试通过

猜你喜欢

转载自blog.csdn.net/doctor_fung/article/details/81231491