Python函数式编程学习笔记
Python函数式编程基础
- 理解函数名也是一个变量
- 理解Python中的变量都具有指向意义
- 函数式编程就是一个高阶函数的输入参数是几个参数和几个函数名称,而输出也可能是一个函数名称的编程模式。
>>> def add(x, y, f):
return f(x) + f(y)
>>> f = abs
>>> add(-5, 6, abs)
11
map函数:
- 输入:函数名,list
- 输出:list
- 功能:将输入list中的每一个元素传入函数中,将所有结果放入list中输出
>>> def f(x):
... return x * x
...
>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce函数:
- 输入:双输入函数名,list
- 输出:一个值
- 功能:按顺序两个两个将list中的元素输入到函数中得到一个值,最终将list合并为一个值
关于reduce的直观解释如下
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
如果按位处理一个整数的话
>>> def fn(x, y):
... return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579
字符串转整型数就是这样
>>> 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, '13579'))
13579
还可以包装起来
def str2int(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))
不是特别复杂的函数可以用lambda代替
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(s):
return reduce(lambda x,y: x*10+y, map(char2num, s))
filter函数
- 输入:bool函数,list
- 输出:list
- 功能:根据传入的bool函数过滤list中的元素,true的留下,false的去掉
def is_odd(n):
return n % 2 == 1
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
sorted函数
- 输入:list,函数名
- 输出:list
- 功能:根据函数名定义的顺序,对list进行排序
Python内部的顺序定义x < y 返回 -1
x = y 返回 0
x > y 返回 1
def cmp_ignore_case(s1, s2):
u1 = s1.upper()
u2 = s2.upper()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
['about', 'bob', 'Credit', 'Zoo']
装饰器
用一个代码例子来解释可能更容易
>>> def now():
... print '2013-12-25'
...
>>> f = now
>>> f()
2013-12-25
def log(func):
def wrapper(*args, **kw):
print 'call %s():' % func.__name__
return func(*args, **kw)
return wrapper
@log
def now():
print '2013-12-25'
>>> now()
call now():
2013-12-25
@log放在now函数定义前面相当于执行了
now = log(now)
偏函数
- 引入模块:functools
- 形式:
int2 = functools.partial(int, base=2)
- 功能:定义一个新函数,新函数可以修改原函数的部分默认值
关于functools.partial
输入:func,*args,**kws
- 默认值其实是作为
kws
输入的:即{base:2}
- 如果传入
args
会将其作为func
函数的默认左输入
总结
- 对list进行合并用reduce
- 对list进行映射用map
- 对list进行过滤用filter
- 对list进行排序用sorted
- 简单函数的定义用lambda
- 修改已有函数用装饰器
- 修改已有函数的默认值用偏函数
后记
关于函数式编程,说到底,是为了让代码变的简洁强大,使用Python语言,其实没有必要在函数式编程上走的很远,只要用好了本文中的这些函数和技术,就可以让Python变得异常强大和精致。