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

1、不懂为什么函数def f(x),的x是怎么获取到i的值进行相乘的,2、为什么最后是fs.append(f(i))而不是fs.append(f(x))呢?3、为什么把fs.append(f(i))改成fs.append(f)就没有值输出了呢?4、f1,f2,f3 = count() 的意思是把f1、f2、f3个变量指向给变量count函数,最后把i值赋值给f1 f2 f3吗?菜鸟一个请大神指点

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

f1, f2, f3 = count()
print f1, f2, f3

 

正在回答

3 回答

我是先按照楼主那样写的(悄悄咪咪地把print后面f1(),f2(),f3()的括号删掉了),因为发现这样写出来的话f1-f3都是数字了;那么就想着改进:让f1-f3调用一次函数后才得到数字(大概就是课程里讲的延迟吧),于是乎在f函数的定义中又加了一层g()让返回的f1-f3经过一次调用后才出结果

#注意返回函数时是return g不是return g()(这样的话就是直接调用了g函数了)

def count():

    fs = []

    for i in range(1, 4):

        def f(a):

            def g():

                return a*a

            return g

        fs.append(f(i))

    return fs


f1, f2, f3 = count()

print f1(), f2(), f3()


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

Shelena

解释的很清楚
2018-08-10 回复 有任何疑惑可以回复我~

1、在fs.append(f(i))的时候,调用了函数f,把变量i当成参数传入x了。

2、f(x)中x是形参,i是实参,在for in 循环里用的是i表示1/2/3,那么调用的时候应该用f(i)

3、fs.append(f(i))用到函数f,f(i)是给了参数的 ,输出肯定有值,fs.append(f)没给f参数,故没有输出

4、解决上面3个问题,第4个你自己捋捋应该能明白。最后count函数返回的是一个【1,4,9】的list数组,f1 ,f2,f3分别对应其中元素。

我个人觉得,这段程序和示例中的典型闭包有区别。在这段里,外层函数返回的不再是定义的内层函数,而是调用内层函数以后得到的结果。大家一起讨论讨论呀

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

f(i)就是获取到了i值啊,把i作为参数调用函数f。而fs.append(f(x))你自己也说了,x是函数f的变量,而在for循环里没有x变量,只有i变量啊!

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

举报

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

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

进入课程

1、不懂为什么函数def f(x),的x是怎么获取到i的值进行相乘的,2、为什么最后是fs.append(f(i))而不是fs.append(f(x))呢?3、为什么把fs.append(f(i))改成fs.append(f)就没有值输出了呢?4、f1,f2,f3 = count() 的意思是把f1、f2、f3个变量指向给变量count函数,最后把i值赋值给f1 f2 f3吗?菜鸟一个请大神指点

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号