突然想到一个关于闭包的好玩的解释

发布于 / python / 0 条评论

python中的闭包

今天突发奇想,闭包闭包,好像有点像封

我把python形成闭包的过程比喻为 :包包子 和 吃包子  的过程

包包子,首先 假象我们左手拿着包子馅右手拿着包子皮

这里的左手就好比是外层的函数,手中的馅儿就是传入外层函数参数 。  包子皮就是内层的函数

内层的函数调用外层函数的参数,就好比是包子皮包裹着肉馅。包完包子,这时候,我们的左手从包子上移开,就好比是外层函数执行完毕返回了。

现在我们外层函数的自由变量(肉馅)被内层函数(包子皮)使用了。并不会随着外层函数执行完毕而消失。而是和内层函数形成了一个整体。称之为闭包(封闭的包子)。

好了,包子我们包完了,现在该吃包子了

吃包子就好比是外层函数返回的一个函数对象给你,注意这时候只是一个函数对象(假如说这里的 test = 外层函数()),那么需要加上括号才能输出包子哦。【像这样  test()】。即使括号中不用传入参数也需要加上哦。不加只是一个指向函数地址位置的对象。  如果把这里的 test 称为包子的话,这两个 ()符号就可以看作是弯着的筷子。需要筷子你才能吃包子(也就是使用闭包)


上面的文字可能有点抽象,我们直接看个例子:

这里我用伪代码让你能看的更明白。 上面的left_hand函数就实现了一个闭包。首先给它传入一个肉馅的参数。在包子皮这个函数中也可以传入参数(这里姑且算为其他类型的馅吧,这里我假设传入白菜)

这里注意外层的函数返回的是内层函数的对象,并没有带括号、 没有带括号。这也是为什么在上面的代码中 a后面要加括号才能有包子的原因。

这样的好处你从上面就可以看到了,我们传入的牛肉馅一直在包子皮里面,我们想吃其他馅的包子,只需要加入其他馅就可以了。


总结一下闭包的优点:

  • 闭包的最大特点是可以将外函数的变量与内部函数绑定,并返回绑定变量后的函数(也即闭包),此时即便生成闭包的环境(外函数)已经释放,闭包仍然存在,这个过程很像类(外函数)生成实例(闭包),不同的是外函数只在调用时执行,执行完毕后其环境就会释放,而类则在文件执行时创建,一般程序执行完毕后作用域才释放,因此对一些需要重用的功能且不足以定义为类的行为,使用闭包会比使用类占用更少的资源,且更轻巧灵活。
  • 闭包有效的减少了函数参数的数目,这对并行计算非常有价值
  • 闭包还能够用于封装
  • 装饰器就是一种的闭包的应用,只不过其传递的是函数,并且内函数返回的是被装饰的函数
转载原创文章请注明,转载自: adaptの小站 » 突然想到一个关于闭包的好玩的解释

Not Comment Found