直接说我的理解,迭代器和生成器都是Python中特有的概念,迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个可迭代的对象必须是定义了__iter__()方法的对象,而一个迭代器必须是定义了__iter__()方法和next()方法的对象。生成器的概念要比迭代器稍显复杂,因为生成器是能够返回一个迭代器的函数,其最大的作用是将输入对象返回为一个迭代器。Python中使用了迭代的概念,是因为当需要循环遍历一个较大的对象时,传统的内存载入方式会消耗大量的内存,不如需要时读取一个元素的方式更为经济快捷。基本的理解就是这样,下面简单看看代码。
点击(此处)折叠或打开
- __metaclass__=type
- #iterator and generator
- class Fibs:
- def __init__(self):
- self.a = 0
- self.b = 1
- def next(self):
- self.a, self.b = self.b, self.b + self.a
- if self.a > 10: raise StopIteration
- else:
- return self.a
- def __iter__(self):
- return self
- fibs = Fibs()
- print list(fibs)
第三行到第十三行定义了斐波那契数列类,其中最为关键的是第七行的next函数和第十二行的__iter__函数,这两个函数的定义使得Fibs成为了一个迭代器类。next()方法的作用是返回对象的下一个元素值,因此需要return语句;__iter__()方法的作用是返回对象自身,从而可以继续遍历对象的下一个元素,因此使用语句return self;
第十四行定义一个对象fibs,然后使用list()函数将其转化成列表;
至于生成器,我们可以看下面的函数:
点击(此处)折叠或打开
- # -*- coding: cp936 -*-
- __metaclass__=type
- #iterator and generator
- def flatten(i_stream):
- try:
- #不要迭代字符串对象
- try: i_stream + ' '
- except TypeError:pass
- else: raise TypeError
- for sublist in i_stream:
- for element in flatten(sublist):
- yield element
- except TypeError:
- yield i_stream
- test = [1, 2, [3, 4], 5, [[6, 7], 8, [9, 12], 13], 89, 99]
- print list(flatten(test))
第四行到第十四行定义了一个解除嵌套的函数,首先使用try来处理类型异常,因为字符串类型没有必要单独拆分成列表;
第十行到第十二行使用递归的模式处理列表嵌套问题,基本情况直接返回i_stream,递归情况则调用自身函数;
只有定义了yield语句的函数才可以作为生成器使用;