python函数闭包的好处_python日记第三章:函数闭包现象是什么

关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。

def outer():

name = 'alex'

def inner():

print("在inner里打印外层函数的变量",name)

return inner # 注意这里只是返回inner的内存地址,并未执行

f = outer() # .inner at 0x1027621e0>

f() # 相当于执行的是inner()

注意此时outer已经执行完毕,正常情况下outer里的内存都已经释放了,但此时由于闭包的存在,我们却还可以调用inner, 并且inner内部还调用了上一层outer里的name变量。这种粘粘糊糊的现象就是闭包。

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

为了再清楚的了解以及记忆住这个闭包是个什么东西,我们继续举例:

闭包

是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。

如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。

通过闭包可以访问外层非全局作用域的变量,这个作用域称为 闭包作用域。

def funX(x):

def funY(y):

return x * y

return funY

i = funX(8)

print(type(i)) #

print(i(5)) # 40

闭包的返回值通常是函数。

def make_counter(init):

counter = [init]

def inc(): counter[0] += 1

def dec(): counter[0] -= 1

def get(): return counter[0]

def reset(): counter[0] = init

return inc, dec, get, reset

inc, dec, get, reset = make_counter(0)

inc()

inc()

inc()

print(get()) # 3

dec()

print(get()) # 2

reset()

print(get()) # 0

如果要修改闭包作用域中的变量则需要 nonlocal 关键字

def outer():

num = 10

def inner():

nonlocal num # nonlocal关键字声明

num = 100

print(num)

inner()

print(num)

outer()

# 100

# 100

原创文章,作者:寒社科长,如若转载,请注明出处:http://www.hanshe123.com/217.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值