代码改变世界

学习8: 内建函数,匿名函数,偏函数

2017-02-08 11:04  一方书斋  阅读(300)  评论(0编辑  收藏  举报

1. map(function,sequence)

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回

>>> map(abs, [-1,2,0,-9])
[1, 2, 0, 9]
>>> map(str, (1,2,3))
['1', '2', '3']
>>>

2. reduce

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
>>> 

3. filter

filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

def test(x):
    if x%3 == 0:
        return True
    else:
        return False

print filter(test, [2,3,4,6])

4. sorted

Python list内置sort()方法用来排序, 但是list.sort()方法仅被定义在list中,只能作用于list。

而sorted()方法就是全局的,它对任何可迭代的序列排序生成新的序列。

>>> a=[9,7,0,3,5,2]
>>> id(a)
48400392L
>>> a.sort()
>>> a
[0, 2, 3, 5, 7, 9]
>>> id(a)
48400392L
>>> 
>>> a=[9,7,0,3,5,2]
>>> sorted(a)
[0, 2, 3, 5, 7, 9]
>>> a
[9, 7, 0, 3, 5, 2]
>>> 

从上面可以看出使用list.sort()方法来排序,此时list本身将被修改,而用sorted()方法会返回一个新的list,不影响原先list。

 

5. lambda

关键字lambda表示匿名函数。

lambda会创建一个函数对象,但不会把这个函数对象赋给一个变量,而def则会把函数对象赋值给一个变量。

另外lambda只是一个表达式,而def则是一个语句。简单的说在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。因此,像if或for这种语句就不能用于lambda中,lambda一般只用来定义简单的函数。

>>> f = lambda x:x*2
>>> f(3)

 

6.偏函数

通过functools.partial帮助我们创建一个偏函数,作用就是把一个函数的某些参数给固定住(也就是设置默认值)返回一个新的函数,

调用这个新函数会更简单,而且不用更改原始函数。

import functools
def test(x,y):
    print x+y

test2=functools.partial(test,y=2)
test2(3)

这里函数test定义了两个参数,如果某种情况下y一直是2的情况,那么我们可以重新生成一个新的函数test2将参数y给固定,

然后调用test2就相对简单一点,而且没有更改原先的函数。 当然也可以更改原先函数设置默认值即可,如下:

def test(x, y=2):
    print x+y
test(4)