【问题标题】:Iterables/generators explanation迭代器/生成器解释
【发布时间】:2017-09-03 05:37:06
【问题描述】:

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

我知道__iter__ 部分会因为执行__next__list() 调用而被执行。但是__next__继续执行,就像一个while循环?直到 StopIteration 被执行?

另外,__next__ 下存储的所有“返回”元素在哪里?是不是全部都存储在内存中,直到__iter__下的return self返回给调用函数?

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].

【问题讨论】:

    标签: python generator iterable


    【解决方案1】:

    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 就会返回它构建的列表。

    【讨论】:

    • 下一个(迭代器)应该是下一个(迭代器)吗?
    • @user1179317:确实应该。
    猜你喜欢
    • 2018-05-16
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2017-04-06
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多