在Python中,有几个特别的函数,它们常常被看做是Python能够进行所谓“函数式编程”的见证。它们是:filter、map、reduce、lambda、yield。有了它们,可以使得程序更简洁,没有它们,程序也可以以其他方式实现,只是有些麻烦罢了。
lambda
lambda函数,是一个一行就能解决问题的函数。
在Python,有两种函数,一种是def定义,一种是lambda函数。
定义:顾名思义,即没有函数名的函数。Lambda表达式是Python中一类特殊的定义函数的形式,使用它可以定义一个匿名函数。与其它语言不同,Python的Lambda表达式的函数体只能有唯一的一条语句,也就是返回值表达式语句。
lambda的一般形式是关键字lambda,之后是一个或者多个参数,紧跟的是一个冒号,之后是一个表达式:
lambda argument1 argument2 ... :expression using arguments
lambda是一个表达式,而不是一个语句。
lambda主体是一个单一的表达式,而不是一个代码块。
举一个简单的例子,假如要求两个数之和,用普通函数或匿名函数如下:
1)普通函数: def func(x,y):return x+y
2)匿名函数: lambda x,y: x+y
g = lambda x,y:x*y
g(10,3) // 输出30
1、lambda后面直接跟变量
2、变量后面是冒号
3、冒号后面是表达式,表达式计算结果是本函数的返回值
虽然lambda函数可以接收任意多个参数(包括可选参数)并且返回单个表达式的值,但是lambda函数不能包含命令,包含的表达式不能超过一个。不要试图向lambda函数中塞入太多的东西;如果需要更复杂的东西,应该定义一个普通函数。
map
map(function ,iterable,...)
说明:function是一个函数,iterable是一个序列对象
1、对于iterable中 的每个元素,依次应用function的方法(函数)这本质上就是一个for循环
2、将所有结果返回一个list
3、如果参数很多,则那些参与并执行function。
items = [1,2,3,4,5]
map(lambdax:x**2,items) // 输出[1,4,9,16,25]
lst1 = [1,2,3,4,5]
lst2 = [6,7,8,9,10]
map(lambda x,y:x+y,lst1,lst2)//输出[7,9,11,13,15]
reduce
reduce(function, iterable[ initializer])
reduce函数格式:reduce(func, seq[, init]).
reduce函数即为化简,它是这样一个过程:每次迭代,将上一次的迭代结果(第一次时为init的元素,如没有init则为seq的第一个元素)与下一个元素一同执行一个二元的func函数。在reduce函数中,init是可选的,如果使用,则作为第一次迭代的第一个元素使用。
简单来说,可以用这样一个形象化的式子来说明:
reduce(func, [1,2,3])=func(func(1,2), 3)
举个例子来说,阶乘是一个常见的数学方法,Python中并没有给出一个阶乘的内建函数,我们可以使用reduce实现一个阶乘的代码。
n = 5
print reduce(lambdax, y: x * y, range(1, n + 1)) #120
如果我们希望得到2倍阶乘的值呢?这就可以用到init这个可选参数了。
m = 2
n = 5
print reduce(lambdax, y: x * y, range( 1, n + 1 ), m ) # 240
filter
filter(function, iterable)
filter 的中文含义是“过滤器”,在 Python 中,它就是起到了过滤器的作用。首先看官方说明:
numbers = range(-5,5) #[-5, -4, -3, -2, -1,0,1,2,3,4]
filter(lambda x:x>0,numbers) #[1,2,3,4]
filter(lambda y:y!='u','wuxiaoxin') #'wxiaoxin'

装饰器(函数)
定义:装饰器就是一函数,用来包装函数的函数,用来修饰原函数,将其重新赋值给原来的标识符,并永久的丧失原函数的引用。

其实对装饰器的理解,我们可以根据它的名字来进行,主要有三点:
1)首先装饰器的特点是,它将函数名作为输入(这说明装饰器是一个高阶函数);
2)通过装饰器内部的语法将原来的函数进行加工,然后返回;
3)原函数通过装饰器后被赋予新的功能,新函数覆盖原函数,以后再调用原函数,将会起到新的作用。
说白了,装饰器就相当于是一个函数加工厂,可以将函数进行再加工,赋予其新的功能。

为什么是这个结果呢?
1)首先hello函数经过makeitalic 函数的装饰,变成了这个结果hello world
2)然后再经过makebold函数的装饰,变成了hello world,这个理解起来很简单。
网友评论