Discuss / Python / 解析,代码为什么这么写——

解析,代码为什么这么写——

Topic source

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

这个题的核心思路不在于L[i - 1] + L[i],这个属于数学思维,核心思路在于L.append(0)(或类似于L = [*L,0]等)这一行代码,也就是每次都在list末尾添加一个0,用于让每行的首尾等于1并让列表生成式的计数器+1(len()),能想到这一点的一定要有对list有着非常深刻的理解。

拿到题后的解题思路: 1、因为杨辉三角每一行都要输出N个数值,首先一定要有一个list来装载,所以我们先得建立一个L。 2、由于第一行只有一个值,是可以不用做任何计算的(因为第一行上面没有任何数值,想通这一点不算难),到时候直接输出即可,所以我们建立一个L = [1]。 3、好了,想到前面两步其实并不难,难的是怎么用代码来实现这个数字几何图呢?其实初中数学老师当初有教我们杨辉三角的公式要点:每个数字等于上一行的左右两个数字之和,左右两个数之和?嗯,在list不就是用L[i - 1] + L[i]来表示吗? 4、OK,只要你能想通第3步的话,其实思路已经清晰了一半了,我们每次上一行左右相加得到的新数字组合起来都可以存在一个新list里,比如第一行是L1,第二行是L2,第3行是L3……最后把每一行再存在一个大list里,这里我称为“L_BaBa”这样到时候直接返回这个“L_BaBa”循环打印就可以了。但是这样做太麻烦,也并不可取。有没有每次都能重复改写同一个list的方法呢?答案是有的,那就是每次都用列表生成式重复生成这个list(这也是为什么上一章学习内容是列表生成式的原因。) 5、因此我们稍加思索,就能得出L = [L[i - 1] + L[i] for i in range(……)],括号里写的就是我们想要的杨辉三角行数,但是这里我们写的生成器函数def triangles():是没有接收任何传进来的值的,该怎么办呢?有的人说对了,这里我可以定义一个计数器i,每调用一次然后i = i + 1不就可以了吗?方法是可以的,但是仔细一看杨辉三角的几何图,你会发现杨辉三角每一行的元素的个数正好等于行数,所以我们这里可以用len(L)获得的元素个数来代替行数,所以就有了: L = [L[i - 1] + L[i] for i in range(len(L))] 这样也就简化了代码。

加上之前提到的核心思路L.append(0),就可以写出这段代码了。

huhewen

#2 Created at ... [Delete] [Delete and Lock User]

为什么输出的result每行都有个0

L = [L[i - 1] + L[i] for i in range(len(L))] 这句代码有点疑问。
生成新的L元素时,使用的是也是L的元素,为什么没有覆盖呢? 例如 L = [1,2,1,0]生成 [1,3,3,1]时,生成第一个3之后,原来的2应该被覆盖了。

厉害了,点赞。学习了。

对list的倒数第一位[-1]的使用和设置为0的思路很绝

L = [L[i - 1] + L[i] for i in range(len(L))] 这句代码有点疑问。 生成新的L元素时,使用的是也是L的元素,为什么没有覆盖呢? 例如 L = [1,2,1,0]生成 [1,3,3,1]时,生成第一个3之后,原来的2应该被覆盖了。 这个我也有点疑问,L不应该是两个对象啊,同一个变量名。

果壳19991

#7 Created at ... [Delete] [Delete and Lock User]

还有一个问题哈,就是二维list results保存的每个list,除最后一个外,每个list末位都带了一个零,请问大神还有办法改进嘛????

应该采用深拷贝,要不然results末位都会有个零

def triangles(): L = [1] while True: yield L temp = L.copy() temp.append(0) L = [temp[i-1]+temp[i] for i in range(len(temp))]

羽靑云

#9 Created at ... [Delete] [Delete and Lock User]
def triangles():
    L = [1]
    while True:
        yield L
        LC = L + [0]
        L = [LC[i-1] + LC[i] for i in range(len(LC))]

姚东旭-

#10 Created at ... [Delete] [Delete and Lock User]
L = [1]
while 1:
    yield L
    L1= [0] + L + [0]
    L = [L1[k] + L1[k + 1] for k,v in enumerate(L1) if k < len(L1) - 1]

  • 1
  • 2

Reply