我们平时要构建列表或其他序列,除了使用for循环外,还可以使用列表推导式创建列表,或使用生成器表达式创建其他序列。
相对于使用for循环,后者的代码更加简洁易于理解,同时运行速度也更快。
1. 列表推导式(列表解析)
使用列表推导式快速创建列表:
>>> new_list = [e for e in range(5)]
>>> new_list
[0, 1, 2, 3, 4]
创建列表时,对列表元素进行选择:
>>> new_list = [e for e in range(5) if e<4]
>>> new_list
[0, 1, 2, 3]
2. 生成器表达式
生成器表达式构建语法和列表表达式几乎一样,只需要将方括号换成圆括号即可。
若需要构建非列表类型的序列,使用生成器表达式要更好。
因为生成器表达式使用迭代器协议逐个产出项,而不是构建整个列表提供给其他构造函数,这就使生成器表达式占用的内存更少。
>>> new_obj = (e for e in range(5))
>>> new_obj
<generator object <genexpr> at 0x0000028739F374C0>
>>> type(new_obj)
<class 'generator'>
因为生成器表达式返回的是一个生成器对象,因此使用表达式构建元组时,需要使用tuple()函数进行转换。
>>> new_tuple = tuple(e for e in range(5))
>>> new_tuple
(0, 1, 2, 3, 4)
3. 注意
使用“海象运算符(:=)”赋值的变量在列表推导式或生成器表达式返回后依然可以访问,其他变量作用域限定在列表推导式内部。
>>> new_list = [elem:=e for e in range(5)]
>>> new_list
[0, 1, 2, 3, 4]
>>> elem
4
>>> e
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'e' is not defined