练习
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
# -- coding: utf-8 --
# 期待输出:
# [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():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
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('测试失败!')
链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
- 大神代码
def triangles():
L = [1]
while True:
yield L
L = [1] + [x + L[i + 1] for i, x in enumerate(L[:-1])] + [1]
def triangles():
arr = [1]
while True:
yield arr
arr = [1] + [arr[i] + arr[i + 1] for i in range(len(arr) - 1)] + [1]
- 一个小问题
def triangles():
N = [1]
while True:
yield N
N.append(0)
N = [N[i]+N[i-1] for i in range(len(N))]
这段代码看似没有问题,但是当运行这段代码时,却出现这样的问题:
[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]
测试失败!
在前九个列表最后分别都加了一个0
我换一种打印的办法:
def print_triangles():
n = 0
for t in triangles():
print(t)
n += 1
if n == 10:
break
就测试成功了!
比较两段打印的代码,发现就只是直接输出和合并到一个新的列表中输出的区别
#原来的 #新的
n = 0 n = 0
results = [] for t in triangles():
for t in triangles(): print(t)
results.append(t) n += 1
n = n + 1 if n == 10:
if n == 10: break
break
for t in results:
print(t)
Python中yield的中断机制导致list.append之后元素值改变
所幸我看到了这篇文章,刚好就是我遇到的这个问题。
主要是因为yield有中断机制,运行到这里,就会停掉,当再次调用next()时,又会从中断的地方继续执行下去。results里记录的t指向的是N的地址,再次调用next()之后,代码往下执行,当N后append(0)之后N的值就改变了,因此results里对应的t的值也就改变了,最后导致了输出结果错误。