python中的map/reduce, filter, lambda, set的用法

时间:2022-01-05 20:02:56

以前就用过map/reduce这些高阶函数,原本以为有的东西看一看,查一查就能记住,可根本就不是那回事儿, 如果不是神童,还是一点一点地吧学到的东西记录下来,再整理整理, 印象才深刻

现在就来跟大家分享一下python 中的高阶函数还有lambda, set的用法

从简单的说起:

1.set

set的显示定义很简单,就是用{}定义集合,然后集合中的元素以,隔开, 另外,如果显示声明时,元素有重复,set会将元素去重

>>> a = {'ele1', 'ele2'}
>>> a
set(['ele1', 'ele2'])
>>> b = {'ele1', 'ele2', 'ele2', 'ele1'}
>>> b
set(['ele1', 'ele2'])
要注意的是:set中可以存放不同类型的数据,但并不意味着什么样的数据都可以放,例如list类型的数据就不行

>>> c = {3, 'ele'}
>>> c
set([3, 'ele'])
>>> ele1 = 'str'
>>> ele2 = 3
>>> ele3 = [1, 2, 3]
>>> c = {ele1, ele2, ele3}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
可以把list强制转换为list,但是如果list中有重复的元素,set会将他去重

>>> list = ['ele1', 'ele2', 'ele2', 'ele1']
>>> e = set(list)
>>> e
set(['ele1', 'ele2'])
对于集合,可以采取一些基本的与,或操作,还可以用来计算他们的差集,由于很多整合数据时可能会存在很多重复,所以感觉set还是挺方便的,哈哈哈哈

>>> f = ['Kobe', 'Lebron']
>>> f = {'Kobe', 'Lebron'}
>>> g = {'Tracy', 'Chris'}
>>> f | g
set(['Chris', 'Kobe', 'Tracy', 'Lebron'])
>>> f & g
set([])
>>> f - g
set(['Kobe', 'Lebron'])
>>> g - f
set(['Chris', 'Tracy'])


2.lambda

python中使用lambda来创建匿名函数,什么叫匿名函数呢,我的理解是它可以叫任何名字,也可以没有名字

首先来看一下lambda的用法, lambda para: return_value

para就代表传入的参数,当然,这里也可以是多个参数;return_value表示的是函数的返回值,匿名函数的局限就在于只能有一行代码,所以不能用来定义一些功能复杂的函数,不过对于一些简单的函数来说,还是很方便的

>>> func1 = lambda x: x * 2
>>> func1(3)
6
>>> func2 = lambda x:x * 2
>>> func2(3)
6
同样的匿名函数,它既可以叫func1也可以叫func2

lambda也可以接受多个参数

>>> func = lambda x, y, z: x + y + z
>>> func(1, 2, 3)
6


3.map

函数原型:map(function, sequence) 

map就是对于sequence中的每一个item执行函数function,item就作为函数的参数,最后把执行的结果构成一个list返回,这里sequence可以是string,也可以是list,但是最后返回的结果一定是list

>>> map(lambda x : x + x, 'abcdefg')
['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg']
>>> map(lambda x : x + x, range(10))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
map加上lambda,我们就可以用一句语句完成一个循环才能完成的事情,这对于简化代码来说是很有必要的

map的function也可以是通过def显示定义的函数,这里就不举例子了,反正大同小异


4.reduce

函数原型 reduce(function, sequence, starting_value)

reduce的功能就是对sequence中的每一个item迭代调用function,如果传入了starting_value参数,那么在starting_value的基础上进行迭代

比如我们计算从1加到100,就可以用reduce一句话搞定

</pre><pre name="code" class="plain">>>> reduce(lambda x, y: x + y, range(101))
5050
>>> reduce(lambda x, y: x + y, range(101), 100)
5150
>>> reduce(lambda x, y: y + x, "abcdefgh")
'hgfedcba'
很明显,第二个reduce当中,我从100开始迭代,也就是100 + 1 + 2 + …… +100,这就是starting_value的作用,第三个例子就是用reduce来进行字符串逆序输出,所以只要能想到,reduce的作用还是大大滴

现在再来一个难一点的例子

假设没有将字符串转换为数字的函数,那么我们挨个去转换也是一件很麻烦的事情
现在我们同样只需要一句就可以轻松搞定,虽然速度不会有太大的提升(当然,大牛写的库比你自己写的循环什么的效率还是要高一些的)

>>> dict = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
>>> reduce(lambda x, y: x * 10 + y, map(lambda s: dict[s], '99321789748'))
99321789748
其实完全可以写成一句的,只是为了方便大家看得明白,还是分开写了;这样,将map, reduce还有lambda结合在一起,一句就可以将字符串'993217898748'转换成数字了


5.filter

函数原型 filter(function, sequence)

function表示执行的函数,sequence表示传入的容器,不过这里要注意的是,如果function(item)返回值为0,那么filter会将这个item从sequence中过滤掉;返回值为1,则不做任何处理;filter返回的结果取决于传入的sequence的类型,如果传入字符串类型,那么filter的结果也是一个字符串;如果传入的是一个list,那么最后得到的也是一个list;其实这也很好理解,因为你filter本来就起一个过滤数据的作用嘛,又不会去修改数据的类型,所以自然是输入什么就输出什么咯

下面来举几个例子:

>>> filter(lambda x: x % 2, range(11))
[1, 3, 5, 7, 9]
>>> filter(lambda x: x % 2 == 0, range(11))
[0, 2, 4, 6, 8, 10]
>>> filter(lambda x: 1, range(11))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
从上面这几个简单的例子也可以看出,filter是否过滤数据,就看function(item)返回值是否为0

其实大家很容易想到,filter可以用来过滤掉大写字符或者是一片文档中的标点符号

>>> filter(lambda ch: ch >= 'a', "fwjFEJIiojJFIEfjeNMNi")
'fwjiojfjei'
>>> import string
>>> filter(lambda ch: ch not in string.punctuation, "hei Jack, do you know I love you?")
'hei Jack do you know I love you'

这是我这几天学习的一点小心得, 希望能对各位小伙伴有所帮助