列表推导和生成器表达式
#例子1
lst = [i for i in range(5)] #列表推导
# lst2 = list(i for i in range(5)) #括号内是生成器表达式
s = (str(i) for i in range(5)) #产生生成器
print(lst)
print(s)
#结果输出
[0, 1, 2, 3, 4]
<generator object <genexpr> at 0x00000254299C9ED0>
#例子2
for i in s: #由生成器产生
print(i)
# for i in [i for i in range(5)]: #先生成列表再迭代
# print(i)
#结果输出
0
1
2
3
4
列表推导可以看作是使用for语句生成列表的简约表达式。
生成器与列表推导的形式上的主要区别是列表推导用[]来围起来,返回的是列表,而生成器表达式用()围起来,返回的是生成器,这是一个可迭代的对象。
生成器的优点是每次只产生一个输出,能够节省内存的消耗。这种优势来源于生成器表达式仅仅定义操作,而操作的执行是生成器被调用时发生
当把生成器表作为参数,且只需要传入一个参数时,可以不需要括号。从这个角度来看列表推导是生成器在产生列表方面的应用。
在生成列表方面,列表推导与使用生成器表达式的内存消耗应该是等价的,参照例子1。
但是如果先生成列表再迭代,那么内存消耗显然是大于生成器表达式的。参照例子2,因为生成器本身就是可以迭代的,生成列表是一种冗余的操作,除非列表已经存在。