迭代器,生成器

迭代器:

 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

和列表解析式有点像,只不过使用的是圆括号,不同于列表可以反复迭代,迭代完一次之后再迭代这个生成器,它不会打印元素,也不回报错。

使用生成器有什么好处呢?因为生成器不是把所有元素存在内存,而是动态生成的,所以当你要迭代的对象有非常多的元素时,使用生成器能为你节约很多内存,这是一个内存友好的特性。

posted @ 2018-01-31 18:56  wjstud  阅读(122)  评论(0)    收藏  举报