高阶函数
python中,如果一个函数可以接收另一个函数作为参数,那么该函数可以称之为高阶函数。
如:
def add(x, g, f):
return g(x) + f(x)
函数式编程指的是这种高度抽象的高阶函数的编程范式(其实我也不懂额,没学过,后面有机会再学~)。
map/reduce函数
因为之前有自学过MIT的分布式课程,然后在实验室也用hadoop写过map和reduce函数,这个概念还比较熟悉。
1、map函数
但是在python中,map()函数接收的两个参数,一个是函数,一个是序列,map()函数则是将传入的函数依次作用到序列中的每个元素,并把结果作为新的list返回。
例如,如果要计算列表list中每个元素的平方,则可以如下调用
def f(x):
return x*x
map(f, [1,2,3,4])
那么上述函数调用相当于是
返回结果 :[f(1), f(2), f(3), f(4)]
2、reduce函数
reduce函数和map函数类似,也接收两个参数,一个为函数,一个为序列。但是reduce函数的作用则是把前一个函数作用的结果和序列的下一个元素做累积计算。
注:reduce的参数中的函数必须接收两个参数,以便接收前一计算结果和后一个序列元素。例如:
def add(x, y):
return x+y
reduce(add, [1, 2, 3, 4])
上述函数调用相当于
add(add(add(1,2),3),4)
3、map/reduce的应用
将字符串转换为对应的数字
def fn(x, y):
return x*10 + y
def charTonum(s):
return {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9 }[s]
def strTonum(s):
return reduce(fn, map(charTonum,s))
print(strTonum('123456'))
使用lambda函数(匿名函数)简化实现
def str2Int(s):
return reduce(lambda x,y: x*10 + y , map(charTonum,s))
filter函数
顾名思义,python內建的filter函数用于过滤序列。
filter函数接收一个函数和一个序列,filter()将传入的函数一次作用于序列中的每个函数,然后根据该函数结果是否为True决定是否保留该元素。
例如,如果要删除一个序列中的基数,可以如下写:
filter(lambda x: x%2 == 0, [-2,-1,1,2,3,4,5,6])
结果为[-2,2,4,6]
sorted函数(排序函数)
python中内置的sorted函数可以对list进行排序。
sorted函数可以直接对list进行排序,也可以通过传入比较函数进行排序。
例如:
(1)直接排序
sorted([2,9,4,8])
(2)比较函数排序(如倒排,sorted默认是升序排序)
def reverse_cmp(x,y):
if x>y:
return -1
if x<y:
return 1
return 0
sorted([2,9,4,8], reverse_cmp)
注意:sorted函数接收的可选比较函数为第二个参数,注意参数传递位置
函数作为返回值的函数
python中(C++也可以),高阶函数除了可以接收函数作为参数外,还可以将函数作为返回值返回。
(1)闭包
带有状态的函数即为闭包。其中,状态指的是函数运行的上下文
扩展:C++实现闭包的三种途径有函数对象、lambda表达式 和 boost::function/boost::bind
python中的闭包,函数fA返回fB后,fA中的局部变量还能被fB引用。
并且函数fA中变量的状态的改变,将会影响到被返回函数。例如:
def count():
fs = [] ## 创建一个slice
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs
f1,f2,f3 = count()
注意:此时,f1(),f2(),f3()的结果应该都为9,原因是函数延迟调用,并且使用了count中的状态,而此时count中的状态变量i=3,所以三个函数调用的结果都为9
为了能够让f1() 返回1,f2()返回4 ,f3()返回9,可以在循环中为每个被返回的函数添加参数,如:
def count_unique():
fs =[]
for i in range(1,4):
def f(k):
return lambda :k*k ##匿名函数
fs.append(f(i))
return fs
f1,f2,f3 = count_unique()
匿名函数(lambda函数)
python中,关键字lambda表示匿名函数,lambda之后且冒号之前,是匿名函数的参数,冒号之后是函数体(只能有一个表达式),且该表达式即为函数返回值。例如:
lambda x,y : x+y
等价于
def add(x,y):
return x+y
匿名函数也是一个函数对象,可以将匿名函数赋值给一个变量,在通过变量来调用该函数;也可以将匿名函数作为返回值返回。
python中,函数对象有一个__name__属性,可以通过该属性获取函数的名字。
python装饰器
在函数运行期间动态增加功能的方式,称为装饰器。装饰器本质上也是一个返回函数的高阶函数。
python装饰器接受一个函数作为参数,并返回一个函数,一般使用@语法实现函数的装饰器功能。例如:
定义一个打印日志的装饰器:
def log(func):
def wrapper(*args,**kw): ## 一个元组和一个字典作为wapper的参数
print 'begin call %s()' % func.__name__ ## 函数调用前打印日志
ret = func(*args,**kw) ## 未装饰函数
print 'end call %s()' % func.__name__ ## 函数调用后打印日志
return ret
return wrapper
@log
def getTime():
print '2016-5-19'
偏函数
扩展:偏导数(高数)、偏特化(C++模板),偏函数(python)
定义:函数的部分参数的实际参数值固定(默认形参)。
使用functools.partial创建偏函数:将某一个函数的某些参数固定(设置默认值),返回一个新函数,可以简化函数调用。

浙公网安备 33010602011771号