Iterables / generator说明

时间:2017-04-07 18:25:22

标签: python generator iterable

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

我知道__iter__部分由于执行list()的{​​{1}}调用而被执行。但是__next__一直在执行,几乎就像一个while循环?直到执行StopIteration?

此外,所有“返回”元素都存储在__next__下?它是否只是存储在内存中,直到__next__下的return self将其返回给调用函数?

__iter__

上面的代码产生了例如:

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))  

1 个答案:

答案 0 :(得分: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__返回值附加到列表中,直到__next__提升StopIteration。引发StopIteration后,list将返回其构建的列表。