7. Python基础学习笔记——函数式编程

函数式编程

  • 函数是面向过程的程序设计的基本单元
  • Functional Programming函数式编程,更加接近数学计算。
  • 函数式编程时抽象程度很高的编程范式。允许接受一个函数作为参数,还可以返回一个函数。
  • 分为纯函数式编程和非纯函数式编程:前者没有变量,没有副作用;后者则相反。
  • Python对函数式编程提供部分支持。

高阶函数

  • High-order function
  • 可以将函数名赋值给一个变量,从让让变量指向函数。可见,函数名称本身也可以看做指向函数的指针,它也是一个变量。x = abs
  • 高阶函数:一个可以接受另外一个函数作为参数的函数。
  • 函数式编程就是这种高度抽象的编程范式

map/reduce

  • Python内置函数
  • map()函数接收两个参数:函数+iterables,map将传入的函数依次作用到序列的每个元素,把结果作为新的Iterator返回。
  • map作为高阶函数,把运算规则抽象了。
  • reduce()函数在functools模块中,使用前需要导入
  • reduce,它把一个函数作用在一个序列上,会把结果继续和序列的下一个元素做累积计算。reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
  • reduce还可以接收一个额外的initial值,并且会应用在序列项最前面,比如reduce(f, [x1, x2, x3], x0)
  • reducemap配合可以实现如 字符转整数等功能

filter

  • 用于过滤序列
  • filter()根据函数返回的True或者False来决定是否保留一个数据
  • 可以用filter求素数
  • 技巧:l[::-1]可以倒序输出一个序列!!!

sorted

  • 可以对list排序
  • 可以通过设定key,自定义排序
  • 根据key返回结果排序
  • sorted([1, 2, -3, -5, 9], key=abs, reverse=True)
  • 高阶函数:关键在于实现一个映射函数

返回函数

函数作为返回值

  • 可以将函数作为结果返回
  • lazy_sum返回sum时,相关参数和变量都保存在返回的函数中,称为闭包(Closure)

闭包

  • 当一个函数返回一个函数后,它内部的局部变量仍然被新函数引用
  • 返回的函数也并没有立刻执行
  • 由此,返回闭包时需要牢记的是:返回函数中不可以引用例如循环变量或者其他可能会发生变化的变量。因为返回的函数并不是即刻执行的,所以调用时可能会得到意想不到的结果!
  • 如果必须要使用循环变量时,方法就是再创建一个函数,用该函数的参数绑定循环变量当前的值,这样无论循环变量如何改变,已经绑定的参数值不会变化。

    def count():
    ...     def f(j):
    ...         def g():
    ...             return j * j
    ...         return g
    ...     
    ...     fs = []
    ...     for i in range(1, 5):
    ...         fs.append(f(i))
    ...     return fs
  • 一个函数可以返回一个计算结果,也可以返回一个函数
  • 返回一个函数时,该函数并没有立刻执行,返回的函数中尽可能不要引用任何可能会变化的变量

匿名函数

  • Python对匿名函数进行了有限的支持:当不需要显示定义函数时,可以直接传入匿名函数,这样非常方便。
  • 关键字是lambda,注意不要拼写错了!!!
  • 匿名函数只能有一个表达式,且不必写return,表达式运算结果会被自动返回
  • 也可以将匿名函数赋值给一个变量,然后利用变量调用
  • 示例一:没有参数的情况

    lambda : x * x
    # 等效于
    def f():
    return x * x
  • 示例二:接收参数

    lambda x, y, z: x + y * z
    # 等效于
    def g(x, y, z):
    return x + y * z
  • 在高阶函数中的应用:

    x = map(lambda n: n * n, range(1, 20))
    x

装饰器

  • 函数也是对象。
  • 函数本身拥有如__name__属性等
  • 使用装饰器时可以多层嵌套,自由定制
  • 当需要增强一个函数的功能,但是又不用修改函数时,可以使用装饰器。在代码运行期间动态增加功能的方式。
  • @语法
  • 需要使用functools.wraps函数来保证装饰器函数不会修改原函数的__name__属性。在装饰器前加入@functools.wraps(func)即可。

总结

  • 在OOP设计模式中,decorator被称为装饰模式。OOP装饰模式需要继承和组合实行。
  • Python中可以使用类或者函数来实现。Python直接在语法层面上支持decorator
  • 增强函数的功能

偏函数

  • 当函数的参数个数过多,需要简化调用时,可以使用functools.partial函数创建一个新的函数,新的函数会固定原函数的部分参数,从而在调用的时候更加简单
  • int2 = functools.partial(int, base=2),这样在后面调用int2('10101')时,自动采用二进制转换。
  • 实际上,上述方法就是将int函数的base给默认设为2,同样,也可以在调用int2时传入base=10更改其默认值,但只是临时的更改。
  • partial()函数接收的参数中有*args**kw,所以上述方式,实际上表明kw = {'base': 2}

你可能感兴趣的:(7. Python基础学习笔记——函数式编程)