Discuss / Python / 一个更偏数学思考的方法

一个更偏数学思考的方法

Topic source

暂时还是没有领会编程的精髓吧,我是这样思考的: 一看杨辉三角,可以立刻总结出几个特点——

  1. 首尾都是1。于是我会考虑用
L.insert(0,1)
L.append(1)
  1. 首尾之间的数都是上一行的数相加得到的。我会考虑用
for i in range(len(L)-1):
    L=L[i]+L[i+1]

这样只迭代首尾之间的需要相加得到的数,然后每次再强行首尾加1,就可以逐行输出杨辉三角

完整代码如下:

def triangles():
    L = [1]
    while True:
        yield(L)
        L = [L[i]+L[i+1] for i in range(len(L)-1) if len(L) > 1]
        L.insert(0,1)
        L.append(1)

列表生成式我多加了个条件

if len(L) > 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)实现的好~可是我虽然理解了那个方法,还是不知道是怎么一开始能想到那种方法的......

第一次执行这个生成式时,L=[1],不对其进行迭代,直接把L的第一个元素改成1且在末尾添加一个元素值为1。

第一次不迭代按照下面走下去不应该是[1,1,1]吗,求解释

因为 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

Reply