我正在尝试理解具有类的代码来创建一个生成器,该生成器稍后将使用内置的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很新。这个代码示例是我最好的尝试,以显示我遇到的问题,因为实际的代码做得更多,并且会减少问题并且太长而无法放在这里。我的经验不足以知道如何缩短它或者需要更多信息。
答案 0 :(得分:3)
next(x)
在大多数情况下非常直接转换为x.__next__()
。
因此,在没有__next__
成为&#34;真实&#34;的情况下调用您的gen
方法发生器。
调用有效,它只是一个简单的方法调用(不做任何假设或检查对象)。
答案 1 :(得分:1)
对象上的__iter__
方法应返回该对象的迭代器。它应该被定义为任何可迭代的对象,并由内置iter()
函数或各种语句调用(例如在for i in obj:
循环的初始化步骤中)
迭代器只是一个__next__
方法,可以返回迭代的下一个项目,或者在没有项目的情况下引发StopIteration
。它由内置next()
函数调用,并在各种情况下调用(例如,在for
循环的正文之前)
生成器是一个可迭代的,它很可能是不可重复的,因此它经常被表示为一个迭代器,它也是一个迭代器。因此,对于大多数生成器,他们定义了一个__next__
方法来生成下一个元素,以及一个只返回self的__iter__
方法。