继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

focuspe
关注TA
已关注
手记 20
粉丝 26
获赞 246

内层函数引用外层函数的变量,返回内层函数成为闭包。
如:

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
打开App,阅读手记
4人推荐
发表评论
随时随地看视频慕课网APP