2010-12-11 31 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() 

請注意,這並不需要被限定的流。它也可以很好地處理無界流

相關問題