首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于列表推导式的几点建议

本文字数:1339

建议阅读时间:8分钟

列表推导式一定是Python中最伟大的发明之一了,如果一个Python程序员连列表表达式都不知道的话,那应该是相当失败了/(ㄒoㄒ)/~~。列表表达式能够快速且优雅地利用一个列表生成另一个列表,笔者最近在阅读《Effective Python》这本书的时候,发现了三点关于列表推导式不错的建议,同大家分享一下。

建议一:用列表推导式来取代map和filter

对的,你没有听错,列表推导式已经拿起屠刀对准map和filter这两个高阶函数了。我们利用实例来说明一下。

既然是实例,怎么能不“run this code”勒?先运行一下上面的代码看看结果吧!

这个实例要求我们以列表a为基础,生成一个a新的列表,其中,新的列表是原先列表每一个元素的平方。如果使用列表推导式,仅仅需要一个for循环便可以搞定,但是,若使用map函数,则还需要另外构建一个lambda的匿名函数,列表表达式在这种情况的优越性就不言而喻了。

如果现在更换需求为:生成一个新的列表,新列表元素为原列表元素中不能整除2的。大家可能一开始会想到filter这个高阶函数,但其实,列表表达式也可以简单粗暴地解决这个需求哦:只需要紧跟一个if即可。

最粗暴的版本来啦,如果现在的需求是:生成一个新列表,新列表元素为原列表元素不能整除2的元素的平方。如果使用列表推导式,仅仅一个for和if便可以解决问题,但是如果是map和filter的话,两个lambda函数或许会让你对匿名函数充满恐惧哦。

敲黑板

⭐列表推导式较map与filter更加清晰易读;

⭐从执行效率上来说,列表推导式更胜map与filter更胜一筹;

⭐如果你想要你的代码更加容易被他人读取和维护的话,就用列表推导式吧。

建议二:“列表”虽好,可不要贪杯哦

你以为列表推导式的恐怖仅仅局限于上打map,下揍filter吗?列表推导式可是还支持多重循环的恐怖人物啊。一样的,我们先来看一个实例。

现在我们需要讲一个矩阵(二维数组)转换成一个列表,列表推导式可以帮我们轻松地实现这一点:多重循环。在这个实例中,row是m的元素,而x是row的元素,这本质是讲两个for语句嵌套在一起,而列表推导式则可以在一行之内完成这一需求。

但如果我们只是想生成一个新的矩阵(二维数组),而不是列表呢?别担心,列表表达式也可以做到这一点,你只需要加一个简单的[ ]即可。运行一下上面的代码试试看?

是不是可读性更佳了?

除了多重循环,列表表达式也支持多个if,并且在列表表达式中,这些if语句默认是以and逻辑连接的,例如:

是不是很神奇?我们再来看一个更复杂的例子:

这个实例会输出那些能被三整除,并且所在行之和大于10的元素,这么一看,列表表达式是不是十分高效便捷?但在大多数情况下这种做法并不可取,因为这种代码的可读性往往较低,不便于他人维护或者改进。

敲黑板

⭐“列表”虽好,可不要贪杯。对于大于3的多重循环,往往额外写一个嵌套for循环语句会更好哦。

⭐列表推导式虽然能够写出一些”神奇“的代码,但是这些代码往往不便于他人观看,但是如果只是给自己看的话(比如完成课程作业),列表推导式的这些特性或许是一个神器哦。

建议三:用生成器改写较大的列表推导式

列表推导式也并非没有“硬伤”:在推导过程中,如果输入的数据较多,可能会占有较多的内存,这样可能会使得程序运行缓慢甚至出错。因此,在输入数据较多时,不妨改用生成器——就是将列表推导式两边的[ ]改成()即可。

此时,列表推导式返回的便是一个迭代器,试着打印一下看看?是不是不是一个列表了,而是一个迭代对象。那么,怎么使用这个迭代器呢?跟普通的迭代器一样,调用next()函数便可。

但是,需要注意的是,该种方法返回的迭代器使用一轮后就不要使用啦!

敲黑板

⭐当数据量较大时,不妨讲列表推导式改写成生成器的形式。

⭐迭代器在使用一轮后一般就不要使用了哦。

声明

1.文章内容(代码、文字)均为原创。

2.因为本人Python水准并不能做到绝对的正确,因此若有疏漏之处,烦请多多指正。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180411G1NYFW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券