Discuss / Python / 代码执行过程简单分析,看了好久才看懂真是笨得要死。

代码执行过程简单分析,看了好久才看懂真是笨得要死。

Topic source

Dreamer_DK

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

轻喷,欢迎指正

闭包第一个:

#执行
count():
    #fs=空列表list
    fs = []
    for i in range(1,4):
        #def定义跳过
        def f():
            return i*i
        #从i=1开始执行fs.append(f)
        #i=1,得到是函数f()
        #i=2,同上f()
        #i=3,同上f()
        fs.append(f)
    #返回fs=[f(),f(),f()]
    return fs

#f1=f()=i*i=f2=f3,i已经列举到了i=3了,所以都等于9
f1,f2,f3 = count()

第二个:

#执行
count():
    def f(j):
        def g():
            return j*j
        return g
    #fs=空list    
    fs = []
    for i in tange(1,4):
        #从i=1开始执行
        #i=1,执行f(1),创建临时函数g1()=g(),条件j=1,得到结果fs=[g1()]
        #i=2,创建g2()=g(),条件j=2,得到f2=[g1(),g2()]
        #i=2,同上,得到f3=[g1(),g2(),g3()]
        fs.append(f(i))
    #返回fs=[g1(),g2(),g3()],可以视作fs=[g(1),g(2),g(3)]
    return fs
#f1=g1()=1*1,f2=2*2,f3=3*3
f1,f2,f3 = courn()

第一个函数fs列表里面得到的返回值都是f()。 而第二个fs列表里得到的值其实是三个不同的运算f(1),f(2),f(3)的结果。 所以第二个表面上看起来得到的是三个g(),但实际上是f(1),f(2),f(3)函数中分别提取出来的g(),实际上是不同的。

欢迎指正。

Dreamer_DK

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

真是醉了,有些地方需要添加使之更容易看懂。 第二个分析中写的有些小错误。 第一个修正版:

#执行
count():
    #fs=空列表list
    fs = []
    for i in range(1,4):
        #def定义跳过
        def f():
            return i*i
        #从i=1开始执行fs.append(f)
        #i=1,得到是函数f(),结果fs=[f()]
        #i=2,同上f(),结果fs=[f(),f()]
        #i=3,同上f(),结果fs=[f(),f(),f()]
        fs.append(f)
    #返回fs=[f(),f(),f()]
    return fs

#f1=f()=i*i=f2=f3,i已经列举到了i=3了,所以都等于9
f1,f2,f3 = count()

第二个修正版

#执行
count():
    def f(j):
        def g():
            return j*j
        return g
    #fs=空list    
    fs = []
    for i in tange(1,4):
        #从i=1开始执行
        #i=1,执行f(1),创建临时函数g1()=g(),条件j=1,得到结果fs=[g1()]
        #i=2,创建g2()=g(),条件j=2,得到fs=[g1(),g2()]
        #i=2,同上,得到fs=[g1(),g2(),g3()]
        fs.append(f(i))
    #返回fs=[g1(),g2(),g3()],可以视作fs=[g(1),g(2),g(3)]
    return fs
#f1=g1()=1*1,f2=2*2,f3=3*3
f1,f2,f3 = courn()

也没有多大影响。


  • 1

Reply