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

这段程序的执行过程,谁能解释一下,没看懂

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()


正在回答

4 回答

说说我的理解:原来因为延时调用导致i直接变成3,现在在for循环中新定义一个可以传入变量的函数,然后里面再套上计算这个变量平方的函数,这样一来变量就被保存下来了

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

fs列表里存放的内容是 通过for循环出来的三个函数对象f(1) f(2) f3(),而f(1) f(2) f(3) 每个里面又定义了一个g()函数并且被返回出来,当最后一行f1(),f2(),f3()执行时,最终执行的是每个g()函数体,我大概就是这么理解的

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

参考一师兄的问答:

r = f(i),而def f(j)的j是用来代替可变参数i的,当r取值为1的时候,j也变为1,运行def f(j = 1)的函数,然后代入到def g函数中,得出结果,返回结果。

原文比我说得好,不过忘了那个问答是哪个了,你可以自己查看下哈



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

也是初学,我的理解是:

f1,f2,f3 = count()   count()返回的是fs  是一个列表,所以这个可能就是像x,y = 2,3这样的赋值,不知道是不是元组拆包?  然后打印f1()  注意r = f(i) fs.append(r)  列表fs中添加的是r ,而r 是一个函数f(i),   i in range(1, 4),值为1,2,3,所以f(j) 函数被调用,把i的值传给j  ,返回g,  那就调用g()函数,g() 返回 j*j, 其实就是实参i * i,返回了1,4,9 分别对应 f1(), f2(), f3()

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

举报

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

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

进入课程

这段程序的执行过程,谁能解释一下,没看懂

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