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

比较f1 与 f1() ??

正确的代码

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()

我的代码:

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()

我认为 在count()函数中 return fs 均表示生成了【1, 4,9】的list,为何我的代码就是错的?

为何把我的代码中print f1() f2() f3() 改为 f1 f2 f3就正确了 ?



正在回答

3 回答

 这个里面区别主要是:在第一个方法里面 

   def f(j):
          def g():
               return j*j
           return g
       r = f(i)
       fs.append(r)中的那个return g,是返回了一个对象g,这时候他还没有执行方法。下面f1f2f3在fs集合中取得了三个g对象以后通过f1()f2()f3()方法执行才得到结果。

而在你写的那个方法里面:

def f():

            return i*i

        fs.append(f())

你往fs集合里面添加的就已经是f()了。这时候已经把f()执行得到结果了,所以你在下面print的时候肯定不能再f1()f2()f3()了啊 ,因为这时候已经不是函数对象而是确定的值了。

其实你这种方法真的非常好,因为你把i*i返回后直接把f()执行添加到fs后结果确实是想要的结果1,4,9。如果你不把f()执行就添加到fs里面,等到你你在下面执行时得不到想要的结果:

http://img1.sycdn.imooc.com//5a7aaf0800010b9c05980445.jpg

至于原因,就是f这个函数对象他只执行最后的返回值。相当于每次return都刷新了f().

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

慕后端7295579 提问者

非常感谢!
2018-02-08 回复 有任何疑惑可以回复我~

你的代码中 ‘fs.append(f())’,f()是整数,因此,count() = [1, 4, 9】

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

慕后端7295579 提问者

是啊 通过赋值 f1, f2, f3 = count() 然后print f1(), f2(), f3() 为什么就错了?
2018-02-07 回复 有任何疑惑可以回复我~
#2

派大星慕 回复 慕后端7295579 提问者

你应该 print (f1,f2,f3) 因为你的f1,f2,f3已经对应了count里的1、4、9了
2018-02-16 回复 有任何疑惑可以回复我~

其他楼看到的答案,感觉比较靠谱

f1, f2, f3 = count()中为何要有3个元素f1, f2, f3?因为count()返回的是fs,而fs是什么?是列表。什么列表?有3个元素的列表。为什么有3个元素?因为for语句的rang(1,4)。所以相当于

f1,f2,f3=[ 值,值 ,值 ]。所以f1, f2, f3中你不能多写一个f4或少写f1, f2, f3其中任何一个,因为你要分别匹配[ 值,值 ,值 ]3个。好,现在我问你列表里的值是什么?是[1,4,9]?哈哈,错了,不是,你可以看到r输出的是<function count.<locals>.f.<locals>.g at 0x10067bae8>  之类的(有3个)。我们来分析r = f(i)。首先第一个循环,i=1,那就是f(1),请问f(1)返回的给r的是什么?看到return g没有?是g,也就是g()函数的地址,f1-->r-->g,f1指向的是g的地址。剩下的i=2、i=3一样。所以r就是g()函数的地址。fs.append(r)就是将r追加到列表fs[]中,所以输出r你看到的是以下输出:

[<function count.<locals>.f.<locals>.g at 0x10067bae8>, <function count.<locals>.f.<locals>.g at 0x10067ba60>, <function count.<locals>.f.<locals>.g at 0x10067bb70>]

看到了吗?[地址,地址,地址]。ps:g的地址为什么不同?因为你创建循环3次调用了f(),自然调用了3次g()

终于最后一步了:print(f1(),f2(),f3()),你会问为什么f1还要加上()。f1指向的是g的地址,所以f1()表示什么?表示是g()。i=1,传参数给j。所以g()就返回1*1(return j * j)。同理f2()=2*2,f3()=3*3.

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

举报

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

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

进入课程

比较f1 与 f1() ??

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