Python学习-40.Python中的迭代

在上一篇中,我们使用了生成器来创建了一个可遍历的对象。在其中,我们使用了yield关键字。

Python我也正在学习中,因此对yield的本质我并不熟悉,但是,在C#中,yield关键字则是语法糖,其内部维护着一个迭代状态(对于C#里的Array,这是当前遍历的元素下标)。

那么,在Python中,是否也是一种语法糖了?首先,我们知道,生成器产生的是一个对象,并且这个对象能够被遍历,参考C#,在C#中可foreach的对象都有GetEnumerator方法。那么,Python中很有可以也是具备某些方法而使得该对象可以被遍历。

联想,整理:

对象——class

方法——很可能是像构造函数(__init__)具备下划线的保留方法。

 

根据《深入Python3》,果然如此。

码上代码:

 1 class Fib:
 2     def __init__(self,max):
 3         self.max = max
 4     def __iter__(self):
 5         self.n = 0
 6         self.a = 0
 7         self.b = 1
 8         return self
 9     def __next__(self):
10         if self.n >= self.max:
11             raise StopIteration
12         fib = self.b
13         self.a,self.b = self.b,self.a + self.b
14         self.n+=1
15         return fib
16          
17 for i in Fib(10):
18     print(i)

效果与上一篇是一样的,可见yield也是一个语法糖,它帮我们偷偷实现了__iter__和__next__两个方法。

那么现在我们可以得到结论就是,在遍历开始的时候,会调用对象的__iter__方法(当然没有就报错了),该方法负责初始化遍历所需的参数,接着在遍历的时候,则调用的是__next__方法,方法的返回值作为该次遍历的值。而如果遍历结束,则抛出一个StopIteration的错误,for会处理这个错误从而结束遍历。以抛出错误的方式结束遍历,这一点与C#很不同。

posted @ 2014-09-29 22:23  h82258652  阅读(280)  评论(0编辑  收藏  举报