In [25]: list(map(lambda a:a**2, [1,2,3,4]))
Out[25]: [1, 4, 9, 16]
解释:map 就相当于 把每个序列元素 的每一个 单独用一个管道函数处理,再把他们按顺序组合成一个新可迭代对象
注意:这个管道函数 只能是单参数函数,如果想传递多个参数怎么办???1. 使用偏函数 paitial (怕有些人看不懂,这里就不用 lambda 了,而是用普通函数定义方式)
In [58]: def f(a,b):
...: return a**2,b
In [59]: f = partial(f,b='固定值')
In [60]: list(map(f,[1,2,3,4]))
Out[60]: [(1, '固定值'), (4, '固定值'), (9, '固定值'), (16, '固定值')]
当然还是提供一下 lambda 的方式吧,看看有多简洁。In [64]: list(map(partial(lambda a,b:(a**2,b),b='固定值') ,[1,2,3,4]))
Out[64]: [(1, '固定值'), (4, '固定值'), (9, '固定值'), (16, '固定值')]
2. 如果想对 map 传递多个参数,除了上面用偏函数,还可以使用下面介绍的 starmap
map 多参应用场景:进程池的 imap(以后我也会写 Python 三器三程的文章)
In [30]: list(starmap(lambda a,b:a+b,( (1,2),(3,4))))
Out[30]: [3, 7]
解释一下:starmap 和 partial 虽然都可以解决 map 传多参,但还是有一些区别的
starmap 的 每一对的多个参数 都是密切相关的
partial 的 偏参数 是和所有 主参数 全部相关的
In [87]: from functools import reduce
In [88]: reduce(lambda a,b:a*b, [1,2,3,4])
Out[88]: 24
解释一下:reduce 相当于对一个序列 '累' 的操作(累加、累乘等),返回结果就是累值
In [100]: list(filter(lambda a:a if a>2 else None, [1,2,3,4]))
Out[100]: [3, 4]
解释一下:和 map 思想一样,根据条件过滤序列。
In [128]: dict1 = {'学号 2':'1','学号 1':'2'}
In [129]: sorted(dict1.items(),key=lambda x:x[1])
Out[129]: [('学号 2', '1'), ('学号 1', '2')]
解释一下:和 list 的 sort 函数类似,但这个 sorted 的优点是针可以对所有序列排序
In [132]: list(zip((1,2),(3,4,5)))
Out[132]: [(1, 3), (2, 4)]
解释一下:每个子序列对应位置进行组合,如果格式不匹配,则会舍弃不匹配的那一项
三目运算符可以使代码简介逻辑清晰(虽然 or and 也是可以使代码逻辑简洁,但有些烧脑,我几乎不用~~)In [78]: print(1 if 0==0 else 2)
Out[78]: 1
其实有时用推导式也可以代替部分高阶操作,并且推导式的效率也高
1. 列表推导式
In [77]: [1 for _ in range(5) if 1==1]
Out[77]: [1, 1, 1, 1, 1]
2. 集合推导式
In [6]: {x for x in [1,2,1,2]}
Out[6]: {1, 2}
3. 字典推导式
In [18]: {value:key for key,value in {'name':'tom'}.items()}
Out[18]: {'tom': 'name'}
4. 生成器(生成器还有另外的方式,后面还会三程三器)In [23]: (x for x in range(10))
Out[23]: <generator object <genexpr> at 0x0000024A4CFA8BA0>