Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类中的方法可以是生成器吗?_Python_Methods_Generator - Fatal编程技术网

Python 类中的方法可以是生成器吗?

Python 类中的方法可以是生成器吗?,python,methods,generator,Python,Methods,Generator,在类中使用方法作为生成器是否可以接受/Pythonic?我发现的所有示例都在函数中显示了yield语句,而不是在类中 下面是一个示例工作代码: class SomeClass(object): def first_ten(self): for i in range(10): yield i def test(self): for i in self.first_ten(): print i Som

在类中使用方法作为生成器是否可以接受/Pythonic?我发现的所有示例都在函数中显示了yield语句,而不是在类中

下面是一个示例工作代码:

class SomeClass(object):
    def first_ten(self):
        for i in range(10):
            yield i

    def test(self):
        for i in self.first_ten():
            print i

SomeClass().test()

是的,这很正常。例如,它通常用于实现使对象成为可编辑的对象:

class SomeContainer(object):
    def __iter__(self):
        for elem in self._datastructure:
            if elem.visible:
                yield elem.value

然而,不要感到受这种共同模式的限制;任何需要迭代的方法都是生成器方法的候选方法。

我想大多数示例都是函数,因为这样更简单;您不需要在类中,因此没有显示它。+1迭代器模式就是一个很好的例子。Mark Pilgrim涵盖了其中一些内容。如果您得到的是
TypeError:“SomeContainer”对象不是迭代器
,那么您可能正在尝试类似于
sc=SomeContainer
的方法来获得每个值。相反,先做
sc\u iter=iter(sc)
,然后再做
next(sc\u iter)
。请参见()。您的意思是
sc=SomeContajner()
,可能是:-)是的,
SomeContainer()
实例是可编辑的,它们不是迭代器对象
next()
需要迭代器,而
iter()
从iterable生成iiterator。不同之处在于iterable可以生成任意数量的迭代器,但迭代器是一次性使用的。