Discuss / Python / 疑惑求解答

疑惑求解答

Topic source

白霓裳酱

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

其实我个人感觉两种写法返回的结果是一样的,虽然中间过程的逻辑不一样。 第一种 def triangles1(): L =[1] while 1 : yield L L.insert(0,0) L.append(0) L=[L[i]+L[i+1] for i in range(len(L)-1)]

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

第一种写法,第一次循环L=[1],第二次循环时,会先被insert和append,变成[0,1,0],在进行最后一步计算时,len(L)-1是为2的,那么i就是range(2),也就是[0,1],此时L[i]和L[i+1]都是有意义的。 但第二章写法我个人感觉逻辑上就有问题的。因为顺序不同,L=[1]时,range(len(L)-1)是range(0,0),如果装入列表的话,是为空的.L2=list(range(len(L)-1))既L2 []。那么此时L[i]+L[i+1]是无法取值的。但很奇怪,如果单独进行类似这样引索取值的话,是会报错的,但在此循环中并没有报错?????? 综上,虽然第一种写法逻辑上与杨辉三角有一定不同,但最后的运算结果是一样的,而第二种写法逻辑上更贴近杨辉三角,但在第二次循环上我个人觉得是有问题的,求大神解答!!!!

随安小生

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

第二种是对的,因为第一次循环没有进行,i为None ,其实就是L=L[] for i in range(0,0): print('--') 你可以测试一下,这个循环并没有运行,所以i不是0! 后面的也就可以解释通了

def triangles1():
    L =[1]
    while 1 :
        yield L            // 到这里数据是没问题的
        // 问题在下面两句,因为下次循环调用next()后,L引用的数据前后被追加了0,导致最后的结果不是每次中断时你预料的值。防止这种陷阱,注意对已返回的数据不要再做修改,抛弃L指向对象的引用。
        L.insert(0,0)
        L.append(0)
        // 下面操作L被重新指向新的对象,原引用被抛弃了
        L=[L[i]+L[i+1] for i in range(len(L)-1)]

  • 1

Reply