列表推导式和生成器

Posted benjamin77

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表推导式和生成器相关的知识,希望对你有一定的参考价值。

一.列表推导式

列表推导是构建列表(list)的快捷方式,而生成器表达式则可以创建其他任何类型的序列,如果你的代码里并不

经常使用它们,你有可能错过很多可读性很好的而且更高效的代码的机会

示例1: 把一个字符串变成Unicode码位的列表

 技术分享图片

示例2:把字符串变成Unicode码位的另外一种写法(列表生成式)

 技术分享图片

python2.x中,在列表推导中for关键词之后的赋值操作可能会影响列表推导的

上下文中的同名变量。像下面这个python2.7控制台对话

技术分享图片

如你所见,x原本的值被取代了,但是这种在python3不会出现 

列表推导,生成器表达式,以及同它们很相似的集合(set)推导和字典(dict)推导,在python3中都有了

自己的局部作用域,就像函数似的。表达式内部的变量和赋值只在局部作用,

表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到他们。

这是python3代码:

技术分享图片

 

2.列表推导同filter和map的比较

filter和map合起来能做的事情,列表推导也可以做,而且还不需要借助难以理解

和阅读的lambda表达式。

示例3:用列表推导和map/filter组合来创建同样的表单

 技术分享图片

3.列表推导生成笛卡尔积

 技术分享图片

第一种得到的结果是以颜色排列,再以尺码排列,如果想依照尺码后颜色的顺序来排列,

只需要调整从句的顺序。

 

.生成器表达式

虽然也可以用列表推导来初始化元组,数组或其他序列类型,但是生成器表达式式更好的

选择。这是因为生成器表达式背后遵守了迭代器协议,可以逐个的产出元素,而不是先建

立一个完整的列表,然后再把这个列表传递到某个构造函数里。前面那种方式显然能够节省内存。

生成器表达式的语法跟列表推导差不多,只不过把方括号换成圆括号而已。

示例5:用生成器表达式初始化元组和数组

技术分享图片

·如果生成器表达式是一个函数调用过程中的唯一参数,那么不需要额外再用括号把它围起来

·array的构造方法需要两个参数,因此括号式必须的。array构造方法的第一个参数指定里数组中数字的存储方式

示例6:使用生成器表达式计算笛卡尔积

使用生成器,不会一次性生成6个组合的列表,因为生成器在每次for循环运行时才生成一个组合。生成器可以省掉for循环的开销

技术分享图片 

以上是关于列表推导式和生成器的主要内容,如果未能解决你的问题,请参考以下文章

Python:三元表达式列表推导式和生成器表达式

Python:三元表达式列表推导式和生成器表达式

列表推导式和生成器表达式

python(列表推导式和生成器表达式)

三元表达式,列表推导式和字典生成式

生成器列表推导式和生成器表达式