我可以使用Python'“in”关键字使我的课程更好吗?

时间:2010-12-11 08:45:20

标签: python

我要花费大约5个小时的Python经验,到目前为止,我对它的功能印象非常深刻。我目前的努力是对Stream类进行简短的尝试,其代码如下:

class Stream:

    """A Basic class implementing the stream abstraction. """

    def __init__(self,data,funct):
        self.current = data
        self._f = funct

    def stream_first(self):
        """Returns the first element of the stream"""
        return self.current

    def stream_pop(self):
        """Removes and returns the first element of the stream. """
        temp = self.current
        self.current = self._f(self.current)
        return temp

在那里享受适度的成功,我试图创建一个BoundedStream类,其行为基本上类似于无界的类,除了在某个点上它用完了元素。我现在的问题是,看到任何这样的有界流有一些有限数量的元素,应该可以迭代它们。如果我使用的是显式列表,我可以使用Python的in关键字和for循环来干净利落地执行此操作。我想为自己的班级保持清洁。是否有一些我可以实现的方法,或任何其他语言功能,这将允许我这样做?您可能会向新手提供的任何答案或其他帮助将不胜感激!

-David

P.S。

对于那些想要了解的人来说,有界流的推动力是我尝试了内置range函数,但Python声称我想看的范围太大了。为了提高记忆效率,我已转向Streams。

4 个答案:

答案 0 :(得分:10)

对于在for x in object中进行迭代,您需要提供一个__iter__方法,该方法将返回一个新的迭代器。

迭代器是一个对象,它有一个方法next()(Python 2)或__next__(Python 3),它返回下一个元素或在没有更多时引发StopIteration异常元素。 (迭代器也应该有一个返回自身的方法__iter__。)

  

提示:您通常不需要自己编写迭代器代码;在类上实现__iter__的最简单方法是使其成为generator function或从中返回生成器表达式(所有生成器都是迭代器)。你也可以只返回从另一个对象获得的迭代器; iter内置版在这里很有帮助。


要测试if x in object,您需要提供__contains__方法。

进一步阅读:Python data model - emulating container types

答案 1 :(得分:4)

  

我尝试了内置范围功能,但Python声称我想看的范围太大了。

请尝试使用xrange。这需要O(1)内存,因为它实际上并不创建数字列表,它只是创建一个行为类似于数字列表的对象。换句话说,您正在尝试做的事情已经可用。

>>> 5 in range(10**9)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>> 5 in xrange(10**9)
True

注释

  • 在Python 3中,这甚至不是问题 - xrange已被删除,范围现在可以执行xrange在Python 2.x中所做的事。)
  • xrange确实允许你创建非常大的范围,但不幸的是不是任意大的。还有一个限制。

答案 2 :(得分:2)

作为@Kos答案的附录,Python Data model有更多功能可以让您模拟其他类型,包括所提到的__contains____iter__方法的文档。

答案 3 :(得分:2)

要将您的类变为可迭代,您需要添加此方法

def __iter__(self):
    while True:
        yield self.stream_pop()

请注意,这不需要限制流。它也适用于无限流的