首页 > 代码库 > Python学习-40.Python中的迭代
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 StopIteration12 fib = self.b13 self.a,self.b = self.b,self.a + self.b14 self.n+=115 return fib16 17 for i in Fib(10):18 print(i)
效果与上一篇是一样的,可见yield也是一个语法糖,它帮我们偷偷实现了__iter__和__next__两个方法。
那么现在我们可以得到结论就是,在遍历开始的时候,会调用对象的__iter__方法(当然没有就报错了),该方法负责初始化遍历所需的参数,接着在遍历的时候,则调用的是__next__方法,方法的返回值作为该次遍历的值。而如果遍历结束,则抛出一个StopIteration的错误,for会处理这个错误从而结束遍历。以抛出错误的方式结束遍历,这一点与C#很不同。
Python学习-40.Python中的迭代
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。