python函数之二 函数式编程
1lambda
格式:
lambda [arg1[, arg2, ... argN]]:expression
python允许用lambda关键词创建匿名函数。匿名是因为不需要以标准的方式来声明。一个完整的lambda语句代表了一个表达式,这个表达式的定义体必须和声明放在同一行。参数是可选的。
用合适的表达式调用一个lambda声称一个可以像其他函数一样使用的函数对象。它们可以被传递给其他函数,用额外的引用别名化,作为容器对象以及作为可调用的对象被调用。
>>> def add(x,y):return x + y
...
>>> add(1,2)
3
>>> addl = lambda x, y: x + y
>>> addl(1,2)
3
>>> add2 = lambda x, y=2: x + y
>>> add2(3)
5
>>> add2(3,4)
7
2内建apply,filter,map,reduce
apply()
apply(func[,nkw][,kw])
用可选的参数来调用func, nkw为非关键字参数,kw为关键字参数。返回值是一个函数调用的返回值。
apply()函数以后会弃用。
filter()
filter(func,seq)
调用一个布尔类型的函数func来遍历seq中的每个元素。返回一个使func返回值为true的元素的序列。
>>> from random import randint
>>> odd = lambda n : n % 2
>>> nums = [ randint(1,100) for i in range(10) ]
>>> nums
[61, 33, 8, 88, 26, 74, 33, 48, 21, 19]
>>> filter(odd,nums)
[61, 33, 33, 21, 19]
map()
map(func,seq1[,seq2...])
将函数func作用于给定序列的每一个元素,并用一个列表来提供返回值。
>>> map((lambda x: x+2),[0,1,2,3,4,5])
[2, 3, 4, 5, 6, 7]
>>> map((lambda x: x**2),[0,1,2,3,4,5])
[0, 1, 4, 9, 16, 25]
reduce()
reduce(func,seq[,init])
将二元函数作用于seq序列的元素,每次携带一对(先前的结果和下一个序列元素)。连续的将现有的结果和下一个值作用在获得的随后结果上。如果初始值Init给定,则第一个比较会是在Init和第一个序列元素。
reduce( (lambda x, y: x + y),range(5))
等同于
( ( ( (0 + 1) + 1 ) + 2 ) +3 ) +4
其原理如下:
def reduce(func,seq,init=None):
lseq = list(seq)
if init is None:
res = lseq.pop(0)
else :
res = init
for item in lseq:
res = func(res,item)
return res