生成器

理解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关键字标示的值。

posted on 2014-04-21 17:35  kramer  阅读(209)  评论(0编辑  收藏  举报

导航