闭包python 菜鸟教程,python闭包函数的作用,关于Python中的闭包详解

闭包python 菜鸟教程,python闭包函数的作用,关于Python中的闭包详解

大家好,这篇文章主要是关于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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: