理解python之前先理解一个迭代器的概念。 迭代器是python中这么一类数据,你可以理解为iter是一些线性数据的集合,并且这个集合有next()和__iter__这两个方法。 调用next() 会依次序返回迭代器中的数据,当访问完迭代器中最后一个数据之后,会抛出预定义的异常 StopIteration。 而__iter__这个方法会返回迭代器对象本身。 我们看一下例子:
首先,python中用工厂函数iter()可以生成迭代器,
>>> a=[0,1,2,3]
>>> b=iter(a)
注意这里是把一个list作为参数传递给iter()生成迭代器,但实际上任何集合类型都可以传递给iter()生成迭代器。比如 元组 ,string甚至是字典。
然后我们调用迭代器的next()和__iter__
>>> b.next() 1 >>> b.next() 2 >>> b.next() 3 >>> b.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> b.__iter__ <method-wrapper '__iter__' of listiterator object at 0x7f1cb07eb6d0> >>>
那么弄出这么个迭代器到底有什么用呢,python里面什么地方会用到它呢? 很多地方都会用到迭代器。比如说 for 循环其实就内置了迭代器。
for val in mylist:
print val
这一段代码非常简单,mylist是列表类型,for循环打印mylist中所有的元素。 实际上这里就隐式的把mylist赋值赋值给了iter(mylist)。 比如,这段代码就替换成
a=iter(mylist)
for val in a.next():
print val
OK。 迭代器我们知道是什么了。我们再看看生成器。 生成器是这样一种函数
>>> def foo(): ... yield 1 ... yield 2 ... yield 3 ...
注意这种函数里面用了yield关键字。 而且,普通函数是返回值,而这个函数是返回一个迭代器。 比如仔细看完下面的代码你就明白了:
>>> a=foo() >>> a.next() 1 >>> a.next() 2 >>> a.next() 3 >>> a.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> a.__iter__ <method-wrapper '__iter__' of generator object at 0x7f1cb0787f50>
OK.总结一下就是说生成器是一种返回迭代器的函数。当你运行这个迭代器的next()时,迭代器会返回yield关键字标示的值。