【python学习笔记】python列表推导式和生成器表达式

目录

列表推导式

列表推导和可读性

笛卡尔积

生成器表达式

列表推导是构建列表(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!

上一篇:通用JS七


下一篇:类 Symbol