本文字数: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水准并不能做到绝对的正确,因此若有疏漏之处,烦请多多指正。
领取专属 10元无门槛券
私享最新 技术干货