闭包

闭包

  • 闭包:能够访问其他函数内部变量的函数叫做闭包
    导致局部变量无法释放,缺点:常驻内存,内存的占有比较高
    优点:局部变量全局化
    JavaScript语言,大量使用闭包

什么是闭包?概念太笼统,百度百科等地方有免费的解答,在程序里,闭包表现为:函数中的函数

比如

def fun1():
	def fun2():
		do someting
	return fun2

上面的实例时最基本的一个闭包的形式了,fun1成为外函数,fun2成为内函数。每一个函数都可以接受参数,返回一个其他的东西,但是,这里注意,一般或者说必须外函数要把内函数返回,共外部使用,话不多说,我们先看一个简单的代码:

def outer():
        print("-----1-----")
        def inner():
            print("------2-----")
        print("-----3----")
        return inner
foo = outer()    
foo()

上面的代码里,我们按照上面的基本形式写了一个简单的闭环程序,在程序里我们有三个print函数,然后调用outer函数,使用foo接受返回的inner的函数,最后在foo后面加上括号完成调用inner函数

那么,大家猜一下输出的结果是什么?

-----1-----
-----3----
------2-----

跟你猜的一样嘛?有多少人猜的输出是1、2、3。在这个函数,在定义外函数后,不执行!到foo=outer()这句话时,才执行外函数,紧接着打印1,这点大家都知道,然后程序继续向下,读取到内函数,这时候,这个内函数不执行!这里仅仅是定义了函数,而不是执行,现在在外函数里面,我们可以认为重新打开了一个模块,然后里面有普通的语句,有函数,我们直到,定义函数时不执行,调用时才执行!所以,外函数走到这里,仅仅是定义了一个函数!继续向下走,打印3,返回内函数。这时候,我们的内函数inner和foo是一样的:

def outer():
    print("-----1-----")
    def inner():
        print("------2-----")
    print("-----3----")
    print(id(inner))
    return inner
foo = outer()
print(id(foo))
foo()
-----1-----
-----3----
2270649211208
2270649211208
------2-----

所以,return返回的是一个函数变量,所以,foo就是一个函数,我们加上括号,自然能执行这个函数,然后打印2,这时候,这个程序执行完了


如果上面的了解了,请继续往下看:
现在现在我们知道了闭包的“工作方式”,那么闭包能用来干嘛呢?下面给大家演示一下闭包的其中一个作用(是其中一个,不是全部哦):很抱歉我不能很清楚的说出这个东西的名字,查阅资料查阅到一个深联结,不知道是否准确,留待读者查阅查清楚,加油!

def outer(num_out):
	def inner(num_in):
		num = num_in + num_out
		print(num)
	return inner
foo = outer(100)
foo(200)

上面即一个闭包的使用,按照我们上面讲的,外函数结束后,难道不会释放自己的变量空间嘛?这就是闭包的神奇之处,它能保留外函数的变量的值!,这里注意,是保留值,不是变量,如果我们尝试修改外函数的变量,那么一定会报错,这点是需要牢记的!!!

数学中的闭包

上小学我们就开始学方程式,最经典的是:
y = ax +b
直线方程。当a和b确定时,只需要修改x就能得到不同的y,那么是否联想到了闭包呢?

设计如下:
外函数:两个参数,分别是a和b,返回内函数。
内函数:一个参数,为x,返回y的值

def outer(a,b):
	def inner(x):
		return a*x+b
	return inner
fun1 = outer(3,4)
fun2 = outer(2,8)
print(fun1(22))
print(fun2(33))
#这两个fun是不会相互影响的0

上面中,我们定义了一个闭包,按照我们的需求,然后定义了两个变量fun1和fun2,但是,我们查看结果可以发现,这两个变量的a和b的值并没有相互影响。运行结果如下:

70
74

转载: Chuckie PythonLive

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值