python 困扰我的 iterable
2017-12-05 本文已影响4人
法号无涯
现在大概明白了,iterable是for 循环背后的家伙。像list、dictionary、tuple等都是 iterable。for调用一个iterable时相当于是调了它的iter() 方法,此方法返回 iterator。而这个 iterator 有 next() 函数,这个next会每次执行一次,挨个取得各个元素。但一直不明白的是这俩例子之间的差别是出于什么原因:
例1
class yrange:
def init(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def next(self):
if self.i < self.n:
i = self.i
self.i += 1
return i
else:
raise StopIteration()
例2
class zrange:
def init(self, n):
self.n = n
def __iter__(self):
return zrange_iter(self.n)
class zrange_iter:
def init(self, n):
self.i = 0
self.n = n
def __iter__(self):
# Iterators are iterables too.
# Adding this functions to make them so.
return self
def next(self):
if self.i < self.n:
i = self.i
self.i += 1
return i
else:
raise StopIteration()
例1是iterable返回的那个 iterator也是自己,所以就是在调用自己的 next函数
例2的iterable返回的是另外一个 iterator,所以调用的是另外一个类的 next 函数。
但为什么一个只能遍历一次,另外一个可以遍历多次呢?
网上搜了很多没得到答案,
猜想1
可能是例2中每次iter()函数返回的是一个新的 iterator对象,每次都是一个还没被执行next函数的iterator。这样就说得通一点。