廖雪峰—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:

# -- 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

  1. 大神代码
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]
  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的值也就改变了,最后导致了输出结果错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值