失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python 高阶函数filter map reduce reversed sorted及迭代器函数 iter

Python 高阶函数filter map reduce reversed sorted及迭代器函数 iter

时间:2023-03-08 09:31:45

相关推荐

Python 高阶函数filter map reduce reversed sorted及迭代器函数 iter

1.filter(function, iterable)

过滤器,过滤掉不满足函数function的元素,重新返回一个新的迭代器。

其中function函数的第一个参数是可迭代对象iterable中的一个元素,也就是说函数function依次接收iterable可迭代对象的每一个元素,并判断每一个元素是否符合function的条件。

In [29]: a = [1,2,3,4,5]In [30]: def fun(a):...:ret = []...:if a > 3:...: ret.append(a)...:return ret...:In [31]: for i in filter(fun, a):...:print(i)...:45In [32]: list(filter(fun, a))Out[32]: [4, 5]

2.map(function, iterable, …)

它将function映射于iterable中的每一项,并返回一个新的迭代器。

In [33]: a = [1,2,3,4,5]In [34]: map(lambda x: x*2, a)Out[34]: <map at 0x843d400>In [35]: ret = map(lambda x: x*2, a)In [37]: list(ret)Out[37]: [2, 4, 6, 8, 10]

同时我们,map函数支持传入多个可迭代对象。当传入多个可迭代对象时,输出元素个数等于较短序列长度。

如下,传入两个列表,function就需要接受两个参数,取值分别对应第一、第二个列表中的元素。找到同时满足第一个列表的元素为奇数,第二个列表对应位置的元素为偶数的元素。

In [38]: xy = map(lambda x,y: x%2==1 and y%2==0, [1,3,2,4,1],[3,2,1,2])In [39]: for i in xy:...:print(i)...:FalseTrueFalseFalse

In [40]: a = [1,2,3,4,5]In [41]: b = [10,11]In [42]: ret = map(lambda i,j: i+j, a, b)In [43]: list(ret)Out[43]: [11, 13]

3.reduce(function, iterable[, initializer])

reduce函数在Python 3中位于functools模块中,使用前需要先导入。

reduce函数中第一个参数是函数functionfunction函数,参数个数必须为2,是可迭代对象iterable内的连续两项。它的计算过程是依次将iterable2 个元素为单位传递给function

In [45]: from functools import reduceIn [46]: reduce(lambda x,y: x+y,list(range(5)))Out[46]: 10

即它的计算结果是 0+1+2+3+4=10

4.reversed(seq)

重新生成一个反向迭代器,对输入的序列实现反转。注意:它会返回一个新的迭代序列。

In [47]: a = [1,2,3,4,5]In [48]: ret = reversed(a)In [49]: retOut[49]: <list_reverseiterator at 0x8940f60>In [50]: list(ret)Out[50]: [5, 4, 3, 2, 1]

5. sorted(iterable, *, key=None, reverse=False)

实现对可迭代对象的排序,key参数和reverse参数必须为关键字参数,都可省略。

In [51]: a = [3,1,2,5,4]In [52]: ret = sorted(a, reverse=True)In [53]: retOut[53]: [5, 4, 3, 2, 1]In [54]: ret = sorted(a, reverse=False)In [55]: retOut[55]: [1, 2, 3, 4, 5]

可迭代对象的元素也是一个复合对象,如为字典。依据依据为字典键的值,sortedkey函数就会被用到。

In [62]: d = [{'a':111, 'b':222, 'c':333}, {'a':11, 'b':22, 'c':33}, {'a':1, 'b':2, 'c':3}]In [63]: sorted(d,key=lambda x:x['a'])Out[63]: [{'a': 1, 'b': 2, 'c': 3},{'a': 11, 'b': 22, 'c': 33},{'a': 111, 'b': 222, 'c': 333}]

6. 迭代器函数iter(object[, sentinel])

返回一个严格意义上的可迭代对象,其中,参数 sentinel 可有可无。

In [64]: a = [1,2,3]In [65]: ret = iter(a)In [66]: retOut[66]: <list_iterator at 0x7feba20>In [67]: ret.__next__()Out[67]: 1In [68]: ret.__next__()Out[68]: 2In [69]: ret.__next__()Out[69]: 3In [70]: ret.__next__()---------------------------------------------------------------------------StopIteration Traceback (most recent call last)<ipython-input-70-6685d4123b21> in <module>----> 1 ret.__next__()StopIteration: In [71]: for i in ret:...:print(i)...:In [72]:

可以看到最后for i in ret中已经没有元素可进行迭代,所以print(i)不会有值再打印。

只要iterable对象支持可迭代协议,即自定义了__iter__函数,便都能配合for依次迭代输出其元素。

In [73]: class Iter(object):...:def __init__(self):...: self._list = [1,2,3]...:def __iter__(self):...: print("enter __iter__")...: return iter(self._list)...: In [74]: m = Iter()In [77]: for i in m:...:print(i)...:enter __iter__123In [78]:

如果在Iter类中不使用iter(self._list)则会有如下错误:

In [78]: class Iter(object):...:def __init__(self):...: self._list = [1,2,3]...:def __iter__(self):...: print("enter __iter__")...: return self._list...: In [79]: m = Iter()In [80]: for i in m:...:print(i)...:enter __iter__---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-80-9cd7b7f0b3b5> in <module>----> 1 for i in m:2print(i)3 TypeError: iter() returned non-iterator of type 'list'

如果觉得《Python 高阶函数filter map reduce reversed sorted及迭代器函数 iter》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。