零基础学python-19.11 使用迭代工具模拟map
零基础学python-19.11 使用迭代工具模拟map
raylee2015 发表于2年前
零基础学python-19.11 使用迭代工具模拟map
  • 发表于 2年前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

这一章节我们来讨论一下使用迭代工具模拟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-目录

 



版权声明:本文为博主原创文章,未经博主允许不得转载。

共有 人打赏支持
粉丝 7
博文 265
码字总数 44224
×
raylee2015
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: