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

返回函数

从2-8返回函数就开始搞不懂了????

正在回答

4 回答

1 def count():
2    fs = []
3    for i in range(1, 4):
4        def f(j):
5            def g():
6                return j*j
7            return g
8        r = f(i)
9        fs.append(r)
10    return fs
11 f1, f2, f3 = count()
12 print f1(), f2(), f3()

第二行是定义了一个list,名称为fs,第三行生成1,2,3序列,并且赋值给i。
我们从第八行看起,当i=1时,将i传入f()之中,f中的j就被赋值了j=i=1,
f()中又有一个函数g(),将参数j传入,在g()中返回j*j,也就是1*1,然后f()中又返回g()(注意这里返回的是一个函数,并不是函数值),
也就是g(1),将g(1)这个值赋值给变量r,再将r添加到list中  在count()中将list返回,此时list为 fs=[g(1)]。
然后在当i=2和i=3时,继续上面的循环。


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

慕盖茨3326791

能讲下例子中错误版本的运行过程吗?我不太懂两个代码运行差别
2019-08-23 回复 有任何疑惑可以回复我~

又跟简单的吗?感觉写起来好复杂

0 回复 有任何疑惑可以回复我~
f1, f2, f3 = count()
这句是什么意思?
0 回复 有任何疑惑可以回复我~
#1

薄荷开水3614848

count()函数是返回fs这个list,这个list中的元素是函数而不是数字,就像[f(),f(),f()], f1,f2,f3=count() 就是f1,f2,f3=[f(),f(),f()] 当然这个f()是count里面的, 第一个f()赋给了f1,第二个f()赋给了f2,...这样赋值方法 高级序列赋值语句模式 虽然可以在“=”符号两侧混合匹配序列类型,但是右边元素的数目还是要跟左边变量的数目相同,不然会产生错误。 那么我们回到f()  依然是返回的i*i,但是在循环结束之后i的值是3,这是确定的,所以f()的返回值就是3*3.
2018-08-10 回复 有任何疑惑可以回复我~

修改版,第一个版本中g(1)是不存在的。因该是一个新函数,详情看下面:


1 def count():

2    fs = []

3    for i in range(1, 4):

4        def f(j):

5            def g():

6                return j*j

7            return g

8        r = f(i)

9        fs.append(r)

10    return fs

11 f1, f2, f3 = count()

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


第二行是定义了一个list,名称为fs,第三行生成1,2,3序列,并且赋值给i。

从第八行看起,当i=1时,将i传入f()之中,f中的j就被赋值了j=i=1,

f()中又有一个函数g(),将参数j传入,在g()中返回j*j,也就是1*1,然后f()中又返回g()(注意这里返回的是一个函数,并不是函数值),也就是g()其中g中的j已经被传入外层函数的值j=1,将g()这个值赋值给变量r,再将r添加到list中  ,在count()中将list返回,此时list为 fs=[g()],f1=fs=[g()],其中g()中j*j变为1*1,打印的时候f1()运行的是

def  g():

return 1*1

然后在当i=2和i=3时,继续上面的循环。


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

举报

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

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

进入课程

返回函数

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