标签:
1.概念:
函数式编程就是一种抽象程度很http://i.cnblogs.com/EditPosts.aspx?opt=1高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作 用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
2.高阶函数:一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1)变量可以指向函数:函数本身也可以赋值给变量,即:变量可以指向函数
f = abs
>>> f(-10)
2)函数名也是变量:
abs = 10
>>> abs(-10)出错
把abs
指向10
后,就无法通过abs(-10)
调用该函数了!因为abs
这个变量已经不指向求绝对值函数了!
3)传入函数:
def add(x, y, f):
return f(x) + f(y)
4)map/reduce:
map()
函数接收两个参数,一个是函数,一个是序列,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。map()
作为高阶函数,它把运算规则抽象了。
实例:实现x*x
def f(x):
return x * x
>>>map(f,[1,2,3,4,5])
[1, 4, 9, 16, 25
]
reduce()把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
即reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
def fn(x, y):
return x * 10 + y
>>>reduce(fn, [1, 3, 5, 7, 9])
13579
5)filter:
filter()
函数用于过滤序列,filter()
也接收一个函数和一个序列,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
def is_odd(n):
return n % 2 == 1
>>>filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
[1, 5, 9, 15]
6)sorted:
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
>>>sorted([36, 5, 12, 9, 21], reversed_cmp)
3.返回函数:高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
1)函数作为返回值:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
2)闭包:
返回的函数在其定义内部引用了局部变量args
,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
4.lambda:
lambda
表示匿名函数,冒号前面的x
表示函数参数,就是只能有一个表达式,不用写return
,返回值就是该表达式的结果。
>>>map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
5.装饰器:假设我们要增强某个
函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改原
函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
def now():
print ‘2013-12-25‘
>>>now.__name__ #可以获得函数名
def log(func):
def wrapper(*args, **kw):
print ‘call %s():‘ % func.__name__
return func(*args, **kw)
return wrapper
@log
def now():
print ‘2013-12-25‘
6.偏函数:
functools.partial()
:把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
标签:
原文地址:http://www.cnblogs.com/xp12/p/4343919.html