2

ImageSeries特定のパターン (xy のすべての値、z のすべての値) で画像を取得するオブジェクトを作成しようとしています。ジェネレーターをタスク リストに追加するメソッドを呼び出して、これを行うには、ジェネレーターを 2 つの for ループに通します。

しかし、私の 2 番目のタスクは、最初のタスクの最初の繰り返しの後に使い果たされてしまいます。これは私の望む結果ではありません。2 番目のタスクが最初のタスクのすべての反復を実行するようにします。

このようなパターンをプログラムする効率的な方法があるかどうか疑問に思っていました。

class ImageSeries:
    tasks = []

    def xy(self, position):
        print(position)
        yield "xy"

    def z(self, position):
        print(position)
        yield "z"

    def xy_scan(self, positions):
        self.tasks.append((self.xy(pos) for pos in positions))

    def z_scan(self, positions):
        self.tasks.append((self.z(pos) for pos in positions))

    def run(self):
        for i in self.tasks[0]:
            next(i)
            for j in self.tasks[1]:
                next(j)

    def __repr__(self):
        return str(self.tasks)
    

if __name__ == "__main__":
    s = ImageSeries()
    positions = [[0, 0], [100, 100], [1000, 1000]]
    s.xy_scan(positions)
    s.z_scan([0, 100, 1000, 10000])

現在の出力:

[0, 0]
0
100
1000
10000
[100, 100]
[1000, 1000]

期待される出力:

>>> s.run()
[0, 0]
0
100
1000
10000
[100, 100]
0
100
1000
10000
[1000, 1000]
0
100
1000
10000
4

2 に答える 2

2

どうぞ

class ImageSeries:
    def __init__(self):
        self._xy_tasks = None
        self._z_tasks = None

    def xy(self, position):
        print(position)
        yield "xy"

    def z(self, position):
        print(position)
        yield "z"

    def xy_scan(self, positions):
        self._xy_tasks = lambda: (self.xy(pos) for pos in positions)

    def z_scan(self, positions):
        self._z_tasks = lambda: (self.z(pos) for pos in positions)

    def run(self):
        for xy_generator in self._xy_tasks():
            next(xy_generator)
            for z_generator in self._z_tasks():
                next(z_generator)

    def __repr__(self):
        return str(self._xy_tasks()) + " " + str(self._z_tasks())


if __name__ == "__main__":
    s = ImageSeries()
    positions = [[0, 0], [100, 100], [1000, 1000]]
    s.xy_scan(positions)
    s.z_scan([0, 100, 1000, 10000])
    s.run()

いくつかのことをしました:

  1. と呼ばれるrun()
  2. self.tasks は、各セルの意味が異なるため、リストとしては意味がありません。そのため、セルを 2 つの個別のメンバー変数に分けました。
  3. 主なことは、リセットできないため、ジェネレーターが実行ごとに再度作成されるようにすることでした。ラムダを使用してこれを達成したので、ジェネレーター自体ではなく、毎回ジェネ​​レーターを作成する関数を呼び出すことができます。に注意してself._xy_tasks()ください。これは、ジェネレーターを作成する関数を呼び出します。
于 2020-07-18T17:31:09.587 に答える