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

r = f(i) ,得到的r 是1*1,还是j*j?

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g                    
        r = f(i)          #这里r返回的是一个函数,函数内容是什么?【即:返回函数时,如何如何查看函数内容】     
        fs.append(r)                    
    return fs                           
f1, f2, f3 = count()
print f1(), f2(), f3()


正在回答

5 回答

首先在循环中的i作为的是f的实参,而f里面的g()使用的是f的形参j来定义函数,即这里的代码实现的是从变动的实参过渡到不变的形参来定义内层函数。

0 回复 有任何疑惑可以回复我~
参考这个函数:
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

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

该函数最终会返回9, 9 ,9,为什么?

在这个函数中i是count函数的局部变量

当i= 1时,i指向了1,结果返回了函数的地址放在了fs的第一个位置。

当i = 2时,又将i 指向了2,函数地址返回到了fs的第二个位置上。

当i = 3 时,i 指向了3,然后返回了函数地址在fs的第三个位置。

所以当调用函数显示的时候,i 已经是3,所以得到的结果是一样的。


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

这里count()方法返回一个list——fs,列表fs中放着3个函数,这些函数已经在count函数循环过程中动态生成,此时调用这些函数,其函数返回值都不会发生改变。

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

hzCN

在这里,r得到的时函数g,并不是1*1,在程序的流程下,调用f(1), f(2), f(3),得到1,4,9
2019-12-13 回复 有任何疑惑可以回复我~

得到的是1*1吧,这里用的闭包.我理解是这样

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

慕码人0165219 提问者

1*1也是一个函数式function吗?
2019-12-12 回复 有任何疑惑可以回复我~

f(i)的返回值哦,你看f(i)的定义,在def fi 中,最后,返回的是一个g,g是什么呢,g就是一个返回来的函数对象,函数对象,就是一个函数的对象。函数对象并没有被计算,所以不出结果,所以,返回的g(1),我这里只说了for循环的第一次,然后下一次就返回一个函数对象:g(2),再下一次for循环,返回一个g(3)。

如果我哪里理解错了,请指正。新手。。。。

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

赴约南城

至于g函数的内容,你可以去看g函数的定义,但是由于返回来的是函数,函数定义就没那么重要了,你就当返回来的是个箱子,箱子上边贴着个标签,写着1,至于箱子里怎么运算的你不用管。
2019-12-11 回复 有任何疑惑可以回复我~
#2

慕码人0165219 提问者

我知道返回的是g函数,但是我想知道返回来的函数内容是以变量的形式(j*j)存在,还是一个有具体值的计算式(1*1),因为如果是变量的话,我就比较疑惑那这种闭包为什么就能防止内部函数调用外部参数,因为这样不应该是j=i吗,最后结果也很容易就是 9 9 9
2019-12-12 回复 有任何疑惑可以回复我~
#3

战神A

r = f(i) 中将i的值赋值给了f的参数j, g引用的是g的外部函数f的变量j,g是一个闭包
2019-12-17 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

r = f(i) ,得到的r 是1*1,还是j*j?

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