2010-12-11 29 views
2

我正在使用Python的5小时左右的经验,到目前为止,我对它的功能印象深刻。我现在的努力是为了作一个简短的企图在Stream类,用于其代码如下:我可以让我的课在Python中的“in”关键字中玩吗?

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。

+3

* Python声称我想要查看的范围太大* - 你能记得Python说它是如何声称它做出的?看到你的代码和产生的错误将是非常有趣的。 – 2010-12-11 08:57:39

+0

您想如何定义“BoundedStream”类的界限? – martineau 2010-12-11 09:15:34

回答

9

对于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

+0

谢谢科斯!这正是我所期待的。并感谢大家的快速回答和良好的细节。 – David 2010-12-11 17:00:12

+0

不客气。如果您在左侧打勾绿色的勾号,我会很高兴,这就是我们如何在SO上标记接受的答案。这也将标记问题解决。 – Kos 2010-12-11 18:43:53

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这甚至不是一个问题 - x范围已被删除,现在的范围做什么的xrange在Python 2.x的那样)
  • xrange确实允许你创建非常大的范围,但不幸的是不是任意大。还有一个限制。
2

要打开你的类变成一个可迭代,你需要添加此方法

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

请注意,这并不需要被限定的流。它也可以很好地处理无界流

相关问题