【问题标题】:Can a method within a class be generator?类中的方法可以生成器吗?
【发布时间】:2016-09-17 21:09:07
【问题描述】:

在类中使用方法作为生成器是否可以接受/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()

【问题讨论】:

  • 我猜大多数例子都是函数,因为这样更简单;您不需要在课堂上,因此不会显示。

标签: python methods generator


【解决方案1】:

是的,这是完全正常的。例如,它通常用于实现 object.__iter__() method 以使对象成为可迭代对象:

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

但是,不要被这种常见模式所限制;任何需要迭代的东西都是生成器方法的候选者。

【讨论】:

  • +1 迭代器模式就是一个很好的例子。 Mark Pilgrim 的diveintopython3.net 涵盖了其中的一些内容。
  • 如果你得到TypeError: 'SomeContainer' object is not an iterator,你可能正在尝试使用sc = SomeContainernext(sc) 来获取每个值。而是先做sc_iter = iter(sc),然后再做next(sc_iter)。请参阅 (oreilly.com/library/view/python-cookbook-3rd/9781449357337/…)。
  • 您的意思是sc = SomeContajner(),可能:-) 是的,SomeContainer() 实例是可迭代的,它们不是迭代器对象。 next() 需要一个迭代器,iter() 从一个可迭代对象中生成一个迭代器。不同之处在于,一个可迭代对象可以产生任意数量的迭代器,但迭代器是一次性使用的。
猜你喜欢
  • 1970-01-01
  • 2015-11-12
  • 2021-04-09
  • 2015-02-27
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多