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