目录
列表推导是构建列表(list)的快捷方式,可以将一个序列或者其他可迭代类型中的元素过滤或者是加工,然后新建一个列表;也可以生成两个或以上的可迭代类型的笛卡尔积。注:列表推导的作用只有一个:生成列表。
生成器表达式可以生成其他任何类型的序列。
他们都具有很好的代码可读性。
列表推导式
列表推导和可读性
原则:使用列表推导来创建新的列表,并且尽量保持简短,若列表推导的代码超过了两行,可以考虑使用for循环重写。
symbols = 'sdfhjkf'
codes = [ord(symbol) for symbol in symbols]
print(codes)
结果:
[115, 100, 102, 104, 106, 107, 102]
注1:python 回忽略代码里[],{},()的换行,所以若有多行的列表,列表推导,生成器表达式,字典,可以省略续行符”\“。
注2:列表推导在python3中不会出现变量泄露的问题。
列表推导,生成器表达式,集合(set)推导,字典推导,在python3中都有自己的局部作用域,局部变量并不会影响到表达式上下文中的同名变量。但是在pythn2.x中就回出现变量泄露的问题。(此处不再举例)
例子:
symbol = 'sdfhjkf'
codes = [ord(symbol) for symbol in symbol]
print(symbol)
print(codes)
结果:
sdfhjkf #(symbol的值被保留)
[115, 100, 102, 104, 106, 107, 102]
笛卡尔积
举例:
colors = ["black","white"]
sizes = ["s","m","l"]
tshirts = [(color,size) for color in colors for size in sizes]
print(tshirts)
结果:
[('black', 's'), ('black', 'm'), ('black', 'l'), ('white', 's'), ('white', 'm'), ('white', 'l')]
注:更改for循环顺序就能更改tshirts的元素顺序。
生成器表达式
生成器表达式遵守迭代器协议,可以逐个的产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个函数中,前者更能节省内存。
格式和列表推导差不多,只是把方括号改成圆括号。
生成器表达式初始化元组
举例:
symbols = "asdfg"
tuple = tuple(ord(symbol) for symbol in symbols )
print(tuple)
结果:
(97, 115, 100, 102, 103)
生成器表达式初始化数组
举例:
from array import array
symbols = "asdfg"
arr = array('I',(ord(symbol) for symbol in symbols) )
print(arr)
结果:
array('I', [97, 115, 100, 102, 103])
注:array的构造方法需要两个参数,所以里面需要括号,第一个参数指定了存储方式。(这块知识后期我在补上)
生成器表达式计算笛卡尔积
用到生成器表达式之后,内存里不会留下6个组合的列表,因为生成器表达式会在每次for循环时才会生成一个组合。生成器逐个产出元素。这样可以大大降低开销!
举例:
colors = ["black","white"]
sizes = ["s","m","l"]
for shirt in ("%s,%s"%(color,size) for color in colors for size in sizes):
print(shirt)
结果:
black,s
black,m
black,l
white,s
white,m
white,l
如果对您有帮助,点个赞吧那就!
The End!