(四)一等函数

一等对象满足以下条件:运行时创建、能赋值给变量或数据结构中的元素、能作为参数传给函数、能作为函数的返回结果。 整数、字符串、字典以及函数,都是一等对象。

一、把函数视作对象

  可以把函数进行赋值调用

       

 

二、高阶函数  

  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冻结参数

    这个高阶函数用于部分应用一个函数:基于一个函数创建一个新的可调用对象,把原函数的某些参数固定

           

posted @ 2018-11-05 16:19  牧马人夏峥  阅读(248)  评论(0编辑  收藏  举报