其实函数可以作为变量,之前学过C++,对于这种用法并不奇怪。无非就是函数充当变量,可以传入函数而已。
下面分别介绍 Python
中常见的高阶函数:map/reduce
, filter
, sorted
map###
map()
函数接收两个函数,一个是函数,一个是序列(可迭代均可), map
将传入的函数依次作用到序列的每个元素,并把结果作为新的list
返回
举个例子:将 list 中所有的数字转化为字符串:
>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce###
reduce()
把一个函数作用在一个序列[x1, x2, x3.....] 上,这个必须接收两个函数,reduce
将结果和序列的下一元素做累积计算
例子1:将序列 [1, 3, 5, 7, 9] 变换成整数 13579。
>>>reduce(lambda x, y : x * 10 + y, [1, 3, 5, 7, 9])
13579
filter###
filter()
函数用于过滤序列。filter()
接收一个函数和 一个序列 。与 map() 不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是 True
或 False
决定保留还是丢弃该元素。
例子: 将一个序列中的空字符删掉。
>>>filter(lambda s : s and s.strip(), ['A', '', 'B', None, 'C', ' '])
['A', 'B', 'C']
sorted###
>>>sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
传入自定义函数可以实现自定义排序。
例子1:排序应该忽略大小写,按照字母序排序。
def cmp_ignore_case(s1, s2):
u1 = s1.upper()
u2 = s2.upper()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], lambda s1, s2 : s1.upper() -s2.upper())
['about', 'bob', 'Credit', 'Zoo']
另外数字反序有个很好的方法:
sorted([36, 5, 12, 9, 21][::-1]