Python函数式编程(函数)
2.2、从函数开始:
定义一个函数:
def add(x, y):
return x+y
使用lambda可以定义简单单行匿名函数:lambda的语法是:lambda args:expression
参数与普通函数一样,表达式的值就是匿名函数返回的值
lambda_add = lambda x,y:x+y
使用lambda的目的是编写简单的,偶尔的,可预见不会被修改的函数。
2.2、使用函数赋值
add_a_function_to_anther = add
print add_a_function_to_another(1, 2) //3
既然函数可以被变量引用,那么将函数作为参数和返回值就是很寻常的做法。
2.3、闭包
闭包是一类特殊的函数:如果一个函数定义在另一个函数的作用域中,并且函数中引用了外部函数的局部变量,那么函数就是一个闭包。e.g.:
def f():
n = 1
def inf():
print n
inf()
n = 'x'
inf()
类似于普通模块函数和模块中定义全局变量的关系:修改外部变量能影响内部作用域中的值,而在内部作用域中定义同名变量则将屏蔽(隐藏)外部变量。
需要在函数中修改全局变量,使用关键字global。Python2中没有支持闭包中修改参数,Python3中关键字nonlocal可以修改。
2.4、作为参数
与将函数当做参数传递大体一样。
定义一个函数:
def reduce(function, lst, initial):
result = initial
for num in lst:
result = function(result, num)
result result
print reduce(add, lst, 0) //计算加法
print reduce(lambda x,y:x*y, lst, 1) //计算乘法
2.5、作为返回值
函数作为返回值通常与闭包一起使用。
def map(function, lst):
result = []
for item in lst:
result.append(function(item))
result result
使用map为lst中的每个元素加1:
lst = map(lambda x:add(1,x), lst)
print reduce(lambda x,y:x*y, lst, 1)
根据指定的做操作数,能生成一个加法函数,用起来像这样:
lst = map(add_to(10), lst) #add_to(10)返回一个函数,这个函数接受一个参数并加上10后返回
下面是add_to函数:
def add_to(n):
return lambda x:add(n,x)
通过已经存在的某个函数指定数个参数,生成一个新的函数,这个函数只需要传入剩余未指定的参数就能实现原函数的全部功能,这被称为偏函数。Python内置的functools模块提供了一个函数partial,可以为任意函数生成偏函数:
functools.partial(func[, *args][, **keywords])
需要指定生成偏函数的函数,指定数个参数或者命名,然后partial将返回一个像函数一样可调用的对象(偏函数)。
另一个特殊的例子谁装饰器,装饰器用于增强甚至改变原函数的功能。
原文出处:http://www.cnblogs.com/huxi/archive/2011/06/18/2084316.html