(四)一等函数
一等对象满足以下条件:运行时创建、能赋值给变量或数据结构中的元素、能作为参数传给函数、能作为函数的返回结果。 整数、字符串、字典以及函数,都是一等对象。
一、把函数视作对象
可以把函数进行赋值调用
二、高阶函数
1、接受函数为参数,或者把函数作为返回结果的函数是高阶函数(high-order)。
如上例的map,以及内置函数sorted,key参数用于提供一个函数,filter以及reduce也是,不过多数场景下都有更好的替代品。
2、map、filter和reduce的现代替代品
列表推导或生成器表达式具有map和filter功能,而且更易于阅读。
在python3中,map和filter返回生成器(一种迭代器),因此直接替代的产品是生成器表达式。
在python2中,这两个函数返回列表,因此直接替代的是列表推导
reduce通常用于求和(此时可直接用sum替代),此外all(iterable), iterable所以元素为真,返回True。any(iterable)一个元素为真,返回True
三、匿名函数
匿名函数通常用作高阶函数的参数。lambda表达式会创建函数对象(可调用对象的一种)。
四、可调用对象
1、可以使用()的对象。通过调用callable()函数可判断对象能否调用;
2、python数据类型中,七种可调用对象:使用def语句或者lambda表达式创建、内置函数(如len)、内置方法(如dic.get)、方法(类中定义的函数)、
类、类的实例(需定义__call__方法)、生成器函数(yield)
五、用户定义的可调用类型
不仅python函数是对象,对象也可以表现得像函数(实现__call__方法)。
六、函数参数:从定位参数到仅限关键字参数
name: 定位参数 *content:第一个参数后任意个参数由其捕获,并存入元组
cls: 关键字参数 **attrs:捕获没有明确指定名称的关键字参数,并存入字典
定义函数时,若想指定仅限关键字参数,要把它们放到前面有*参数的后面。如果不想支持数量不定的定位参数,可在签名中放一个*
此时调用f(1,3,b=2)会报错。
七、支持函数式编程的包
1、operator模块
operator中,为多个运算符提供了对应的函数;
还有itemgetter和attrigetter,从序列中取出元素或读取对象属性,避免使用lambda表达式。
2、使用functools.partial冻结参数
这个高阶函数用于部分应用一个函数:基于一个函数创建一个新的可调用对象,把原函数的某些参数固定