1、在python中,函数是一等对象(first-class object),一等对象的特征有:
- 在运行时创建
- 能赋值给变量或数据结构中的元素
- 能作为参数传给函数
- 能作为函数的返回结果
接受函数为参数或把函数作为结果返回的函数又叫高阶函数(higher-order function),常见的高阶函数例如python内置的sorted
,其接收一个参数key,当想根据长度排序时,可以写成sorted(xxx,key=len)
,这就是把len()
函数作为参数传给sorted()
。在函数式编程范式中,常用的高阶函数有map
、filter
、reduce
和apply
,然而在python中不常用这些函数,因为已经有了更简单的替代方式。
map
函数用来求一个序列或者多个序列进行函数映射之后的值,filter
函数用来过滤掉序列中不符合函数条件的元素,二者完全可以用列表推导式替代,对应for循环和if条件判定。reduce
函数用来对一个序列进行压缩运算,在python3中已经移到了functools模块,该方法最常用于序列求和,因此可以用python内置的sum
函数替代。apply(func [, args [, kwargs ]])
函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。因为python本来就支持函数定义中包含不定量参数,所以apply
函数反而多此一举,python3中已经移除了。但在第三方库例如pandas中还在使用。
2、python中能使用调用符号“()”的对象称为可调用对象(Callable Objects),有7种可调用对象:
- 用户用
def
或lambda
定义的函数 - 内置函数:使用C语言实现的函数,如
len
或time.strftime
- 内置方法:使用C语言实现的方法,如
dict.get
- 方法:在类的定义体中定义的函数
- 类:由于python没有new函数,所以创建实例时直接调用类
- 类的实例:如果类定义了
__call__
方法,它的实例就可以作为函数调用 - 生成器函数:使用
yield
关键字的函数或方法
3、有必要理解一下关键字、方法、函数的区别:
- 关键字:内置的、具有特殊意义的表示符,使用时不加“()”
- 方法:封装了独立的功能,需要用对象调用,对象.方法名(参数)
- 函数:也是封装了独立的功能,直接调用或使用模块名调用
4、operator模块提供了对函数式编程的支持。例如在使用reduce
函数对序列求和时,需要传入一个函数,因此不能直接使用“+”,所以需要另外定义表示加减乘除这类运算的函数,operator模块内置了这些函数,所以就没必要自己定义了。
operator模块的itemgetter
和attrgetter
函数可用于替代从序列中取出元素或读取对象属性的lambda表达式,如下:
5、第六章讲的是用一等函数实现设计模式,思想很简单,因为函数也能作为参数,所以就可以简化代码,不必为了实现特定功能而创建一个类,再用类的实例调用方法,而是可以直接定义函数,把函数作为参数传进方法里调用。