本文记录python内建几个函数特性 map、reduce、filter、sorted
map/reduce
map函数有两个参数,第一个参数是一个自定义函数, 第二个参数是序列(list 或者 tuple),返回第二个参数的处理结果(即list或tuple)
1 | >>> def fun(x): |
列表中的每一个元素会逐一传递到fun函数中并且逐一返回, 当然用循环体也可以达到同样的效果,不过一行代码就能搞定这就够让我使用的欲望了
我们来看一下自定义函数是两个参数的情况
1 | >>> def add(x, y): |
add函数需要两个参数 所以正确的写法应该是:
1 | >>> map(add, [1, 2, 3], [1, 2, 3]) |
所以在使用map的时候要注意自定义函数的接收参数
reduce函数与map类似不同的是这个自定义函数必须要接收两个参数,并且它的返回值是要累计的, reduce把结果继续和序列的下一个元素执行结果做累积计算
例如:
reduce(f, [1, 2, 3, 4]) 执行顺序是 f(f(f(1, 2), 3), 4)
1 | >>> reduce(add, [1, 2, 3, 4]) |
当自定义函数需要一个参数的时候
1 | >>> reduce(fun, [1, 2, 3, 4]) |
filter
该函数用于过滤序列,和map一样filter()也要接收一个函数和一个序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中
过滤出列表中的所有奇数:
1 | >>> def is_odd(n): |
filter()这个高阶函数的作用关键是自定义函数如何实现一个筛选
sorted
sorted() 函数可对所有可迭代的对象进行排序操作。默认会进行数学意义上的排序
1 | >>> sorted([3, 5, 2, 1, 4]) |
若是想倒序或者列表元素是字符串,这个时候我们就要用到自定义函数了
常规对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。
1 | >>> def cmp(x, y): |
倒序:
1 | >>> def cmb(x, y): |
字符串:
默认按照ASCLL的顺序比较
1 | >>> sorted(['aa', 'CC', 'DD', 'bb']) |
下面来自定义排序规则,(字母顺序忽略大小写)
1 | >>> def cmp_ignore_case(x, y): |
语法与上面内置函数不同,sorted有四个参数
sorted(iterable, cmp, key, reverse)
参数:
- iterable – 可迭代对象。
- cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
- key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
1 | >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] |
1 | >>> sorted([3, 1, 2, 5, 4], reverse=True) |