map
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三器三程的文章)
starmap
In [30]: list(starmap(lambda a,b:a+b,( (1,2),(3,4))))
Out[30]: [3, 7]
解释一下:
starmap 和 partial虽然均可以解决 map传多参,但仍是有一些区别的
starmap的 每一对的多个参数 都是密切相关的
partial的 偏参数 是和全部 主参数 所有相关的
reduce
In [87]: from functools import reduce
In [88]: reduce(lambda a,b:a*b, [1,2,3,4])
Out[88]: 24
解释一下:reduce 至关于对一个序列'累'的操做 (累加、累乘等),返回结果就是累值
filter
In [100]: list(filter(lambda a:a if a>2 else None, [1,2,3,4]))
Out[100]: [3, 4]
解释一下:和map思想同样,根据条件过滤序列。
sorted
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的优势是针能够对全部序列排序
zip
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>