1、在python中,函数是一等对象(first-class object),一等对象的特征有:

  • 在运行时创建
  • 能赋值给变量或数据结构中的元素
  • 能作为参数传给函数
  • 能作为函数的返回结果

接受函数为参数或把函数作为结果返回的函数又叫高阶函数(higher-order function),常见的高阶函数例如python内置的sorted,其接收一个参数key,当想根据长度排序时,可以写成sorted(xxx,key=len),这就是把len()函数作为参数传给sorted()。在函数式编程范式中,常用的高阶函数有mapfilterreduceapply,然而在python中不常用这些函数,因为已经有了更简单的替代方式。

  • map函数用来求一个序列或者多个序列进行函数映射之后的值,filter函数用来过滤掉序列中不符合函数条件的元素,二者完全可以用列表推导式替代,对应for循环和if条件判定。
  • reduce函数用来对一个序列进行压缩运算,在python3中已经移到了functools模块,该方法最常用于序列求和,因此可以用python内置的sum函数替代。
  • apply(func [, args [, kwargs ]])函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。因为python本来就支持函数定义中包含不定量参数,所以apply函数反而多此一举,python3中已经移除了。但在第三方库例如pandas中还在使用。

  2、python中能使用调用符号“()”的对象称为可调用对象(Callable Objects),有7种可调用对象:

  • 用户用deflambda定义的函数
  • 内置函数:使用C语言实现的函数,如lentime.strftime
  • 内置方法:使用C语言实现的方法,如dict.get
  • 方法:在类的定义体中定义的函数
  • 类:由于python没有new函数,所以创建实例时直接调用类
  • 类的实例:如果类定义了__call__方法,它的实例就可以作为函数调用
  • 生成器函数:使用yield关键字的函数或方法

  3、有必要理解一下关键字、方法、函数的区别:

  • 关键字:内置的、具有特殊意义的表示符,使用时不加“()”
  • 方法:封装了独立的功能,需要用对象调用,对象.方法名(参数)
  • 函数:也是封装了独立的功能,直接调用或使用模块名调用

  4、operator模块提供了对函数式编程的支持。例如在使用reduce函数对序列求和时,需要传入一个函数,因此不能直接使用“+”,所以需要另外定义表示加减乘除这类运算的函数,operator模块内置了这些函数,所以就没必要自己定义了。

  operator模块的itemgetterattrgetter函数可用于替代从序列中取出元素或读取对象属性的lambda表达式,如下:

  5、第六章讲的是用一等函数实现设计模式,思想很简单,因为函数也能作为参数,所以就可以简化代码,不必为了实现特定功能而创建一个类,再用类的实例调用方法,而是可以直接定义函数,把函数作为参数传进方法里调用。