2010-12-11 13 views
2

私は5時間ほどPythonに関する私の経験を目指しています。これまでのところ、私はそれができることにかなり感銘を受けました。私の現在の努力は、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 

は、私がそれを除いて、無制限の1のように、基本的に振る舞うBoundedStreamクラスを作ってみましたそれは要素が不足している特定の点です。私の質問は、このような束縛されたストリームには有限の数の要素があることを見て、それらを反復することができるはずです。明示的なリストを使用していた場合は、Pythonのinキーワードとforループを使用してこれをきちんと実行できます。私は自分のクラスの清潔さを保ちたいと思います。実装する方法や他の言語機能がありますか?あなたがルーキーに提供する可能性のある回答やその他の助けは、非常に高く評価されます!

-デビッド

P.

バインドされたストリームの魅力は、組み込みのrange関数を試したことですが、Pythonは、私が見たい範囲が大きすぎると主張しました。私はメモリ効率のためにストリームに目を向けました。

+3

* Pythonは、私が見たい範囲が大きすぎると主張しました* - Pythonがその主張をどのように表現しているかを覚えていますか?あなたのコードと結果として生じるエラーを見るのは非常に面白いでしょう。 –

+0

'BoundedStream'クラスの境界をどのように定義したいのですか? – martineau

答えて

9

for x in objectのように反復する場合は、新しいイテレータを返す__iter__メソッドを提供する必要があります。

反復子は次の要素を返すまたはそれ以上の要素がない場合StopIteration例外を発生させるいずれかの方法next()(パイソン2)または__next__(Pythonの3)を有するオブジェクトです。 (イテレータも自身を返すメソッド__iter__を持っている必要があります。)

ヒント:あなたは、多くの場合、自分でイテレータをコーディングする必要はありません。クラスに__iter__を実装する最も簡単な方法は、それをgenerator functionにするか、またはそこからジェネレータ式を返すことです(すべてのジェネレータはイテレータです)。また、別のオブジェクトから取得したイテレータを返すこともできます。ここにはiterの組み込み関数が役立ちます。


テストif x in objectについて、あなたは__contains__方法を提供する必要があります。

さらに読書:Python data model - emulating container types

+0

ありがとうKos!これはまさに私が探していたものです。迅速な回答と詳細については、皆様に感謝します。 – David

+0

ようこそ。緑色のダニを左に向けると、私は喜んで受け取りますこれにより解決されたものとしてマークされます。 – Kos

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

Python Data modelはあなたが言及した__contains____iter__方法に関するドキュメントなど、他の種類を、エミュレートすることができ、より多くの機能を持っています。反復可能にあなたのクラスをオンにする

2

、あなたはこれが有界するストリームを必要としないこと

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

注意をこのメソッドを追加する必要があります。無制限のストリームに対してもうまく動作します

関連する問題