一个更偏数学思考的方法
Topic source因为 L=[1] 之后立刻就被yield了,所以第一输出的值一定是[1]。 然后[1]进入列表生成式,由于此时len[L]=1,不符合我设定的 if len(L) > 1,关键的来了,这里不符合我的if,结果不是这个生成式就不执行了,而是L = [],L被赋值给了一个空的list。
L = [L[i]+L[i+1] for i in range(len(L)-1) if len(L) > 1]
这个列表生成式本来就是把一个list赋值给L,由于不满足if,所以list里的值没有生成,但是此时这个空list还是被赋值给了L,取代了之前 L = [1],变成了 L = [ ],所以这时 L.insert(0,1) 和 L.append(1) 面向的是一个空的list,于是生成了 L = [1, 1],被yield
L=[1]
while True:
yield L
L.insert(0,0)
L.append(0)
L=[L(i)+L(i+1) for i in range(len(L)-1) if len(L)>2]
麻烦问一下,我这个有什么错,一直都报错。。
- 1
next_door_old-Wang
暂时还是没有领会编程的精髓吧,我是这样思考的: 一看杨辉三角,可以立刻总结出几个特点——
这样只迭代首尾之间的需要相加得到的数,然后每次再强行首尾加1,就可以逐行输出杨辉三角
完整代码如下:
列表生成式我多加了个条件
意思是,第一次执行这个生成式时,L=[1],不对其进行迭代,直接把L的第一个元素改成1且在末尾添加一个元素值为1。 这时L=[1,1],被yield,开始进入列表生成式进行迭代。此时range(len(L)-1)=1,所以只迭代一次,只产生一个值,L=L[0]+L[1],注意这里的L[0]+L[1]是指列表L的第一个元素与第二个元素的值相加,in this case L=[2],对其使用insert和append首尾加1,就得到L=[1,2,1]。 然后yield我们刚刚得到的这个L=[1,2,1],进入下一次迭代,以此类推。
PS:只是讲了一下数学角度我是怎么想的,代码本身效率和可读性都不如用L.append(0)实现的好~可是我虽然理解了那个方法,还是不知道是怎么一开始能想到那种方法的......