Python中一切皆对象,函数也是对象,也就是说对象能干什么、函数也能干。如拥有原生属性、自定义创建、动态赋值、作为参数传递、作为返回值返回。
作为“一等公民”的函数
一等公民?对于这个描述,难道在编程的代码世界里,也会分369等吗,那么这种划分方式是什么呢
没错在编程的世界里,不同的对象有不同的权利、不同的作用范围、不同的生命周期。同时其赋值、传递、使用方式也大为不同。举一个简单的例子,java作为编译型语言的代表,哪一种类型的对象作为一等公民,拥有最多权限呢,毫无疑问,大家会想到类(class)。对于类我们可以自定义创建、可以动态赋值、可以在函数中传递类的实例化对象,同时类拥有大量的原生属性,以及java字节码为其提供支持、由jvm直接管理。以类作为参考,函数的地位是在太低了,函数只能依赖类或者接口而存在,函数在字节码中也没有自己的属性。动态赋值、参数传递都必须依赖类为媒介,显然是一个“弱势公民”。
在Python中函数荣升为“一等公民”,拥有自己的原生属性,由Python解释器直接管理,能够在函数中以参数的形式直接传递,能够直接进行赋值。在Python中可以直接定义函数而不用依赖类。
一个栗子
>>> def sum(a,b):
... return a+b
...
>>> sum(5,3)
8
>>> type(sum)
>>> dir(sum)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
通过内置函数type可以看出Python中对函数有固定的类型支持,同时通过内置函数dir可查看自定义函数sum所内置的函数,从而简单的感受了Python对函数的支持。
高阶函数
“一等公民”函数的一个特点是可以作为参数进行传递,在Python中将函数作为一个参数传递给另外一个函数,是一件非常简单的事,同时能够接受函数作为参数的函数称为高阶函数。如内置函数map、filter、sorted等等都是高阶函数。
“一等公民”函数带来的闭包问题
闭包指:延伸了作用域的函数,其中包含函数定义体中引用、但是不再定义体中定义的非全局变量。
对这个定义,一个最简单的理解就是:只有涉及嵌套函数时才有闭包问题。
具体闭包问题可以参考之前闭包文章