来自廖雪峰的python3教程——生成器的课后练习,题目可点击以下网址查看:
廖雪峰的python3教程——生成器
在评论列表中看到了这样的答案:
def triangles():
L = [1]
while True:
yield L
L.append(0)
L = [L[a - 1] + L[a] for a in range(len(L))]
初看没什么问题,但是执行的时候却显示测试未通过。
原来是results的结果不对,预想中的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]],但实际的结果是results=[[1, 0], [1, 1, 0], [1, 2, 1, 0], [1, 3, 3, 1, 0], [1, 4, 6, 4, 1, 0], [1, 5, 10, 10, 5, 1, 0], [1, 6, 15, 20, 15, 6, 1, 0], [1, 7, 21, 35, 35, 21, 7, 1, 0], [1, 8, 28, 56, 70, 56, 28, 8, 1, 0], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]]。
今天空闲时把代码调试了一下,发现是列表append列表的原因。
举例:
L = [1,2,3,4]
O = [5,6,7]
L.append(O)
print(L) #结果是[1,2,3,4,[5,6,7]]
#这时给列表O添加一个元素
O.append(8)
print(L) #结果是[1,2,3,4,[5,6,7,8]]
#若使用O = O + [9]
O = O + [9] #此时O = [5,6,7,8,9]
print(L) #发现L仍为[1,2,3,4,[5,6,7,8]]
在廖雪峰的课后题中,results,t,L都是列表。
yield返回L的值给t后,每一次迭代t的值正确显示,但是在triangles中,yield之后L是做了append(0)操作的,因此results.append(t)中的t指向的是append(0)后的L。
所以除了最后一个元素还没来得及append(0)外,results其余所有的元素都相当于做了append(0)操作。
解决办法:
把 L.append(0) 改成 L = L + [0] 就通过测试了。
有不足之处,还请大神们指正。