列表推导式
ls1 = [i * 2 for i in range(5)] # 列表推导式
print(ls1)
输出
[0, 2, 4, 6, 8]
这里的值直接生成并存在内存中;
生成器表达式
ls2 = (i * 2 for i in range(5)) # 生成器表达式
print(ls2)
输出
<generator object <genexpr> at 0x00000292C92F1E58>
这是一个生成器对象;
看看里面有什么,打印一下:
print(ls2.__next__())
print(ls2.__next__())
输出
0
2
开始时值并没有生成,当取值时值开始生成出来;
这样就节省了内存;
特别声明
在一个生成器对象中;
- 取值是依次进行的;
- 一个值取出来后就不能再去这个值了;
- 被同意的生成器生成的对象是相同的;
这就好比我有一台生产盒装饼干的机器;
每次运行它都可以为我生成一盒饼干;
我可以从盒子里依次取出饼干并享用它;
但我不能重复享用我吃掉的饼干;
如果我还想要一盒饼干怎么办呢?
那很简单;
再生产一盒就行了;
严格说来这一盒和上一盒不是同一盒;
但可以达到和上一盒同样的效果;
这一盒就是另外一个对象了;
这个比喻只能说是类似;
因为机器生产出一盒饼干后,盒子里面是有饼干的;
而生成器只有在取值时才生成值;
列表推导式和生成器表达式的区别
只要把[]换成()列表推导式就变成了生成器表达式
网友评论