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

j 的值是如何获得的?


def count():

    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

f1, f2, f3 = count()

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

如上,并为对j赋值,我想知道j的值是如何获得的;还有f1, f2, f3 = count() 这个要怎么理解呢?

正在回答

2 回答

分别解答你的两个问.

并未对j赋值, j的值是如何获得的?

考察函数定义:

def count():
    fs = []
    for i in range(1, 4):
        def f(j): # j只是函数定义时使用的形参, 这里换成任意名字都是可以的, 
                  # 仅指代了f()这个函数需要一个入参
            def g():
                return j*j
            return g
        r = f(i) # f()的实际调用位置, 将for循环中的i, 赋值进来了; r获得了返回值:即g()函数, 即形式定义: j*j, 在这里把j替换为调用时传进来的参数i, 即 i * i
        fs.append(r)
    return fs

上面就是j赋值问题的解析.

另外一问, f1, f2, f3 = count() 调用方式的理解?

首先, 考察count()的返回值: fs列表

fs列表存储的是什么的? [f(1), f(2), f(3)] 三个函数

然后, 再考察赋值语句: f1, f2, f3 = count()就比较好理解了,变形:

f1, f2, f3 = [f(1), f(2), f(3)], 这里就是序列赋值语句的方式, "=" 两侧按照次序分别赋值.

其实更准确点来讲, '=' 左边是(f1, f2, f3)元组.

你可以在交互模式下动手验证一下:

a, b, c = 1, 2, 3 #然后分别看看a, b, c的值, 看是不是按照次序分别赋值的.

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

j赋值了啊 第四行开始是对f函数定义 里面的j是参数的名字 可以不是j

从第四行开始定义了一个闭包

def f(j):

            def g():

                return j*j

            return g

这是一个完整的闭包 没有访问外边的循环变量

而紧接着的 r = f(i) 就是利用这个合法的闭包赋值计算了

后面的f1, f2, f3 = count() 就是赋值表达式 等于f1 = count()  f2= count()  f3 = count() 

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

举报

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

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

进入课程

j 的值是如何获得的?

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