看了廖雪峰老师的python教程,在生成器部分有一个习题,要用生成器写出一个杨辉三角,写的时候遇到了一个问题,看了下面的回复主要都是 append 和 + 的困惑,我就写了一遍,然后厚颜无耻的给别人回复了一下。
没错,就是介个厚颜无耻的人
主要的还是append 类似引用,会对原list 产生改变
在廖老师提供的校验逻辑里面 result 也是append ,这样连锁反应 L变,L变,L变了 t 也变,t都变了result 也变。
1.用append 需要改变校验逻辑,主要目的是改变指针
def triangles():
N=[1]
while True:
yield N
if len(N) ==1 :
N.append(1) # append会改变原list 也就是第一次的t 会变成[1,1]
# N = N+[1]
else:
N = [N[i]+N[i+1] for i in range(len(N)-1)]
N.insert(0,1)
N.append(1)
#校验
n = 0
results = []
first = [] #新增
for t in triangles():
if n==0:
first = [] + t # 新增这个 目的还是解除引用,相当于一个新空间 first 不会随着t变化而变化
results.append(first) #追加进result
else:
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('测试失败!')
第二 不用append 用 +
def triangles():
N=[1]
while True:
yield N
if len(N) ==1 :
# N.append(1) # append会改变原list 也就是第一次的t 会变成[1,1]
N = N+[1]
else:
N = [N[i]+N[i+1] for i in range(len(N)-1)]
N.insert(0,1)
N.append(1)
#校验
n = 0
results = []
# first = [] #新增
for t in triangles():
# if n==0:
# first = [] + t # 新增这个 目的还是解除引用,相当于一个新空间 first 不会随着t变化而变化
# results.append(first) #追加进result
# else:
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('测试失败!')
其实完全不需要判断 len(N)==1 的 if 逻辑