为了账号安全,请及时绑定邮箱和手机立即绑定

有人能解释一下这段代码吗?完全看不懂

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        r = f(i)
        fs.append(r)
    return fs
f1, f2, f3 = count()
print f1(), f2(), f3()

正在回答

5 回答

聪明啊,我去!你这样理解,从结果推,count() 返回的是一个列表,列表里是3个还没被执行的函数,f1,f2,f3 也就是依次添加进列表里的 r 。r是什么,f(i),参数为i的一个函数,这里是重点,它的参数是i,再看函数体,返回的是一个计算i平方的函数g ,只计算当前参数i的平方的函数。也就是你不管i怎么变化,返回的列表中3个元素是已经定住了,就是f(1) f(2) f(3) 这3个函数

1 回复 有任何疑惑可以回复我~

个人理解,闭包就是在外部函数运行一次后,再将临时变量付给内部函数.这样如果是

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

的话,count执行一次后,内部f()的确执行3次,但是只有在count完成后才会把i=3赋给各个f()函数,所以结果全是9.

改用:

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        r = f(i)
        fs.append(r)
    return fs

的话,对于f()和g()形成闭包,f()每运行一次,g()运行一次,f()完成后,便会把j (j的值依次从i中得到) 的值赋给g()函数,进而使得1,2,3依次传给g(),结果成为1,4,9.


5 回复 有任何疑惑可以回复我~

首先看最里层函数g(),调用了函数f的参数后返回g函数,也就是返回一个数j的平方;再看函数f(),f里调用了函数g,也就求出了一个函数的平方,之后将f(i)传给r,此时r=i^2,fs=r;而对于for循环,是i=1,2,3时‘分别’进行了平方并返回平方得到的值,也就是说,循环后得到3个r的值,fs为3个值;之后,count函数返回了fs的值。最后f1,f2,f3=count()调用了函数count,则得到1,4,9。

这一过程与不定义函数g的主要区别在于,不定义g时f的参数i是可变的,会先进行i变换后再调用f,而定义g后参数j不变,也就是完整呈现出了一个平方运算,也就得到预期效果。

0 回复 有任何疑惑可以回复我~

 def f(j):
            def g():
                return j*j
            return g

就是返回一个可以计算平方得函数。


0 回复 有任何疑惑可以回复我~

就是求平方啊

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

有人能解释一下这段代码吗?完全看不懂

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信