Python 迭代器与生成器

一、迭代器

理解迭代器需要搞清楚容器(container)、迭代器协议、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)。

1、容器(container)

      容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象。

       在Python中,常见的容器对象有:

list, deque, ….
set, frozensets, ….
dict, defaultdict, OrderedDict, Counter, ….
tuple, namedtuple, …
str

2、迭代器协议

    在提供了next方法的对象中,执行迭代时返回下一项,当迭代至最后一项时就引起一个StopIteration异常,此时终止迭代。通常在对象内部定义一个__iter__()方法和__next__() 方法实现了迭代器协议 

3、可迭代对象(iterable)

   实现了迭代器协议的对象被称为可迭代对象。很多容器都是可迭代对象,此外如处于打开状态的files,sockets等更多的对象同样也是可迭代对象。

4、迭代器(iterator)

    迭代器是一个带状态的对象,它不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。调用__iter__()方法返回迭代器自身,调用next()方法的时候返回当前调用生成的结果,同时为下一次调用next()方法修改状态。


二、生成器

       生成器是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()和__next__()方法了,只需要一个yiled关键字。生成器不是立即产生结果,而是在需要的时候才产生结果,这种延迟操作是生成器的主要的用途。生成器函数与生成器表达式是生成器两种常见的用途。

1、生成器函数

      生成器函数和常规函数的定义相同,不同之处在于它的返回值不是通过return而是用yield。当执行到yield语句时会自动挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。

2、生成器表达式

    类似于列表推导式,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

squares = (x**2 for x in range(5))

   Python的很多内置函数(如for循环,sum函数)会自动实现迭代器协议,因此可以写出更加Pythonic的代码。

sum(x ** 2 for x in xrange(4)) 

猜你喜欢

转载自blog.csdn.net/u012474535/article/details/80046380