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

关于执行和调用的问题,谢谢回答。

此题,如图1,2,

58759a3200012c6b05000165.jpg

58759a330001b1ee05000179.jpg

图2在执行的时候报错:TypeError: 'int' object is not callable。debug结果,f1,f2,f3结果为1,4,9,在指向count()的时候就已经执行完并计算完毕,所以不需要再进行f1(),f2(),f3()的调用了是吗?去掉()调用之后,结果就正确了。

图1,给出的f1,f2,f3的值均为引用的地址,但是这个地址到底是谁的地址?进行调用的时候,才能去执行,执行的谁,i,j的值到底是多少?

这个题实在是不太明白了,其实问题还是在调用上是吗?

正在回答

3 回答

def count():
    fs = []
    for i in range(1, 4):
        print('查看i的值:',i)  #查看i的值

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

        r = f(i)
        print('查看r的值:', r)   #查看r的值
        fs.append(r)
    return fs

print ('创建f1,f2,f3')  #提示创建f1,f2,f3
f1, f2, f3 = count()   

print ('输出f1,f2,f3')  #提示输出f1,f2,f3
print(f1(),f2(),f3())

谢谢你的认真让我仔细研究了很久。你看看我详细给你的解释,也许你就懂了。你贴的图和问题说的不是很详细,我就不好和你解释。请看这段我注释和几个添加了print的代码。f1, f2, f3 = count()中为何要有3个元素f1, f2, f3?因为count()返回的是fs,而fs是什么?是列表。什么列表?有3个元素的列表。为什么有3个元素?因为for语句的rang(1,4)。所以相当于

f1,f2,f3=[ 值,值 ,值 ]。所以f1, f2, f3中你不能多写一个f4或少写f1, f2, f3其中任何一个,因为你要分别匹配[ 值,值 ,值 ]3个。好,现在我问你列表里的值是什么?是[1,4,9]?哈哈,错了,不是,你可以看到r输出的是<function count.<locals>.f.<locals>.g at 0x10067bae8>  之类的(有3个)。我们来分析r = f(i)。首先第一个循环,i=1,那就是f(1),请问f(1)返回的给r的是什么?看到return g没有?是g,也就是g()函数的地址,f1-->r-->g,f1指向的是g的地址。剩下的i=2、i=3一样。所以r就是g()函数的地址。fs.append(r)就是将r追加到列表fs[]中,所以输出r你看到的是以下输出:

[<function count.<locals>.f.<locals>.g at 0x10067bae8>, <function count.<locals>.f.<locals>.g at 0x10067ba60>, <function count.<locals>.f.<locals>.g at 0x10067bb70>]

看到了吗?[地址,地址,地址]。ps:g的地址为什么不同?因为你创建循环3次调用了f(),自然调用了3次g()

终于最后一步了:print(f1(),f2(),f3()),你会问为什么f1还要加上()。f1指向的是g的地址,所以f1()表示什么?表示是g()。i=1,传参数给j。所以g()就返回1*1(return j * j)。同理f2()=2*2,f3()=3*3.

望采纳,共勉~

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

zz幻念 提问者

谢谢你的回答,非常有心。
2017-01-19 回复 有任何疑惑可以回复我~
#2

Matthew_CQ 回复 zz幻念 提问者

应该哒,预祝新年快乐~
2017-01-19 回复 有任何疑惑可以回复我~
#3

Aeceus

醍醐灌顶,真的谢谢
2017-01-22 回复 有任何疑惑可以回复我~
#4

Matthew_CQ 回复 Chaelin

j是形参,i是实参。每次循环执行f(1)、f(2)和f(3)时其实就是i=1、2、3传参数给j然后执行函数return j*j。
2017-02-04 回复 有任何疑惑可以回复我~
查看2条回复

http://img1.sycdn.imooc.com//58771f190001638615421546.jpg

附上图

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

这里你把f1,f2,f3和f1(),f2(),f3()搞混了。。。注意你的图2中你写的是x=f(i),而f(i)不就是调用了f函数吗,所以x的值是f函数调用以后的返回值,也就是1,4,9,所以你添加到fs中的其实是这3个int型的整数。但是你最后print的时候,又是调用的f1(),f2(),f3(),要知道这个时候f1是整数1,f2是整数4,f3是整数9,整数当然是不可调用的了。所以报错信息是'int' object is not callable。

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

举报

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

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

进入课程

关于执行和调用的问题,谢谢回答。

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