Python的一些内建函数
Python是支持多种范型的语言,可以进行函数式编程,其突出变现在有这么几个函数:map、yield、lambda、filter、reduce等,有了他们,最大的好处就是程序更简洁,恰当的使用这些内建函数,让人感觉更牛X。
1.map:
基本样式为:map(function, sequence)
map()函数接受两个参数,一个是函数,一个是iterable,map将传入的函数依次作用于序列的每个元素,并将结果作为新的iterator返回。如:
>>> def add(x):
... x += 3
... return x
...
>>> numbers = [1,2,3,4]
>>> new_numbers = []
>>> for i in numbers:
... new_numbers.append(add(i))
...
>>> new_numbers
[4,5,6,7]
# 以上为一般方法
# 以下为map方法
>>> numbers = [1,2,3,4]
>>> map(add, numbers)
[4,5,6,7]
2.yield:
在Python中yield是一个关键词,是生成器的标志,含有yield关键词的函数返回值是一个生成器类型的对象,只要用了yield语句,一个普通的函数就神奇的变成了生成器,也就具备了迭代器的功能特性。如:
>>> def fib(n):
... i, a, b = 0, 0, 1
... while i < n:
... yield b
... a, b = b, a + b
... i += 1
...
>>> g = fib(5)
>>> g
<generator object fib at 0x1080aab40>
>>> for i in g:
... print i
...
1
1
2
3
5
3.lambda(匿名函数):
基本样式为:lambda arg1,arg2,...argN: expression using arguments
lambda函数的使用方法:
1.在lambda后面直接跟变量
2.变量后面是冒号
3.冒号后面是表达式,表达式计算的结果就是函数的返回值,如:
>>> list1 = [1,2,3,4]
>>> lam = lambda x: x + 3
>>> list2 = []
>>> for i in list1:
... list2.append(lam(i))
...
>>> list2
[4,5,6,7]
4.filter:
filter的意思是过滤,在Python中,他就是起到了过滤器的作用,用于过滤序列。
和map()类似,filter()也是接受一个函数和一个序列,不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定该元素是保留还是丢弃。如:
>>> def is_odd(n):
... return n % 2 == 1
>>> filter(is_odd, [1,2,3,4])
[1,3]
# 在一个list中,删除偶数,保留奇数
5.reduce:
基本形式为:reduce(function, sequence, start_value),其中start_value为可选参数,即作为初始值调用。
python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。如:
>>> def add(x, y):
... return x + y
...
>>> reduce(add, (1,2,3,4))
10
>>> reduce(add, [1,2,3,4])
10
>>> reduce(add, [1,2,3,4], 2)
12
# 结果为 1+2+3+4 的和
6.sorted():
sorted()函数可以对list进行排序,同时他也是一个高阶函数,他还可以接收一个key函数来实现自定义的排序,如:
>>> list = [1,3,2,-4]
>>> sorted(list)
[-4, 1, 2, 3]
>>> sorted(list, key=abs)
[1, 2, 3, -4] # 按绝对值大小排序
>>> sorted(['angel', 'Bob', 'Candy', 'daniel'], reverse=True)
['daniel', 'angel', 'Candy', 'Bob']
>>> sorted(['angel', 'Bob', 'Candy', 'daniel'], key=str.lower)
['angel', 'Bob', 'Candy', 'daniel']