函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
1.高阶函数
一个函数可以接收另一个函数作为参数,这种函数称为高阶函数
def add(x,y,f):
return f(x) + f(y)
x = -5 、y = 6、 f = abs、 f(x) + f(y) = abs(-5) + abs(6) = 11
return 11
2.map/reduce
map函数:接收两个参数,一个是函数,一个是可迭代对象。map的作用是将传入的函数依次作用到序列的每个元素,并将结果作为迭代器返回
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce函数:接收两个参数,一个是函数,一个是可迭代对象。reduce的作用是将每一个元素的函数结果作用到下一个元素中
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
def prod(x,y):
return x * y
print(reduce(prod,[1,3,5])) #15
3.filter
filter函数用于过滤序列,同样接收函数和可迭代对象,将函数作用于每一个元素中,然后进行筛选
4.sorted
排序函数可以直接比较两个元素的大小
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
5.返回函数
函数嵌套函数时,将内部函数作为结果进行返回。内部函数可以引用外部函数的参数和局部变量。这种方式称为闭包。
返回函数不要引用任何循环变量,或者是变化的变量。函数的返回值不是立即执行,而是在调用之后才开始执行。若要使用循环变量,则需要再创建新的函数,将该变量作为参数传入。
6.匿名函数
lambda x : x * x = def f(x):
return x * x
也可以先将匿名函数赋值给变量,再调用该变量。
7.装饰器
在代码动态运行期间动态增加功能,被称为装饰器(就是用一个透明的大函数包裹起来,在程序运行时调用这个函数)
#定义
def log(func):
def wrapper(*args,**kw):
print('call %s():' % func.__name__) #两横
return func(* args,**kw)
return wrapper
@log = now = log(now)
def now():
print('2018-12-11')
#调用
now()
#输出
call now():
2018-12-11
8.偏函数
偏函数位于functools的模块中,名称为partial。作用为将一个函数的某些参数给固定住,返回一个新的函数,从而增强作用。