6.函数式编程
6.1高阶函数Higher-order function
简单高阶函数:传入函数
def add(x
, y
, f
):
return f
(x
) + f
(y
)
6.1.1 map/reduce
map(function, Iterable) -> Iteratore.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
))
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
()
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)
>>> int2
('1000000')
64
>>> int2
('1010101')
85
functools.partial(object, *args, **kw)
参考教程
廖雪峰老师的Python3教程
(转载整理自网络,如有侵权,联系本人删除,仅供技术总结使用)