闭包:
什么是闭包:
闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。
下面是一个列子:
#usr/bin/python #-*-coding:utf-8-*- #闭包 def outter(fun): def inner(): print('123 执行inner') fun() print('456 执行inner') return inner def index(): print('我是index。。。') # ()执行 传递引用 ind=outter(index) ind()
输出结果为
闭包的应用场景:闭包与并行运算
闭包有效的减少了函数所需定义的参数数目。这 对于并行运算来说有重要的意义。在并行运算的环境下,我们可以让每台电脑负责一个函数,然后将一台电脑的输出和下一台电脑的输入串联起来。最终,我们像流 水线一样工作,从串联的电脑集群一端输入数据,从另一端输出数据。这样的情境最适合只有一个参数输入的函数。闭包就可以实现这一目的。
并行运算正称为一个热点。这也是函数式编程又 热起来的一个重要原因。函数式编程早在1950年代就已经存在,但应用并不广泛。然而,我们上面描述的流水线式的工作并行集群过程,正适合函数式编程。由 于函数式编程这一天然优势,越来越多的语言也开始加入对函数式编程范式的支持。
装饰器:
使用装饰器后上述代码如下:
#装饰器 def outter(fun): def inner(): print('123 执行inner') fun() print('456 执行inner') return inner @outter def index(): print('hhhhhh') index()
输出结果为:
点菜系统简单小例子:
def supin(fun): def caidan(): print('蔬菜拼盘..88..') return 88+fun() return caidan def yangrou(fun): def caidan(): print('羊肉..35..') return 35+fun() return caidan @supin @yangrou def guodi(): print('菌汤锅..23元..') return 23 money=guodi() print('总消费',money)
输出结果为: