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 reduceIn [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>