Discuss / Python / 返回函数的理解

返回函数的理解

Topic source

用面向对象的观点理解的返回函数的话,其实就是数据和返回函数是分开存贮的,python是先执行函数体,在执行返回函数。

def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs 中,先执行函数体count(),其中返回函数f()开始时候并没有执行,只是记下了该函数. 也就是执行循序是: 1: fs=[] 2: i=1 ,f()函数记下被调用1次,既[f()]。 3:i=2,f()函数记下被调用2次,既[f(),f()]。 4:i=3,f()函数记下被调用3次,既[f(),f(),f())]。。 5:执行第一个f(),需要变量i,i=3,执行f(i),得到f(i)=9,所以fs=[9,f(),f()] 6: 执行第二个f(),需要变量i,i=3,执行f(i),得到f(i)=9,所以fs=[9,9,f()] 7: 执行第三个f(),需要变量i,i=3,执行f(i),得到f(i)=9,所以fs=[9,9,9]

而def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs 中,前面的返回函数首先存贮在其他地方,先执行函数体 1:fs = [] 2:i=1,"fs.append(f(i))"中注意,fs = [f(i)]!不是fs=[f()],所以不是返回函数,是返回函数值了!所以当前立马执行f()这个函数体,而f()函数体中g被执行(f()没有其他要执行的,g是返回函数最后执行),所以g()=1*1=1,既fs = [f(i)]=[1] ..... 以下同理: 有兴趣的同学可以试下:

def count(): fs = [] for i in range(1, 4): def f(i): return i*i fs.append(f(i)) return fs 第一个例子这样改,也不是返回函数了。(返回函数一定要返回抽象函数,不能是具体值)

说复杂了,其实就是返回(f(),f(),f())与返回(f(1),f(2),f(3))的区别,带函数的返回,函数都是最后执行。

解释的很清楚,但我不理解f(1)被立即执行,但是返回的不是g函数吗?我觉得应该返回的是g(),能否解答下,谢谢

我又琢磨了一下,我是这么理解的: 第一种得到的结果是[f,f,f],所以执行f1()的时候,得到的是f(),而f()的值是循环结束也就是i=3时的值,所以都是9 第二种得到的结果是[g,g,g],虽然也是返回函数,但是我们绑定了参数,也就是说第一个g绑定了参数了1,g()的值已经绑定了参数i=1时的值,此时已经执行了g,而不像第一种f暂时贮存,所以无论后面参数如何循环改变,第一个返回函数g其实已经被执行了

没懂啊,我也觉得第二种是返回了g(),那为啥是立刻执行呢?应该也是结果是9,9,9哈

楼主说第二种返回的是函数值f(i),但是这个函数值f(i)也就是一个函数g()啊 ,而g()没有被执行,是等到调用的时候才执行吧,那此时i就等于3了

(f(1),f(2),f(3))=(g,g,g),g()执行的时候自带参数1,2,3,所以无所谓立马执行之类的。 (f(),f(),f())中参数没有,得回头找,结果只能找到i=3,所以参数全部是3. 如此而已,毫无区别。

楼主,我就是没懂第二个例子,为啥是(f(1),f(2),f(3))=(g,g,g),求解释

第二个例子,我觉得也是(f(3),f(3),f(3))=(g,g,g),

我的理解是在闭包中,内部函数会存储外部函数的局部变量,如果外部函数局部变量已经有值的话这时候在函数定义的时候要引用的值已经确定了。如果此时外部函数的局部变量是不确定的值的时候,那么内部函数执行的时候值是最后确定的值。所以会有这样的差异。具体的细节最能去看闭包的具体实现方式了。


  • 1

Reply