刚学python求解一个问题

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

这里定义了一个函数count()

def count1():
    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

这里定义了一个count1()

这两个函数有区别么?

我在调用的时候发现count()和count1()结果一样,但是

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

通过这样调用的话count1()正常 count()却报错是为什么

Traceback (most recent call last):
  File "C:/Users/amos/PycharmProjects/untitled/1.py", line 10, in <module>
    print f1(), f2(), f3()
TypeError: 'int' object is not callable
阅读 2.5k
3 个回答

如果分别print两个函数,它们的结果是不一样的:

[1, 4, 9]
[<function g at 0x01B49F30>, <function g at 0x01B49EF0>, <function g at 0x01B49F70>]

count()返回的是一个带有3个数字的list,也就是函数中fs这个对象里append3个数字。
count1()则是3个函数。
为什么?

注意你的count1()里有一句return g,它直接returng这个函数对象本身,而不是g的执行结果。
return g改成return g(),则count1()的返回结果就和count()一样了。

至于你报错的问题,按照我上面说的改后,count1()也同样会报错,因为你的f1, f2, f3获取的三个结果都是int,所以不能加个括号像方法一样直接调用。

count返回的是数值,count1返回的是函数引用。报错说得很明显,数值int是没办法调用的

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
                return j*j
        r=f(i) #调用函数,直接得到结果, r为一个整型数
        fs.append(r) #把结果放入list
    return fs

def count1():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():  #又定义了一个函数
                return j*j
            return g #返回一个函数,f就是一个高阶函数
        r=f(i) #因为f函数调用后返回一个函数,所以r还是一个函数
        fs.append(r)
    return fs

f1, f2, f3 = count()
g1, g2, g3 = count1()

#打印类型
print type(f1),f1,f2,f3

print type(g1),g1(),g2(),g3()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题