函子
map
映射
map()
是 Python 内置的高阶函数,它接收一个函数 f
和一个 可迭代对象,并通过把函数 f
依次作用在 可迭代对象 的每个元素上,并返回一个新的可迭代对象。
def f(x):
return x * x
print('map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])):',
list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
print('map(lambda x, y: x * y, [1, 2, 3], [4, 5, 6]):',
list(map(lambda x, y: x * y, [1, 2, 3], [4, 5, 6])))
map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])): [1, 4, 9, 16, 25, 36, 49, 64, 81]
map(lambda x, y: x * y, [1, 2, 3], [4, 5, 6]): [4, 10, 18]
def format_name(s):
s1 = s[0:1].upper() + s[1:].lower()
return s1
print("map(format_name, ['adam', 'LISA', 'barT']):",
list(map(format_name, ['adam', 'LISA', 'barT'])))
map(format_name, ['adam', 'LISA', 'barT']): ['Adam', 'Lisa', 'Bart']
reduce
递推
from functools import reduce
m = 2
n = 5
reduce(lambda x, y: x * y, list(range(1, n + 1)), m)
240
filter
过滤器
print("filter((lambda x: x>0), range(-5, 5)):",
list(filter((lambda x: x > 0), range(-5, 5))))
filter((lambda x: x>0), range(-5, 5)): [1, 2, 3, 4]
zip
并行
print("zip( [1, 2, 3], [4, 5, 6]):", list(zip([1, 2, 3], [4, 5, 6])))
zip( [1, 2, 3], [4, 5, 6]): [(1, 4), (2, 5), (3, 6)]
下面以一个例子结束:
L = list(range(6))
## 计算l中每个元素的两倍和平方,并将两种组成一个列表
## lambda表达式和python函数一样,也可以接受函数作为参数
twoTimes = lambda x: x * 2
square = lambda x: x**2
print([list(map(lambda x: x(i), [twoTimes, square])) for i in L])
print(list(filter(lambda x: x % 2 == 0, L)))
## 内置reduce函数,计算 L 的和
print(reduce(lambda accumValue, newValue: accumValue + newValue, L, 0))
[[0, 0], [2, 1], [4, 4], [6, 9], [8, 16], [10, 25]]
[0, 2, 4]
15
函数修饰器(Decorator)
Python中的函数是对象,故函数可以被当做变量使用。
参考资料:
作用:
对已有的函数添加一些小功能,却又不希望对函数内容有太多的刚性的修改。
- 将需要添加功能的函数像普通对象一样作为参数传入修饰器在中;
- 将函数作为修饰器的返回值返回。
修饰器的本质: Python解释器在发现函数调用修饰器后,将其传入修饰器中,然后用返回的函数对象将自身完全替换。
一个函数可以被多个修饰器嵌套修饰:
@deco3
@deco2
@deco1
def df():
pass
等同于 f=deco3(deco2(deco1(f)))
示例
添加水印 Hello World_
def deco(func): #修饰器deco
def wrappedFunc(): #内嵌函数wrappedFunc(所有对于传入函数的修饰逻辑都将在此内嵌函数中实现。)
return 'Hello World_'+func()
return wrappedFunc
# 在程序中若有函数需要修饰器修饰,只需在函数定义前使用“`@+修饰器名`”即可使用此修饰器。
@deco
def f(): # 调用修饰器
return 'I am f'
def g(): # 没有调用修饰器
return 'I am g'
print(f())
print(g())
Hello World_I am f
I am g
def deco(f):
def g():
return [f()[i] for i in range(5)]
return g
@deco
def h():
return [1,2,3,4,56,7,'75s']
print(h())
[1, 2, 3, 4, 56]