2017-07-07-用python进行函数编程

Table of Contents

1 函数式编程

1.1 Map

把一个函数映射到一个列表中的每个元素。一般和匿名函数(lambda)结合 使用。先看看下面这段代码:

     items = [1, 2, 3, 4, 5]
     squared = []
     for i in items:
         squared.append(i**2)
     print squared

修改为map后可以这样:

     items = [1, 2, 3, 4, 5]
     squared = list(map(lambda x: x**2, items))
     print squared

map不仅可以应用到全是数据的列表,还可以应用到全是函数的列表上(因为 函数式编程可以把函数也理解为数据,所以其实这两种也没差):

     # -*- coding: utf-8; -*-
     def add(x):
         return x + x

     def multi(x):
         return x * x

     f = [add, multi]

     # 这里的x分别就是上面的函数,一个一个进行调用罗
     value = map(lambda x: x(3), f)

     # 这里加了list转换,为了兼容,python2中map返回列表,3中map返回迭代器。
     print list(value)

map写一个把所有list中字符串转换为首字母大写其它小写的形式:

     def f(x):
         a = x.lower()
         return ''.join(a[0].upper()) + a[1:]

     b = ['XIE', 'sd', 'PDFJAF', 'aaaaaaaasdfasDSFFDSAF']
     print map(f, b)

1.2 Filter

和map类似的用法,它可以过滤满足条件的元素出来。

     num = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
     value = filter(lambda x: x < 0, num)
     print(list(value))

filter是内置函数,它类似于for,但是更快。但是大部分情况下,还是 推导式 更优雅一些。

1.3 Reduce

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

     reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

这样的话写一个求和的函数可以这样:

     a = range(201)
     print reduce((lambda x, y: x + y), a)

reduce求积:

     def fun(l):
         return reduce((lambda x, y:x * y), l)

     print fun(range(1, 5))

[1, 3, 5, 7, 9] 转换为13579可以这样:

     a = [1, 3, 5, 7, 9]
     def f(x, y):
         return x * 10 + y

     print reduce(f, a)

因为字符串也是一个序列,那么加上map我们可以这样搞一个字符串转换数字 的函数:

     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]

     a = map(char2num, '13579')
     b = reduce(fn, map(char2num, '13579'))
     print a
     print b
     print type(b)

整合起来弄成一个函数就可以是这样:

     def mystr2int(s):
         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))

     result = mystr2int('13579')
     print type(result), result

Author: Peng Xie

Created: 2018-10-01 Mon 21:36