写在之前
在昨天的文章中(
零基础学习 Python 之嵌套函数
),当需要在函数内部多次执行复杂的任务的时候,嵌套是很有用的,可以避免循环和代码的重复冗余,而嵌套函数可以看做一个闭包,所以在开始今天的学习之前,如果你没有看昨天的文章,建议看一下,这样会好理解一些。
闭包
我们都知道在数学中有闭包的概念,但此处我要说的闭包是计算机编程语言中的概念,它被广泛的使用于函数式编程。
关于闭包的概念,官方的定义颇为严格,也很难理解,在《Python语言及其应用》一书中关于闭包的解释我觉得比较好 -- 闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。乍一看,好像还是比较很难懂,下面我用一个简单的例子来解释一下:
>>> a =1
>>>deffun():
... print(a)
...
>>> fun()
1
>>>deffun1():
... b =1
...
>>> print(b)
Traceback (most recent call last):
File"", line1,in
NameError:name'b'isnotdefined
毋庸置疑,第一段程序是可以运行成功的,a = 1 定义的变量在函数里可以被调用,但是反过来,第二段程序则出现了报错。
在函数 fun() 里可以直接使用外面的 a = 1,但是在函数 fun1() 外面不能使用它里面所定义的 b = 1,如果我们根据作用域的关系来解释,是没有什么异议的,但是如果在某种特殊情况下,我们必须要在函数外面使用函数里面的变量,该怎么办呢?
我们先来看下面的例子:
>>>deffun():
...a =1
...deffun1():
...returna
...returnfun1
...
>>>f = fun()
>>>print(f())
1
如果你看过昨天的文章,你一定觉得的很眼熟,上述的本质就是我们昨天所讲的嵌套函数。
在函数 fun() 里面,有 a = 1 和 函数 fun1() ,它们两个都在函数 fun() 的环境里面,但是它们两个是互不干扰的,所以 a 相对于 fun1() 来说是自由变量,并且在函数 fun1() 中应用了这个自由变量 --这个 fun1() 就是我们所定义的闭包。
闭包实际上就是一个函数,但是这个函数要具有 1.定义在另外一个函数里面(嵌套函数);2.引用其所在环境的自由变量。
上述例子通过闭包在 fun() 执行完毕时,a = 1依然可以在 f() 中,即 fun1() 函数中存在,并没有被收回,所以 print(f()) 才得到了结果。
当我们在某些时候需要对事务做更高层次的抽象,用闭包会相当舒服。比如我们要写一个二元一次函数,如果不使用闭包的话相信你可以轻而易举的写出来,下面让我们来用闭包的方式完成这个一元二次方程:
>>>deffun(a,b,c):
...defpara(x):
...returna*x**2+ b*x + c
...returnpara
...
>>>f = fun(1,2,3)
>>>print(f(2))
11
上面的函数中,f = fun(1,2,3) 定义了一个一元二次函数的函数对象,x^2 + 2x + 3,如果要计算 x = 2 ,该一元二次函数的值,只需要计算 f(2) 即可,这种写法是不是看起来更简洁一些?
当我们在后面学习了类的知识以后,再回过头来看闭包的应用,其实你会有更深的认识,这个我们在后面再做讨论,先知道有类这么一个概念就好了。
写在之后
当然闭包在实际的应用中还有很多方面,作为零基础入门这个系列我们就到此为止,不做深究,可能在后面我会在别的系列中再进一步的讲一下,如果你现在对这个方面很感兴趣,可以 Google 一下这方面的文章,有很多的。
最后感谢你能看到这里,希望我写的东西能够让你有到收获,但是我还是希望我在文章里插入的代码,你们能自己动手试一下,都很简单。原创不易,每一个字,每一个标点都是自己手敲的,所以希望大家能多给点支持,该关注关注,该点赞点赞,该转发转发,有什么问题欢迎在后台联系我,也可以在公众号找到我的微信加我。
欢迎来一起交流
领取专属 10元无门槛券
私享最新 技术干货