1.高阶函数
- map/reduce
map()函数接收两个参数,一个是函数一个是iterable,将函数作用到iterable上并返回一个iterator
reduce()函数把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算:
reduce(f,[x1,x2,x3,x4])=f(f(f(f(x1),x2),x3),x4)
- filter
筛选器函数,接收一个函数和一个序列,filter()把传入的函数作用于每个元素,根据返回值True还是False决定保留还是丢弃该元素 - sorted
sorted(iterable,key=function),key指定的函数作用于list的每一个元素上,根据key函数返回的结果进行排序
2.返回函数
- 当不需要立刻求和,而是在后面的代码中根据需要计算,即不返回结果而是返回函数
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
- 闭包
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
闭包返回的并不是计算结果,而是计算公式,这段代码里面,在函数内的fs里面存放的是ii,这时候返回的是[ii,ii,ii],当分别调用f1,f2,f3时,才会进行计算,而在count函数运算完成之后,i变为3,所以在运算f1,f2,f3时,变成[33,33,3*3],所以结果就都是9
3.匿名函数
lambda x:x*x
实际为:
def f(x):
return x*x
关键字lambda表示匿名函数,冒号前的x表示函数参数,且只能有一个表达式。
4.装饰器
接收一个函数作为参数,并返回一个函数,返回的这个函数要有我们希望加入的功能且还有被装饰的函数的功能(直接执行被装饰的函数,或者将被装饰的函数作为返回值返回)
把@log放到now()函数的定义处,相当于执行了语句:
now = log(now)
由于log()函数是一个decorator,返回一个函数,原来的函数还在,只是现在的now变量指向了新的函数
函数也是对象,它有__name__等属性,但经decorator装饰之后的函数,它们的__name__已经从原的’now’变成了’wrapper’,所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错,不需要编写wrapper.name = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的。
5.偏函数
functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
import functools
sorted2 = functools.partial(sorted,key=abs)
sorted2([1,-3,5,2,-4])
[1, 2, -3, -4, 5]
创建偏函数时,实际上可以接收函数对象、args和**kw这3个参数,当传入:
max2 = functools.partial(max, 10)
实际上会把10作为args的一部分自动加到左边,也就是:
max2(5, 6, 7)
相当于:
args = (10, 5, 6, 7)
max(*args)