一.列表推导式
列表推导是构建列表(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循环的开销