迭代器,生成器
迭代器:
1 >>> b = [1, 2, 3, 4] 2 >>> next(iter(b)) 3 1 4 >>> next(iter(b)) 5 1 6 >>> it = iter(b) 7 >>> next(it) 8 1 9 >>> next(it) 10 2 11 >>> next(it) 12 3 13 >>> next(it) 14 4 15 >>> next(it) 16 Traceback (most recent call last): 17 File "<stdin>", line 1, in <module> 18 StopIteration 19 >>> b.__iter__() 20 <list_iterator object at 0x0000020AE474CB70> 21 >>> b.__iter__().__next__() 22 1 23 >>> b.__iter__().__next__() 24 1 25 >>> b.__iter__().__next__() 26 1 27 >>> it = b.__iter__() 28 >>> it.__next__() 29 1 30 >>> it.__next__() 31 2 32 >>> it.__next__() 33 3 34 >>> it.__next__() 35 4 36 >>> it.__next__() 37 Traceback (most recent call last): 38 File "<stdin>", line 1, in <module> 39 StopIteration
因为每次用 iter 定义迭代器时都生成了新的迭代器,迭代器赋值给 it ,那这个迭代器就定下了。
生成器:
1 >>> g = (x**x for x in range(4)) 2 >>> g 3 <generator object <genexpr> at 0x0000020AE474E1A8> 4 >>> for i in g: 5 ... print(i) 6 ... 7 1 8 1 9 4 10 27
和列表解析式有点像,只不过使用的是圆括号,不同于列表可以反复迭代,迭代完一次之后再迭代这个生成器,它不会打印元素,也不回报错。
使用生成器有什么好处呢?因为生成器不是把所有元素存在内存,而是动态生成的,所以当你要迭代的对象有非常多的元素时,使用生成器能为你节约很多内存,这是一个内存友好的特性。

浙公网安备 33010602011771号