您的位置:首页 > 其它

rsyslog+loganalyzer日志收集分析处理

2013-11-25 17:37 513 查看
MAP/REDUCE

map():
map()函数接收两个参数,一个是函数,一个是Iterable。map将传入的函数一次作用到序列的每个元素。并把结果作为Iterator返回。
举例,有一个计算机平方的函数。f(x) =x * x
>>>def f(x):
return x *x
>>>r =map(f,[1,2,3,4,5])
>>>list(r)
[1,4,9,16,25]
map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,是惰性序列,所以通过list()将整个序列都计算出来,并返回一个list。
上述结果同样可以使用循环做到:
>>>L =[]
>>>for i in [1,2,3,4,5]:
L.append(f(i))
print(L)
事实上,map()作为高阶函数它把运算规则抽象化了,因此我们不仅可以计算f(x) = x*x ,而且还可以计算人以复杂的函数,比如把这个list所有数字转化为字符串:
>>>list(map(str,[1,2,3,4,5,6,7,8]))
['1','2','3','4','5','6','7','8']

reduce:
reduce是把一个函数作用在一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,效果:
reduce(f,[x1,x2,x3,x4]) =f(f(f(x1,x2),x3),x4)

如果将序列[1,2,3,4,5]变成12345,则使用reduce实现将是非常简单:
>>>from functools import reduce
>>>def fn(x,y):
return x*10 +y
>>>reduce(fn,[1,2,3,4,5])
12345
这个例子本身没有多大用处,但是如果考虑到字符串也是一个序列,对上面的例子稍加改动。配合map(),我们就可以写出将str转换为int的函数:
>>>from functools import reduce

>>>def fn(x,y):
return x*10 +y
>>>def char2num(s):
return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
>>>reduce(fn,map(char2num,'12345'))

12345
整理成一个str2int的函数就是:
>>>from functools import reduce
def str2int():
def fn(x,y):
return x*10 +y
def char2num(s):
return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
return reduce(fn,map(char2num,s))
还可以使用lambda进一步简化:
>>>from functools import reduce

>>>def char2num(s):
return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
>>>def str2int():
return reduce(lambda x,y:x*10+y,map(char2num,s))

也就是说Python没有提供int()函数,你完全可以自己写一个把字符串转换为整数的函数。而且只需要几行代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: