前言:什么是函数式编程?
先提出这个问题,函数式编程是一种编程范式,这涉及到编程范式。编程范式主要有函数式编程和命令式编程。函数式编程关心数据的映射,命令式编程关心解决问题的步骤。在我看来,函数式编程就是类似于数学中的映射概念,每个输入都有确定的输出。这种被称为没有副作用,事实上真正的函数式编程是没有变量的。函数式编程最大的特点是:将函数作为参数输入,并将函数作为参数输出。最通俗的解释在知乎答案,什么是函数式编程思维。
1)高阶函数
所谓高阶函数就是可以将函数作为参数输入的函数。编写高阶函数就是将其函数式化的过程,让函数能接收别的函数。
注意:
- 变量可以指向函数名进行操作。f=abs;
- 函数名也是一个变量,也可以指向变量。abs=f;
示例代码如下:
def add(x, y, f):
return f(x) + f(y)
add(1,-2,abs)
这里将函数作为参数输入。输出结果为两个数取绝对值的和,3。接下来介绍几个常见的高阶函数。
(1)map
map()函数接收一个函数和一个列表。它的作用是将函数作用到列表中每个元素上面。然后再将结果封装成一个列表输出。示例代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(x):
return x*x
list=[1,2,3,4,5]
print map(func,list)
输出结果:
[1, 4, 9, 16, 25]
这里将func函数分别作用到[1,2,3,4,5].然后,输出新的列表。
(2)reduce
reduce同样接收一个函数和一个列表,但是它要求该函数是一个输入两个参数的函数。它的作用的是将每次输出的结果,作为一个参数和列表中的下一个参数共同输入到下一次函数运行中。最后输出一个整数。这个思想类似于递归。示例代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(x,y):
return 10*x+y
list=[1,2,3,4,5]
print reduce(func,list)
输出结果:
12345
(3)filter
filter同样接收一个函数和一个列表。它的作用是,将函数作用到每个元素上,如果返回值是true(1),就保留。反之,就丢弃。最后生成一个列表输出。示例代码如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(x):'''函数功能:取奇数'''
if x%2==1:
return True
else:
return False
list=[1,2,3,4,5]
print filter(func,list)
输出结果:
[1, 3, 5]
再举个例子:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def func(s):
return s and s.strip()
list=['a','b','c','','a']
print filter(func,list)
先将strip方法,这个方法是用来指定列表中边上的元素的。这里为空,则删除空字符。
这里s和s.strip()逻辑与,s.strip()为false时,相与为false,直接返回s(注意是返回s,不是返回false)。当s.strip()为True时,相与为True,返回后一项s.strip()。
(4)sort
排序是老生常谈的话题了,python内置的方法,sort()可以帮助用户来排序。
现在,介绍一下别的玩法。我们可以自定义规则(方法),来满足排序需求。在这之前先说一下,为了描述大小,我们抽象出来,x>y的话,返回1,x<y的话,返回-1,x=y的话返回0。比如,我们可以倒序排列。代码如下:
def func(x,y):
if x>y:
return -1
elif y>x:
return 1
else:
return 0
list=[1,2,3,4,5]
print sorted(list,func)
输出
[5, 4, 3, 2, 1]
这里我们将x>y设置为-1,则排序反过来了。