目录
列表推导式
列表推导和可读性
笛卡尔积
生成器表达式
列表推导是构建列表(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!