The website uses cookies. By using this site, you agree to our use of cookies as described in the Privacy Policy.
I Agree

请问这个 Python 迭代器里 next () 定义怎么理解?

class Fibs: def __init__(self): self.a = 0 self.b = 1 def next(self): self.…
被浏览
8,713

6 个回答

首先理解迭代器。先看看C++怎么实现一个迭代器。在C++中,任何一个数据类型(不论是内置类型还是类)的变量p都可以作为一个迭代器,若同时满足四个性质(“IDEA"):
(1)Increment: p可以实现自增,【并且】遍历整个容器,即p++和++p是有意义的并可以实现遍历;
(2)Dereference: p可以解析,即*p是有意义的;
(3)Equality: p可以和同类型的变量q做相等/不等比较,即p==q和p!=q是有意义的;
(4)Assignment: p可以赋值给同类型的变量q,即q=p是有意义的。 
(从上面的定义来看,C++的指向数组元素指针显然满足这四条要求,因此指针可以作为数组的迭代器。而有的C++类,只要它有合适的成员方法可以实现上面四个条件,那么也可以作迭代器,比如标准模版库里容器的迭代器。) 
现在看看Python。Python的迭代器中,next方法就是实现(1)和(2)的,而(3)(4)是C++为自己提的个性要求,Python不需要管它。
具体来看,next的功能是是先解析,再自增。所以调用next后,会返回当前迭代器的解析值,并自增指向下一个容器元素。这也可以在Python源码看出来(3.5.1版本iterobject.c的46-66行): 
iter_iternext(PyObject *iterator)
{
 // 传入迭代器
 ... 
it = (seqiterobject *)iterator; 
... 
result = PySequence_GetItem(seq, it->it_index);
 //获取元素,即解析 
if (result != NULL) { 
 it->it_index++;  //将迭代器自增 
 return result;   //返回解析值
 } 
现在回到题主的问题。
 self.a, self.b = self.b, self.a+self.b
可以拆成两个语句: 
self.a = self.b,就是解析,获得斐波那契数列一个项
self.b = self.a+self.b,就是迭代器自增,指向下一个容器元素,即指向斐波那契数列下一个项 
return self.a,就是返回解析值
依个人愚见,应该可以回答题主问题。以上。
(抽象地说,迭代器都是一个套路)
Measure
Measure
Summary | 1 Annotation
先把可迭代对象转换成迭代器
2021/02/03 02:44