Python

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。这样就说得通一点。

上一篇 下一篇

猜你喜欢

热点阅读