今天我们就来看几个Python的高级函数:Map
,Reduce
,Filter
,Sorted
。
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterable
返回。
1 | def f(x): |
reduce()
函数和map()
相似,接收两个参数,一个是函数,一个Iterable
。不同的是,reduce()
把一个函数作用在一个序列[x1, x2, x3, ...]
上,并且这个函数必须接收两个参数,reduce()
把结果继续和序列的下一个元素做累积计算,形如:
1 | reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) |
1 | from functools import reduce |
使用lambda表达式可以进一步化简:
1
2
3
4
5
6
7
8
9 from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
利用map
和reduce
编写一个str2float
函数,把字符串'123.456'
转换成浮点数123.456
:
1 | def f(dig): |
和map()
类似,filter()
也接收一个函数和一个序列。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。filter()
函数返回的是一个Iterator
,也就是一个惰性序列。
在一个list中,删掉偶数,只保留奇数:
1 | def is_odd(n): |
把一个序列中的空字符串删掉:
1 | def not_empty(s): |
回数是指从左向右读和从右向左读都是一样的数,例如12321
,909
。请利用filter()
筛选出回数:
1 | def is_palindrome(n): |
sorted()
函数除了可以对list
进行排序之外,它还可以接收一个key
函数来实现自定义排序。
1 | 36, 5, -12, 9, -21]) sorted([ |
1 | 36, 5, -12, 9, -21], key=abs) sorted([ |