Iterables/generators 说明

Iterables/generators explanation

有人可以解释一下 __next__ 如何使用下面的代码吗?我知道 'next' 用于迭代器获取可迭代对象的下一项,通常使用 next()

我知道 __iter__ 部分被执行是因为 list() 调用执行了 __next__。但是 __next__ 一直在执行,几乎就像一个 while 循环?直到执行 StopIteration?

此外,__next__ 下的所有 'return' 元素都存储在哪里?是否全部存储在内存中,直到 __iter__ return self returns 到调用函数?

class FRange(object):
    def __init__(self, start, stop=None, step=None):   
        if stop is None:
            self.i = 0
            self.stop = start
            self.step = 1
        elif step is None:
            self.i = start
            self.stop = stop
            self.step = 1
        else:
            self.i = start
            self.stop = stop
            self.step = step

    def __iter__(self):
        return self

    def __next__(self):                             
        if self.i < self.stop and self.step > 0:
            self.i += self.step
            return self.i - self.step
        elif self.i > self.stop and self.step < 0:
            self.i += self.step
            return self.i - self.step
        else:
            raise StopIteration


def rangeFloat(args):
    return list(FRange(*args))  

上面的代码生成例如:

For args = [-1.1, 2.4, 0.3], the output is
rangeFloat(args) = [-1.1, -0.8, -0.5, -0.2, 0.1, 0.4, 0.7, 1, 1.3, 1.6, 1.9, 2.2].

list 基本上像

def list(thing):
    result = []
    for item in thing:
        result.append(item)
    return result

和一个for循环:

for item in thing:
    # loop body

效果像

iterator = iter(thing):
while True:
    try:
        item = next(iterator)
    except StopIteration:
        break
    # loop body

将这些东西放在一起,list 调用您的 FRange 实例的 __iter__ 方法来获取迭代器;在这种情况下,迭代器是您的 FRange 实例本身。然后它重复调用 __next__ 并将所有 __next__ return 值附加到列表,直到 __next__ 引发 StopIteration。一旦引发 StopIterationlist return 就是它构建的列表。