大家好,这篇文章主要是关于Python中闭包的详细解释。有兴趣的同学过来看看。如果对你有帮助,记得收藏。
:
目录
1.关闭2的概念。实施关闭3。在闭包中,外部函数将临时变量绑定到内部函数4。闭包中的内部函数修改外部函数5的局部变量。注:6。练习:总结。
1、闭包的概念
请给我解释一下,如果在一个函数内部定义了另一个函数,我们称之为外部函数,我们称之为内部函数。闭包:内部函数定义在外部函数中。外层函数的临时变量用在内层函数中,外层函数的返回值是内层函数的引用。这构成了一个终结。一般在我们的认知中,如果一个函数结束,函数内部的东西都会被释放并返回内存,局部变量就会消失。然而,闭包是一个特例。如果外部函数发现它有自己的临时变量,将来会在内部函数中使用,它将这个临时变量绑定到内部函数,然后结束自己。
2、实现一个闭包
#返回一个函数作为返回值,也是高阶函数。
#这种高阶函数也叫闭包,通过闭包可以创建一些只有当前函数才能访问的变量。
#您可以将一些私人数据隐藏到
定义外部():
a=10
#在函数中定义另一个函数
内部定义():
打印(“我在外面”,a)
#返回内部函数inner作为返回值
返回内部
# r是一个函数对象,调用fn()后返回
#这个函数其实是由fn()内部定义的,不是全局函数。
#所以这个函数总是可以访问fn()函数中的变量
#外部函数返回了对内部函数的引用
fn=外部()
# r()相当于调用inner()函数。
打印('外部引用地址:',外部)
打印('内部引用地址:',fn)
fn()
'''
输出结果:
外部引用地址:0x000000002bb5948处的函数Outer
内部引用地址:function outer . locales . inner at0x 000000002 bb 58 b 8
我在外10
'''
解释上面的代码:
对于闭包来说,最后一个返回inner是在outer函数中,当我们调用outer函数fn=outer()时,outer函数返回inner函数对象,这是对一个函数的引用,这个引用存储在fn对象中。所以我们接下来做fn()的时候,相当于运行了内部函数。
提示:
一个函数,如果函数名后面跟一对括号,就相当于调用这个函数。如果不跟括号,就相当于只是一个函数的名字,包含了对函数位置的引用。
3、在闭包中外函数把临时变量绑定给内函数
按照我们正常的认知,当一个函数结束的时候,会把它所有的临时变量释放回内存,然后变量就不存在了。一般来说,这是真的。但是闭包是一个特例。外部函数发现它的临时变量将在未来的内部函数中使用。当它完成时,它会将外部函数的临时变量发送给内部函数,并将它们绑定在一起。所以外层函数已经结束了,调用内层函数的时候仍然可以使用外层函数的临时变量。
在我写的例子中,我调用了外部函数outer两次,传入的值分别是10和20。内部函数只定义一次。我们发现不同的是,内部函数是一个临时变量,可以在调用外部函数时标识它。
在Python中一切都是对象。虽然我们只定义了一次函数,但是外层函数在运行的时候,实际上是按照内层代码执行的。在外部函数中创建一个函数。每次我们调用外部函数,它都会创建一个内部函数。虽然代码一样,但是创建了不同的对象,将每次传入的临时变量值绑定到内部函数,然后返回内部函数引用。
所以每次我们调用一个外部函数时,我们都返回一个对不同实例对象的引用。它们的功能是一样的,但实际上不是同一个函数对象。
以下示例演示了:
外部定义(数量):
a=数量
#在函数中定义另一个函数
内部定义():
打印(“我在外面”,a)
#返回内部函数inner作为返回值
返回内部
fn1=外部(10)
fn2=外部(20)
打印('内部引用地址:',fn1)
fn1()
打印('内部引用地址:',fn2)
fn2()
'''
输出结果:
内部引用地址:function outer . locales . inner at0x 000000026 b 58 b 8
我在外10
内部引用地址:function outer . locales . inner at0x 000000026 b 5828
我在外面20。
'''
#注意两个inner的地址不一样,一个是8B8,一个是828。
4、闭包中内函数修改外函数局部变量
在基本的Python语法中,函数可以随意读取全局数据,但是有两种方法可以修改全局数据。
Global声明全局变量。当全局变量是可变数据时,它们可以被修改。
闭包内的函数也是如此。当你想修改一个内部函数中的闭包变量(一个由外部函数绑定到内部函数的局部变量)时,在Python3中,你可以使用nonlocal关键字声明一个变量,说明这个变量不是局部变量空间中的变量,你需要在上变量空间中找到这个变量。
示例:
外部定义(数量):
a=数量
B=10 # a和B都是闭包变量
print(' a的原始值是',a)
#内部固有函数
内部定义():
#想要修改内部函数中的闭包变量
#非本地关键字声明变量
非局部的
a=b
印刷体('我是外层的一个',一个)
#返回内部函数inner作为返回值
返回内部
fn1=外部(10)
fn1()
'''
输出结果:
a的原始值是10。
我是来自外太空的20号
'''
在内部函数中,修改了闭包变量,打印结果确实是修改后的结果。
5、注意:
还需要注意的是,实际上只有一个闭包变量,每次调用一个闭包变量。(这个在Python实现的简单盈利模式下解释的比较多)
外部定义(数量):
a=数量
B=10 # a和B都是闭包变量
print(' a的原始值是',a)
#内部固有函数
内部定义():
#想要修改内部函数中的闭包变量
#非本地关键字声明变量
非局部的
a=b
印刷体('我是外层的一个',一个)
#返回内部函数inner作为返回值
返回内部
fn1=外部(10)
fn1()
fn1()
fn1()
'''
输出结果:
a的原始值是10。
我是来自外太空的20号
我是来自外太空的30号
我是来自外太空的40号
'''
可以看到第二次调用fn1()方法,a的值增加了10。
6、练习:
#求多个数字的平均值
# nums=[50,30,20,10,77]
# sum()是一个求和函数。
# sum()用于计算列表中所有元素的总和。
# print(sum(nums)/len(nums))
#结果:37.4
#形成闭合的元素
# 函数嵌套
# 返回内部函数作为返回值。
# 内部函数必须对外部函数使用变量。
def make_averager():
#创建一个列表来保存数值
nums=[]
#创建一个函数来计算平均值
定义平均器(n):
#在列表中添加n
nums.append
#平均
返回总和(数字)/贷款(数字)
回报平均器
#创建一个对象,现在你得到一个对内部函数对象的引用。
averager=make_averager()
#调用内涵书对象
#这里注意虽然是通过调用外部函数创建的对象,
#但是你得到的是一个对内部函数对象的引用,它是一个有形的参数,
#所以averager对象相当于固有函数对象。
#所以调用内部函数的时候要传递形参。
打印(平均器(10))
打印(平均器(20))
打印(平均器(30))
打印(平均器(40))
总结
这就是本文对Python中闭包的详细解释。更多相关的Python闭包,请搜索我们之前的文章或者继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。