码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习-40.Python中的迭代

时间:2014-09-30 00:07:21      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   ar   for   sp   div   

在上一篇中,我们使用了生成器来创建了一个可遍历的对象。在其中,我们使用了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#很不同。

Python学习-40.Python中的迭代

标签:style   blog   color   io   使用   ar   for   sp   div   

原文地址:http://www.cnblogs.com/h82258652/p/4001078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!