python函数式编程
1.高阶函数
将函数作为参数传入
1)map/reduce
map:传入两个参数,一个是函数,一个是迭代器,主要作用是将运算规则抽象化表达,如:
>>> def f(x): return x * x >>> r = map(f,[1,2,3,4,5,6,7]) >>> list(r) [1, 4, 9, 16, 25, 36, 49]
reduce:传入两个参数,做累计效果
将[1,3,5,6]变成1356
>>> from functools import reduce >>> def fn(x,y): return x*10 + y >>> reduce(fn,[1,3,5,6]) 1356
也可将str转换成int
from functools import reduce DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def str2int(s): def fn(x, y): return x * 10 + y def char2num(s): return DIGITS[s] return reduce(fn, map(char2num, s))
2)fliter:用于过滤序列
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 结果: [1, 5, 9, 15]
3)sorted:排序操作,实现字符串、列表等的排序
默认是从小到大排序
>>> sorted([36,2,-34,5,9])
[-34, 2, 5, 9, 36]
也可以接受一个key,做自定义排序,此处按照绝对值大小进行排序
>>> sorted([39,-37,-1,-39],key=abs)
[-1, -37, 39, -39]
2.返回函数
返回的函数在其定义内部引入了局部变量,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用
如下所示:原因就在于返回的函数引用了变量i
,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i
已经变成了3
,因此最终结果为9
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
>>> f1() 9 >>> f2() 9 >>> f3() 9
def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
3.匿名函数
def is_odd(n): return n % 2 == 1 L = list(filter(is_odd, range(1, 20)))
L = list(filter(lambda x: x % 2 == 1, range(1, 20)))
4.装饰器函数
完整的装饰器函数写法:
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
5.偏函数
简单总结functools.partial
的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。