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

难以理解yq

fs是一个lst,[1,4,9],那f1,f2,f3应该都是[1,4,9]哇?

正在回答

3 回答

我就直接写在代码过程里面吧

跟着程序进入的思路来

def count():
    fs = []                #>2.此时是空list
    for i in range(1, 4):  #>3.这里是重点,开始循环 i = 1 # 6.> 此时i = 2 # 9.> 此时i=3
        def f():           #>4.进入函数 # 7.>进入函数 # 10.>进入函数
             return i*i    #>14.最后进行计算 然后被调用 i*i 此时的i为3 
        fs.append(f)       #>5.注意这里 fs.append(f) f是函数!并不是f(),此时把f函数添加到list里 # 8.>注意这里 有一次把函数添加到list里。#11.>如上
    return fs              #>12.此时把整个list都返回!注意此时是fs[f,f,f]都是函数!

f1, f2, f3 = count()     # >1.第一步并不是赋值,而是进行调用count()函数 #》13.然后进行赋值调用 fs[f1,f2,f3]
f1()                     #15. i*i
f2()                     #16. i*i
f3()                     #17. i*i

跟着思路走吧,我讲的也不是太清楚

def count():
    fs = []                #>2.如上
    for i in range(1, 4):  #>3. i = 1
        def f(j):          #>5.进入函数f(j) j = 1
            def g():       #>7.记录
                return j*j
            return g       #>6.返回函数
        r=f(i)            #>4.调用f(i)函数 i = 1
        fs.append(r)      #>8.此时添加的是r函数到list里,r调用的f(j)函数,j = 1,最后返回的是一个g()函数,把这个理解为g1()吧,此时j为1
    return fs

f1, f2, f3 = count()   #>1.如上第一步骤
print f1(), f2(), f3() #>xx.最后自己想想看


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

Ranbo_qiu

f1 = g1() j = 1 f2 = g2() j = 2 f3 = g3() j = 3 最后输出调用最后一个return j * j
2016-12-25 回复 有任何疑惑可以回复我~
def count():
    fs = []                #>2.如上
    for i in range(1, 4):  #>3. i = 1
        def f(j):          #>5.进入函数f(j) j = 1
                return j*j   
        r=f(i)            #>4.调用f(i)函数 i = 1
        fs.append(r)      #>8.此时添加的是r函数到list里,r调用的f(j)函数,j = 1,最后返回的是一个g()函数,把这个理解为g1()吧,此时j为1
    return fs
 
f1, f2, f3 = count()   #>1.如上第一步骤
print f1(), f2(), f3() #>xx.最后自己想想看

这样不使用闭包,函数f(),直接返回 j*j 可不可以呢? 还有变量j,没有被赋初值,是默认为1吗?

非常感谢您的回答!

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

Ranbo_qiu

你说的对,前者假如在闭包内直接return fs.append(f())这样返回的是函数值,因为会直接调用f()函数,所以每次调用时就不会等到i = 3. 变量j 你可以这样理解,注意 r = f(i)此时并不是做赋值,而是先调用函数f()此时的 i == j 。
2016-12-26 回复 有任何疑惑可以回复我~
#2

西边 提问者 回复 Ranbo_qiu

感谢!
2016-12-29 回复 有任何疑惑可以回复我~

我的理解是,前者调用的是把函数加到lst,后者是把函数值加到lst,是吧?

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

举报

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

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

进入课程

难以理解yq

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