python列表推导式与生成器表达式

您所在的位置:网站首页 用python创建列表 python列表推导式与生成器表达式

python列表推导式与生成器表达式

2023-03-27 08:09| 来源: 网络整理| 查看: 265

本文基于python3.x 列表推导(list comperhension 或 listcomps)是构建列表的快捷方式 生成器表达式(generator expression 或 genexpr)可以用来创建其他任何类型的序列 ---参考自《流畅的python》

列表推导式应该是类似这样的写法:

>>symbols='123456' >>codes = [symbol for symbol in symbols] >>codes Out:['1', '2', '3', '4', '5', '6']

不错,很方便地创建了一个列表。 但要是想创建一个元组呢,怎么办?我们猜想列表用[ ]表示,元组用()表示,那么创建元组是不是只要把[ ]替换成()就可以了。我们试试

>>symbols = '123456' >>codes = (symbol for symbol in symbols) >>codes Out:

看起来行不通,这里生成的是一个generator(生成器)对象,并不是我们所希望的元组。所以,列表推导只能用于生成列表。 那么为什么这里出现的是一个生成器对象呢。原因是将[ ]换为()后,列表推导就变成了生成器表达式。

生成器对象可以用来创建任意序列类型。例如建立一个元组:

>>symbols = '123456' >>codes = tuple((symbol for symbol in symbols)) >>codes Out: ('1', '2', '3', '4', '5', '6')

这样就创建了一个元组。上面的第二行中创建生成器对象并将其传给了元组的构造函数。如果生成器表达式是函数调用过程中的唯一参数,那么就不需要额外的括号将其围起来。即上面第二行中我们只需要一层括号即可。为了表示的清楚,我并没有省略括号。

但我们也知道,可以使用列表来创建其他序列类型,比如元组:

>>symbols = '123456' >>codes = tuple([symbol for symbol in symbols]) >>codes Out: ('1', '2', '3', '4', '5', '6')

上面是是先用列表推导产生了一个列表,再将这个列表作为参数传入元组的构造函数中,从而创建一个元组。

太像了,区别就好像只是方括号与圆括号的区别。真的仅仅是这样吗。 生成器表达式逐个产出元素,一次只产出一个值,不会一次性产出包含多个元素的列表。 所以,采用生成器表达式的时候,内存里不会留下有6个元素的列表。这样可以避免额外的内存占用。尤其是要建立的元组的元素是组合的时候,可以避免组合爆炸带来的高内存占用。 建议在创建列表时采用列表推导,创建其他序列类型时采用生成器表达式。毕竟,只需要把[ ] 换成()就可以提高性能,何乐而不为。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3