列表推导是构建列表(list
)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。如果你的代码里并不经常使用它们,那么很可能你错过了许多写出可读性更好且更高效的代码的机会。
2.2.1 列表推导和可读性
把一个字符串变成 Unicode 码位的列表
第一种方法
symbols = '$¢£¥€¤' codes = [] # ord() ascii字符串 转换成对应的数字
for symbol in symbols:
codes.append(ord(symbol)) print(codes) # [36, 162, 163, 165, 8364, 164]
把字符串变成 Unicode 码位的另外一种写法
symbols = '$¢£¥€¤' codes = [ord(symbol) for symbol in symbols] print(codes) # [36, 162, 163, 165, 8364, 164]
另一方面,列表推导也可能被滥用。以前看到过有的 Python 代码用列表推导来重复获取一个函数的副作用。
通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。
如果列表推导的代码超过了两行,你可能就要考虑是不是得用 for
循环重写了
列表推导不会再有变量泄漏的问题
Python 2.x 中,在列表推导中 for
关键词之后的赋值操作可能会影响列表推导上下文中的同名变量
'''
Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量。像下面这个 Python 2.6.6 控制台对话: ''' # python2.6.6 代码
x = 'my precious'
dummy = [x for x in 'ABC']
print x # C
x
原本的值被取代了,但是这种情况在python3中是不会出现的.
列表推导、生成器表达式,以及同它们很相似的集合(set
)推导和字典(dict
)推导,
在 Python 3 中都有了自己的局部作用域,就像函数似的。表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。
python3 代码
'''
列表推导、生成器表达式,以及同它们很相似的集合(set)推导和字典(dict)推导,
在 Python 3 中都有了自己的局部作用域,就像函数似的。
表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。 ''' # python3.6 代码
x = 'ABC'
dump = [ord(x) for x in x if x] print(x)
# ABC print(dump)
# [65, 66, 67]
➊ x
的值被保留了。
➋ 列表推导也创建了正确的列表
列表推导可以帮助我们把一个序列或是其他可迭代类型中的元素过滤或是加工,然后再新建一个列表
列表推导的作用只有一个:生成列表