Python函数式编程

1、Haskell到python函数式编程

    在学习python的过程中,一直体会着它的简洁和优雅,也钟情于它的简洁和优雅。但在一次偶然的机会中,在微博上看到某位博主贴出的一串Haskell代码,代码的透明,凝练,模块化,由小到大把我深深的吸引住,了解之余,发现Haskell是一门函数式编程语言,函数式编程语言有着深厚的数学知识作为基础,将电脑的运算看作是数学上的函数计算,可能这也是“数学之美”吧,在震惊之余,我也尝试了解,python是不是也支持函数式编程呢?结果是肯定的,Python作为一门命令式语言,但是也具备了函数式编程的特点。
    经过查询资料,不断学习,也慢慢的发现,函数式编程的确是很深奥,甚至于是一种晦涩难懂的编程模式,它将计算机中的运算看作是数学中函数的运算。掌握了可以让我们受益匪浅,也能体会到python一行代码实现强大功能的乐趣。

2、函数式编程里的数学知识

    函数式编程里面含有很多的数学知识,函数作为函数式编程里面的一等公民,它来源于数学里面函数,而数学中,递归,合成与柯里化,高级函数。这些函数的转化关系,也都体现在了函数式编程中。

3、函数式编程的特点

  • 函数就是数据,函数是一等公民
  • 纯函数:给一个值,一定返回另一个值,运算过程中部会被外部改变,具有透明性
  • 无状态,区别于命令式编程
  • 强编译器的支持(python不支持)

4、python函数式编程的实现

python里面,函数式编程主要通过一些高阶函数来体现,所谓高阶函数,就是可以接受其他函数作为参数的函数。

1、内置函数的实现

  • lambda 匿名函数

    lambda 在很多编程语言中都有出现,作为一个匿名函数,可以不用让我们不必花时间编写那些简单的函数,比如:

    1
    l = map(lambda x: x*x, xrange(1, 10))  # 对序列的每个数进行平方操作
  • map()

    map()本身接收一个函数和一个序列作为参数,然后将传入的函数依次作用在序列中的每个元素中,使用map可以对元素进行高效的处理迭代。比如:

    1
    2
    char_list = ['1', '2', '3']
    num_list = map(int, num_list)
  • reduce()

    reduce()接收一个函数(必须是二元操作函数)和一个序列作为参数,函数会作用于序列的元素,并且会把结果作用于下一个元素。比如:

    1
    2
    3
    4
    5
    l = [1, 2, 3]
    def add_exp(x, y):
    return x+y

    res = reduce(add_exp, l)
  • groupby()

    groupby()是itertools中的一个函数,它的作用是对一个序列进行聚合分组运算,接收一个函数和一个序列,函数作用于参数key

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from itertools import groupby

    l = [-1, 2, 5, 7, 13]
    def check_num(h):
    if h>10:
    return 'big'
    elif h<=10 and h>5:
    return 'middle'
    else:
    return 'small'
    res = groupby(l, key=check_num)
  • filter()

    filter()接收一个过滤函数和一个序列,对序列的每个元素,使用过滤函数对元素进行过滤,结果为除去过滤结果为True的元素

    1
    2
    3
    4
    5
    l = [1, 2, 3, 4]
    def is_prime(x):
    if x % 2 == 0:
    return True
    res = filter(is_prime, l)

2、语法的的实现

  • 列表生成式

    列表生成式是python一个非常强大的魔法,使用它可以用一行代码表达很多语义,比如:

    1
    [ x*x for x in xrange(10) if x % 2 ==0]  # 求10以内偶数的平方
  • 生成器generator

    生成器可以快速生成一个可迭代的对象,操作速度快。

    1
    2
    g_object = (x*x for x in xrange(5))  # xragne本身也是生成器
    g_object.next() # 使用next方法访问

3、第三方模块的的实现

  • pyrsistent 构建纯函数

    pysistent第三方库实现了python中一些不可变的数据类型,对于函数而言,使用不可变的数据类型,更加方便我们构造出纯函数
    
  • functools partial 偏函数

    partial的作用可以通过参数调用绑定的函数,设置默认的参数值

  • compose (高阶函数)

    当看到compose时, 我的第一反应是这不是和Redux框架中连接中间件的compose一样吗,事实也是这样,他们功能类型,通过compose,可以让函数绑定多个顺序函数。

  • toolz.functoolz curry

    用于实现函数柯里化,也就是多个单参数函数实现多参数函数的方法

  • fn模块 fn模块包含大量的易于构建函数式的语法糖

  • 递归优化(注意Python递归1000个调用限制)

热评文章