首页 > 开发 > Python > 正文

闭包 整理,暂时理解函数执行顺序

2016-07-25 21:49:52  来源:慕课网
  内层函数引用外层函数的变量,返回内层函数成为闭包。
如:
def calc_sum(lst): def lazy_sum(): return sum(lst) #内层函数引用外层函数的变量 return lazy_sum #返回内层函数   例子1:
def count(): fs = [] #初始化fs for i in range(1,4): def f(): return i*i fs.append(f) return fs #返回的是函数f f1,f2,f3 = count() #调用count()函数:经过for循环,i=1:fs=[f], i=2:fs=[f f] ,i=3:fs=[f f f] print(f1(),f2(),f3()) #当调用f()函数时,此时i的值为3,输出 9 9 9   开始 我以为 for循环随着i的值的改变,会执行3次f(),这个想法是错的,并不是顺序执行,而是调用到函数f(),才会执行到f(),也就是Print f1(),f2(),f3()的时候才会执行def f(): return i*i
  例子2
def count(): fs = [] for i in range(1,4): def f(m = i): return m ** 2 fs.append(f) return fs f1,f2,f3 = count() print(f1(),f2(),f3()) #输出1 4 9   例子3
def count(): fs = [] for i in range(1,4): def f(j): def g(): return j*j return g r = f(i) #r是g()的闭包 fs.append(r) #fs存的是g()闭包的三个实现,分别在输入1,2,3的时候 return fs f1,f2,f3 = count() #f1,f2,f3是三个闭包 print(f1(),f2(),f3()) #输出1 4 9 加()后就是函数的求值,所以f1()就相当于call g(1),返回值就是1,f2()就相当于call g(2),返回值就是4等   例子4
def count(): fs = [] for i in range(1,4): def f(j): return j*j r = f(i) fs.append(r) #r是函数f()计算后的返回值,是Int型对象,fs是一个3个整数的list return fs print count() #输出[1, 4 , 9]   关于输出 1 4 9 的另一个方法,但没有用到闭包
def count(): fs = [] for i in range(1,4): fs.append(i*i) return fs f1,f2,f3 = count() print(f1,f2,f3) #输出1 4 9
Copyright©2013-2016abenmao All Rights Reserved 京ICP备13035258号