这一章节我们来讨论一下使用迭代工具模拟map。
在讨论之前,我们先看一些例子:
>>> list(zip([1,2,3],[4,5,6,7])) [(1, 4), (2, 5), (3, 6)] >>> list(zip('abcdef','gh')) [('a', 'g'), ('b', 'h')] >>> list(zip([1,2,3])) [(1,), (2,), (3,)] >>> list(map(abs,[-2,-1,0,1,2])) [2, 1, 0, 1, 2] >>> list(map(pow,[1,2,3],[4,5,6,7,8])) [1, 32, 729] >>>
从上面的代码我们看出什么呢?
1.zip对序列的配对操作
2.map的一般使用
3.map里面的嵌套操作,有着zip的参与
我们今天就来使用zip模拟一下map,也就是最后一行代码:
>>> list(map(pow,[1,2,3],[4,5,6,7,8])) [1, 32, 729] >>>
上面的代码里面,其实非常明显的进行了zip的配对操作,我们下面给出等价代码:
>>> def test(func,*args): res=[] for item in zip(*args): res.append(func(*item)) return res >>> test(pow,[1,2,3],[4,5,6,7,8]) [1, 32, 729] >>>
注意:上面的代码非常依赖*args的传入语法,如果有一些问题,就会报错。
上面的代码是先通过zip解析配对*args传入的序列,然后将解析序列的对象当做参数传到func这个函数对象里面
上面的代码我们通过使用for来实现,下面我们来看看使用列表解析
>>> def test(func,*args): return [func(*item) for item in zip(*args)] >>> test(pow,[1,2,3],[4,5,6,7,8]) [1, 32, 729] >>>
上面的代码返回一样的结果,但是代码已经精简了许多。
继续,由于之前我们学到生成器,因此下面我们使用生成器来实现,这样可以降低运行时的内存浪费,提供性能
>>> def test(func,*args): return (func(*item) for item in zip(*args)) >>> test(pow,[1,2,3],[4,5,6,7,8]) <generator object <genexpr> at 0x0240C030> >>> list(test(pow,[1,2,3],[4,5,6,7,8])) [1, 32, 729] >>>
>>> def test(func,*args): for item in zip(*args): yield func(*item) >>> test(pow,[1,2,3],[4,5,6,7,8]) <generator object test at 0x02404FD0> >>> list(test(pow,[1,2,3],[4,5,6,7,8])) [1, 32, 729] >>>
上面的代码分别通过yield以及生成器表达式来实现,从而提高性能与降低内存浪费。
总结:这一章节主要讨论了使用迭代工具模拟map,并且讨论了如何使用生成器来提高性能。
这一章节就说到这里,谢谢大家
------------------------------------------------------------------
版权声明:本文为博主原创文章,未经博主允许不得转载。