主要包括:
- map 函数
- reduce 函数
- filter 函数
- sorted 函数
map 函数
map(func,interable)
该函数使用函数作为自己的一个参数,它可以将 interable
(可迭代对象) 中的数据依次传递给 func
函数处理,最后把处理的结果作为新的可迭代对象返回。
例如 [1,2,3,4,5]->[1,4,9,16,25]
def power (x):
return x*x
result = map(power, [1,2,3,4,5]) # 返回的结果是一个生成器,所以要转化为列表打印
print(list(result))
[1, 4, 9, 16, 25]
这个也可以使用 lambda
表达式来写:
result = map(lambda x: x*x, [1,2,3,4,5])
print(list(result))
[1, 4, 9, 16, 25]
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(func,inteable)
函数 累积操作。func函数必须接受两个参数,reduce会把 fuc 的运行结果做一个参数,然后从 interable 中再依次取出一个数据当作另一个参数,
from functools import reduce
li = [1,2,3,4]
result = reduce(lambda x, y: x* y, li)
print(result)
24
这个函数有点意思,我们看看他具体的运行是怎样的;
在第一次运算时从可迭代对象中取出两个数: 12 = 2
第二次运算时将上次运行的结果 2 作为第一个参数传入,再取一个数 3 作为第二个参数传入: 23 = 6
同理: 64 = 24
最后返回最后一次的处理结果。
实际上我们直接一个 sum()
就可以搞定。。。
下面再举一个实际应用的例子:要把序列[1, 3, 5, 7, 9]
变换成整数 13579,reduce
就可以派上用场:
from functools import reduce
def fn(x, y):
return x * 10 + y
reduce(fn, [1, 3, 5, 7, 9])
13579
这个例子本身没多大用处,但是,如果考虑到字符串 str
也是一个可迭代对象序列,对上面的例子稍加改动,配合 map()
,我们就可以写出把 str
转换为 int
的函数:
from functools import reduce
def fn(x, y):
return x * 10 + y
def char2num(s):
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
return digits[s]
reduce(fn, map(char2num, '13579'))
13579
整理成一个 str2int
的函数就是:
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 str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return DIGITS[s]
return reduce(fn, map(char2num, s))
str2int('13579')
13579
还可以用lambda函数进一步简化成:
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))
filter 函数
filter(func,interable)
根据函数 func 来过滤 interable ,将interable 中的数据传入 func 中,如果函数返回 True 则保留该数据,否则就不保留。
li = [1,2,3,4,5,6,9,10,15]
result = filter(lambda x: x % 2 == 1, li) # 返回一个 filter 对象,同样使用list()转化一下
print(list(result))
[1, 3, 5, 9, 15]
sorted 函数
sorted(interable,key = None, reverse = False)
对数据进行排序,并返回一个新对象 原对象不变。key 可以用来指定排序的规则,它接受的值是一个函数。reverse 是指定排序的顺序(升序或降序),默认为升序。
# 使用 list.sort()方法:
li = [1,-4,-10,2,12]
re = li.sort() # 就地排序破坏了原来的数组
print('原来的列表为:',li)
print('返回值是:',re) # ,没有返回值
原来的列表为: [-10, -4, 1, 2, 12]
返回值是: None
# 使用 sorted(list)函数
li = [1,-4,-10,2,12]
rs = sorted(li, key = abs) # 指定排序方式为 绝对值大小
print('原来的列表为:',li)
print('返回值是:',rs)
原来的列表为: [1, -4, -10, 2, 12]
返回值是: [1, 2, -4, -10, 12]
我们试试修改 key 的值(传入不同的函数)使它按照不同的规则来排序:
注意这个函数是分别对列表(可迭代对象)中的每一个元素作用。
# 根据长度排序
chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
print(sorted(chars, key=len))
# 使用lambda 函数
print(sorted(chars, key=lambda x: len(x)))
['a', 'is', 'This', 'from', 'test', 'Andrew', 'string']
['a', 'is', 'This', 'from', 'test', 'Andrew', 'string']
如果是一个复合的列表结构,例如由元组构成的列表,要按照元组中的第二个元素排序,那么可以用 lambda 定义一个匿名函数.关于匿名函数:https://www.jianshu.com/p/5cdfabd43f76
students = [('zhang', 'A'), ('li', 'D'), ('wang', 'C')]
sorted(students, key=lambda x: x[1])
[('zhang', 'A'), ('wang', 'C'), ('li', 'D')]
这里将按照字典顺序 A-B-C-D 的顺序排列。
网友评论