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
2char_list = ['1', '2', '3']
num_list = map(int, num_list)reduce()
reduce()接收一个函数(必须是二元操作函数)和一个序列作为参数,函数会作用于序列的元素,并且会把结果作用于下一个元素。比如:
1
2
3
4
5l = [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
11from 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
5l = [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
2g_object = (x*x for x in xrange(5))
g_object.next()
3、第三方模块的的实现
pyrsistent 构建纯函数
pysistent第三方库实现了python中一些不可变的数据类型,对于函数而言,使用不可变的数据类型,更加方便我们构造出纯函数functools partial 偏函数
partial的作用可以通过参数调用绑定的函数,设置默认的参数值
compose (高阶函数)
当看到compose时, 我的第一反应是这不是和Redux框架中连接中间件的compose一样吗,事实也是这样,他们功能类型,通过compose,可以让函数绑定多个顺序函数。
toolz.functoolz curry
用于实现函数柯里化,也就是多个单参数函数实现多参数函数的方法
fn模块 fn模块包含大量的易于构建函数式的语法糖
- 递归优化(注意Python递归1000个调用限制)