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

f1,f2,f3分别代表f(1)?f(2)?f(3)?

f1,f2,f3分别代表f(1)?f(2)?f(3)?

这种写法从哪里来的?

正在回答

4 回答

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
返回闭包,不能引用循环变量,请改写`count()`函数,
让它正确返回能计算1x1、2x2、3x3的函数。
'''
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

>>> 1
>>> 4
>>> 9


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

不是很理解这个机制,count()函数已经执行完毕,i难道还存在吗?

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

游离丸子

count()函数执行完毕的时候i当然不存在了,但是count()执行过程中生成的3个结果的时候,都是由最后一个i生成的
2018-07-17 回复 有任何疑惑可以回复我~

试着总结一下

这个题目的关键点,其实有三个部分

(1) f1,f2,f3 = count() 的赋值语句,也就是相当于f1=fs[0]; f2=fs[1]; f3=fs[3]

(2)print f1(), f2(),f3() ,也就是相当于 print fs[0](), fs[1](), fs[2]()

按前面学习的理解,这里是很大问题。为什么list元素可以像方法一样调用!!!这里要看前面我们在fs[]列表里面添加的是什么?

(3) fs.append(f)     这里看到我们是往fs[]列表里加入的并不是函数f()具体的执行结果,而是其执行过程【这个具体过程中i的值是多少并没有被固定下来】。

显而易见,当执行完成 renturn fs.append(f) 的时候,i的值已经变成3了。

所以在后面将三个被固化的“执行过程”再次执行的时候,是现在的值 3来进行的。

解决方法(一):

1.将fs.append(f) 改为  fs.append(f())            #在 fs 里加入具体执行结果

2.将输出语句,修正为 print f1,f2,f3              # fs 的内容已经不是执行过程,要相应变化

解决方式(二)

基于 fs.append(f) 那么 f 的具体执行过程不该牵扯到变量,涉及到的话要进行固化~

The end


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

慕后端4582086

不是很理解这个机制,count()函数已经执行完毕,i难道还存在吗?
2018-05-14 回复 有任何疑惑可以回复我~

可以这么理解,但是个人认为主要是由于返回的是list中有三个元素

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

举报

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

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

进入课程

f1,f2,f3分别代表f(1)?f(2)?f(3)?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号