您的位置:首页 > 编程语言 > Python开发

零基础学python-19.11 使用迭代工具模拟map

2015-10-21 00:00 232 查看
这一章节我们来讨论一下使用迭代工具模拟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,并且讨论了如何使用生成器来提高性能。

这一章节就说到这里,谢谢大家

------------------------------------------------------------------
点击跳转零基础学python-目录

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息