吾本轻狂|函数式编程( 二 )


upname =['HAO', 'CHEN', 'COOLSHELL']lowname =for i in range(len(upname)):lowname.append( upname[i].lower )对于map我们别忘了lambda表达式:你可以简单地理解为这是一个inline的匿名函数 。 下面的lambda表达式相当于:def func(x): return x*x
squares = map(lambda x: x * x, range(9))print squares# 输出 [0, 1, 4, 9, 16, 25, 36, 49, 64]我们再来看看reduce怎么玩?(下面的lambda表达式中有两个参数 , 也就是说每次从列表中取两个值 , 计算结果后把这个值再放回去 , 下面的表达式相当于:((((1+2)+3)+4)+5) )
print reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])# 输出 15Python中的除了map和reduce外 , 还有一些别的如filter, find, all, any的函数做辅助(其它函数式的语言也有) , 可以让你的代码更简洁 , 更易读 。我们再来看一个比较复杂的例子:
计算数组中正数的平均值
num =[2, -5, 9, 7, -2, 5, 3, 1, 0, -3, 8]positive_num_cnt = 0positive_num_sum = 0for i in range(len(num)):if num[i] > 0:positive_num_cnt += 1positive_num_sum += num[i]if positive_num_cnt > 0:average = positive_num_sum / positive_num_cntprint average# 输出 5如果用函数式编程 , 这个例子可以写成这样:
positive_num = filter(lambda x: x>0, num)average = reduce(lambda x,y: x+y, positive_num) / len( positive_num )C++11玩的法:
#include #include #include using namespace std;int main {string s="hello";string out;transform(s.begin, s.end, back_inserter(out), ::toupper);cout << out << endl;// 输出:HELLO}我们可以看到 , 函数式编程有如下好处:
1)代码更简单了 。
2)数据集 , 操作 , 返回值都放到了一起 。
3)你在读代码的时候 , 没有了循环体 , 于是就可以少了些临时变量 , 以及变量倒来倒去逻辑 。
4)你的代码变成了在描述你要干什么 , 而不是怎么去干 。
最后 , 我们来看一下Map/Reduce这样的函数是怎么来实现的(下面是Javascript代码)
MAP函数
var map = function (mappingFunction, list) {var result = ;forEach(list, function (item) {result.push(mappingFunction(item));});return result;};下面是reduce函数的javascript实现
【吾本轻狂|函数式编程】REDUCE函数
function reduce(actionFunction, list, initial){var accumulate;var temp;if(initial){accumulate = initial;}else{accumulate = list.shfit;}temp = list.shift;while(temp){accumulate = actionFunction(accumulate,temp);temp = list.shift;}return accumulate;};Declarative Programming vs Imperative Programming
前面提到过多次的函数式编程关注的是:describe what to do, rather than how to do it. 于是 , 我们把以前的过程式的编程范式叫做 Imperative Programming – 指令式编程 , 而把函数式的这种范式叫做 Declarative Programming – 声明式编程 。
下面我们看一下相关的示例(本示例来自这篇文章 ) 。
比如 , 我们有3辆车比赛 , 简单起见 , 我们分别给这3辆车有70%的概率可以往前走一步 , 一共有5次机会 , 我们打出每一次这3辆车的前行状态 。
对于Imperative Programming来说 , 代码如下(Python):
from random import randomtime = 5car_positions = [1, 1, 1]while time:# decrease timetime -= 1print ''for i in range(len(car_positions)):# move carif random > 0.3:car_positions[i] += 1# draw carprint '-' * car_positions[i]


推荐阅读