20180305-Python中迭代器和生成器

一.迭代器

迭代器是访问集合元素的一种方式。迭代器从访问到集合的第一个元素开始访问,直到所有元素被访问结束。而且迭代器只能往前访问,不能后退。另外迭代器的另一个优点,不会事先准备好访问的集合的所有元素。迭代器只有在迭代到某个元素后才会访问元素,而在这之前或之后,元素可以不存在或者销毁,这个特点是他特别适用于访问比较大或者无限的集合。

特点:

  1.访问者不需要了解内部结构,仅需通过next()方法不断获取下一个内容

  2.不能随机访问集合中的某个元素值,只能从头到尾依次遍历

  3.访问到一半时不能回退

  4.便于遍历比较大的集合,节省内存

>>> a = iter([1,2,3,4])
>>> a
<list_iterator object at 0x10467b3c8>
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
4
>>> a.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

二.生成器

一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就变成了生成器

>>> def func():
          yield 1
          yield 2
          yield 3
          yield 4
          yield 5        

上述代码中,当执行func函数时会生成一个生成器

>>> tmp = func()
>>> tmp.__next__()
1
>>> tmp.__next__()
2
>>> tmp.__next__()
3
>>> tmp.__next__()
4
>>> tmp.__next__()
5
>>> tmp.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

项目实战

利用生成器自定义range

def zrange(num):
    start = -1
    while True:
        start += 1
        if start >= num:
            return
        else:
            yield start