6.函数式编程
6.1高阶函数Higher-order function
- 简单高阶函数:传入函数
def add(x, y, f):
return f(x) + f(y)
6.1.1 map/reduce
- map(function, Iterable) -> Iterator
- e.g. 要把函数f(x)=x^2作用在一个list上
def f(x)
return x ** 2
r=map(f, [1, 2, 3, 4])
list(r)
- reduce(function, sequence)
- reduce得效果如下
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
- e.g.
>>> from functools import reduce
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
6.1.2 filter
- filter(function, sequence) -> Iterator 用于过滤序列,根据函数返回值为True/False决定保留或丢弃该元素
6.1.3 sorted
- sorted(list, key=[abs, str.lower], reverse=[True, Flase])
6.2返回函数
- 作用
- 将函数作为返回值
- 闭包
- 闭包
- 返回函数不要引用任何循环变量,或者后续会发生变化的变量
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
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
6.3匿名函数
-
如
list(map(lambda x: x * x, [1,2,3,4]))
-
匿名函不能写return语句,返回值就是表达式计算的结果
6.4装饰器
-
在不修改函数定义的情况下,动态增加函数的功能的方式,称为装饰器(decorator)
-
借助@语法,把decorator置于函数的定义处
-
e.g.
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log('execute')
def now():
print('2015-3-25')
>>> now() #now = log('execute')(now)
execute now():
2015-3-25
- 以上代码的
now.__name__
变为了wrapper
,可利用内置的functools.wraps
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
6.5偏函数(Partial function)
functools.partial
就是帮助我们创建一个偏函数的,不需要我们自己定义int2()
,可以直接使用下面的代码创建一个新的函数int2
:
>>> import functools
>>> int2 = functools.partial(int, base=2) #kw = { 'base': 2 }
>>> int2('1000000')
64
>>> int2('1010101')
85
functools.partial(object, *args, **kw)
参考教程
(转载整理自网络,如有侵权,联系本人删除,仅供技术总结使用)