Python高阶函数map 、reduce 、filter 、sorted/sort 、zip的使用总结(学习笔记)

326 阅读3分钟

学习的原文链接: mp.weixin.qq.com/s?https://m…

一、 map

map函数的基本语法就是map(func, seq),其基本含义值的是:对后面的可迭代序列中的每个元素执行前面的函数func,最终得到一个新的序列;注意:

  • Python2 中直接返回的是一个列表
  • Python3 中返回的是一个可迭代器,如果想返回列表,可以使用list()进行处理

1.2 demo

  • 使用Python内置函数
map(abs, [1,2,3,4])
Out[3]: <map at 0x1c8f0367f40>

list(map(abs, [1,2,3,4]))
Out[4]: [1, 2, 3, 4]
  • 使用自定义函数
def mapfunc(x): return x*x # 返回平方和
  ...: list(map(mapfunc, [1,2,3,4]))
  
Out[7]: [1, 4, 9, 16]
  • 使用匿名函数lambda, 使用匿名函数的时候可以有多个参数
list(map(lambda x: x*x, [1,2,3,4]))      # 匿名函数lambda
Out[8]: [1, 4, 9, 16]
list(map(lambda x,y: x+y, [1,2,3,4], [1,2,3,4])) # 匿名函数lambda,多参数形式
Out[9]: [2, 4, 6, 8]

二、 reduce

reduce循环从序列中取出值, 调用函数进行计算,并用上一次的计算结果作为参数和下一个取出的值再次进行计算.

2.2 简单使用

from functools import reduce
print(reduce(lambda x, y: x + y, [1,2,3,4,5]))

2.3 带有初始值initial的reduce

初始化值和序列中的第一个值执行func函数,将得到的结果作为下次的起始值

三、 filter

3.1 语法

filter()函数用于过滤序列,过滤掉不符合条件的那些元素,返回符合条件的元素组成新列表。 序列中的每个元素作为参数传递给函数进行判断,返回True或者False,最后将返回True的元素放到新列表中。

filter()语法如下:

filter(function, iterable)  # 前者为函数,后者为待执行的序列  

3.2 简单使用 (其他用法同上)

list(filter(lambda x: x%2==0, [1,2,3,4,5])) # 过滤出偶数
[2, 4]

四、 sorted/sort

4.1 语法

sorted(iterable, key=None, reverse=False)

4.2 可以接受的三个参数

sorted()接受3个参数,返回的是一个排序后的列表

  • 可迭代对象iterable
  • reverse=False,接受一个布尔值,选择是否反转排序结果,默认是False
  • 接受一个回调函数key=None,key参数的作用是我们自定义一个函数,然后通过将序列中的元素作用于函数之后再进行排序

4.3 demo演示

sorted([12,-3,4,5-6],key=lambda x:abs(x), reverse=True) # 排序,反转-逆序
Out[4]: [12, 4, -3, -1]

sorted([12,-3,4,5-6],key=lambda x:abs(x), reverse=False) # 排序, 默认升序
Out[5]: [-1, -3, 4, 12]

4.6 对比sort()

sort()方法只能对原列表list进行排序,参数和sorted是相同的;

sort()是将原来的列表直接原地修改,而sorted是生成新的列表,二者是不同的。

五、 zip

5.0 源码注释

5.1 zip语法

zip([iterable,...])  # iterable是一个或者多个可迭代器
  • zip函数执行的返回结果在python3中返回的是一个zip对象,如果需要列表的形式,直接使用list方法展开;展开后的结果是列表中嵌套元组的形式。

5.2 zip中可以接受列表、元组、字符串等形式

zip([1,2,3],['a','b','c'])
Out[6]: <zip at 0x1eac22889c0>  # 直接返回的是zip对象

list(zip([1,2,3],['a','b','c']))
Out[7]: [(1, 'a'), (2, 'b'), (3, 'c')]      # 返回三个元组,每个元组的第i个元素来自第izip迭代的对象

5.3 zip(*iterables) 其实就是 unzip 的过程

我们一般认为该方法是zip的反过程,是一个unzip的过程:

zip_obj = list(zip([1,2,3],['a','b','c']))
zip(*zip_obj)
Out[11]: <zip at 0x1eac228dbc0>
list(zip(*zip_obj))
Out[12]: [(1, 2, 3), ('a', 'b', 'c')]

5.4 zip的其他使用

  • 一次遍历dataFrame中的多列
  • 也可以直接来构造字典
dict(zip([0,1,2], ['a','b','c']))
Out[14]: {0: 'a', 1: 'b', 2: 'c'}