类生成器,不带\uu iter \uuuuuuu()方法,但对象实例与next()一起工作

2024-04-19 02:36:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解的代码有一个类来创建一个生成器,这个生成器稍后会使用内置的next()进行迭代。你知道吗

讨论的课程是:

Class MyGen():
    def __init__(self):
    """ Define some instance attributes"""
        self.foo = 'bar'
        self.some_attribute = 0
    def __next__(self):
        if self.some_attribute < some_condition:
            new_value = self.argument1
            self.some_attribute += 1
            return new_value

在全局函数中,返回的对象由next()内置函数遍历。那是。。。你知道吗

gen = Mygen()
next(gen) # Returns values

我不明白如果没有__iter__()方法,这个类怎么可能是一个生成器。是 __iter__()从类生成生成器所需的方法?在我搜索的每一个地方,似乎__iter__()__next__()一起用于从类创建生成器。你知道吗

我对Python还比较陌生。这个代码示例是我展示问题所在的最佳尝试,因为实际的代码做的更多,而且会偏离问题,而且太长,不能放在这里。我没有足够的经验,知道如何缩短它比这个或更多的信息是必需的。你知道吗


Tags: 方法函数代码selfnewvaluedefattribute
2条回答

对象上的__iter__方法应该返回该对象的迭代器。它应该为任何可iterable的对象定义,并由内置的iter()函数或各种语句调用(例如在for i in obj:循环的初始化步骤中)

迭代器只是带有__next__方法的东西,该方法返回iterable的下一项,或者在没有剩余项时引发StopIteration。它由内置的next()函数调用,并在各种情况下被调用(例如,就在for循环体之前)

生成器是一个iterable,它很可能不可重复,所以它经常被表示为iterable,iterable也是一个迭代器。因此对于大多数生成器,它们定义了一个__next__方法来生成下一个元素,以及一个__iter__方法来返回self。你知道吗

next(x)在大多数情况下几乎直接转换为x.__next__()。你知道吗

因此,调用__next__方法时,gen不是“真正的”生成器。你知道吗

调用是有效的,它只是一个简单的方法调用(不做任何假设也不检查对象)。你知道吗

相关问题 更多 >