函数就是面向过程的程序设计的基本单元。
只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数

高阶函数Higher-order function

  • 函数本身也可以赋值给变量,即:变量可以指向函数。
  • 函数名其实就是指向函数的变量
  • 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
  • 编写高阶函数,就是让函数的参数能够接收别的函数。

    map/reduce

    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
    再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
    def regName(s):
    1. return s[0].upper()+s[1:].lower()
    lambda函数

    filter

    Python内建的filter()函数用于过滤序列
    和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

    sorted

    通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

    返回函数

    高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
    这种称为“闭包(Closure)”的程序结构拥有极大的威力
    返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量
    我说下我个人的理解吧,不一定对~:从网上看来的资料说,闭包 = 函数 + 引用环境,也就是说,当形成一个闭包之后,放进闭包的并不是具体的值。 以这一节的例子来看,闭包中应该只包含变量i的地址,告诉程序当他被调用时这个i应该从哪里找,此时并不涉及i的值。
    只有当真正调用时,才根据此时i的值算出最终结果,而此时在返回3个函数之后,i的值已经成为3了,所以当我们开始调用函数时,返回的值就都是9了

    匿名函数

    lambda
    匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
    匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数
    把匿名函数作为返回值返回
    lambda 定义了一个匿名函数
    lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
    如果可以使用for…in…if来完成的,坚决不用lambda。
    如果使用lambda,lambda内不要包含循环,如果有,我宁愿定义函数来完成,使代码获得可重用性和更好的可读性。

    装饰器

    本质上,decorator就是一个返回函数的高阶函数。
    这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
    import functools是导入functools模块。模块的概念稍候讲解。现在,只需记住在定义wrapper()的前面加上@functools.wraps(func)即可。
    二层嵌套now = log(now)
    三层嵌套now = log(‘execute’)(now)

    偏函数

    Partial function
    简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
    当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。