3

シリアル接続 (pyserial) から行を読み取っています。現時点では、while ループを使用して行を読み取り、その入力に対して一連の関数を実行してから、オブジェクト (レンジファインダー) に保存しています。

シリアル入力をジェネレーターとして扱う必要があると言われました。これは、Python での処理方法です。

誰もこれについて経験がありますか?
または、少なくとも原則として、これがどのように達成されるかを説明できますか?
なぜそれが良いのですか?純粋にメモリ/速度のためですか?

編集:

関数はどこにありますか:

at_end()

から来る?私は得ています:

AttributeError: 'Serial' object has no attribute 'at_end'

私が使用する場合

while True:
    yield source.readline()

次に、出力を取得します。

4

3 に答える 3

2

Iterator Typesを見ているかもしれません。基本的に、クラスを実装します。

class SerialReader(object):
    def __init__(self, source):
        super(SerialReader, self).__init__()
        self.source = source

    def next(self):
        """Provide next piece of data from the serial source."""
        # If we have no more data, we have to raise StopIteration exception
        if self.source.at_end():
            raise StopIteration
        else:
            return self.source.read()

    def __iter__(self):
        return self

reader = SerialReader(some_serial_source)

for data in reader:
    do_something_with_data(data)

利点は、そのようなイテレーター/ジェネレーターを使用することです-イテレーターを受け入れる任意の python メソッドで使用できます。

  • リスト内包表記:sample = [data for data in serial_reader]
  • イターツール
  • リストへの迅速かつ簡単な変換: list(serial_reader)- すべてのデータを読み取り、リストを返します
  • ... はるかに

Iterator は非常に Pythonic なパターンであり、頻繁に会うことができます。多くの Python ライブラリはイテレータを利用しています。

メモリ使用量について: データのストリームを受け入れる別の関数でソースを処理したいとします。すべてのソース データをロードする必要はありません。ジェネレーター (イテレーター) を処理関数に渡すだけで、必要に応じてデータが読み込まれます。

于 2012-04-12T14:30:20.043 に答える
1

あなたがすべきことは:

for x in myObject:
    # do stuff with x

これにより、myObjectの値が繰り返されます。これが機能するには、オブジェクトがイテレータプロトコルを実装する必要があります(http://docs.python.org/library/stdtypes.html#iterator-typesを参照)。これは、リスト、タプル、ジェネレーター、dictで機能します...

良い点は、インデックスが不要であり、オブジェクトを実装する必要がないことです。 __getitem__

于 2012-04-12T14:26:12.920 に答える
0

Python のドキュメントは最高のものの 1 つなので、 Generator のドキュメントにリダイレクトします。

はい、純粋にメモリと速度のためです。

于 2012-04-12T14:24:47.113 に答える