gpt4 book ai didi

python - 如何在python中创建嵌套的生成器结构?

转载 作者:行者123 更新时间:2023-12-04 09:26:56 26 4
gpt4 key购买 nike

我正在尝试创建一个 ImageSeries对象,我想以某种模式检索图像(对于 xy 中的每个值,以及 z 中的每个值),我调用将生成器附加到任务列表的方法,并通过两个 for 循环运行生成器来执行这个。
但是我的第二个任务在第一个任务的第一次迭代后就筋疲力尽了,这不是我想要的结果。我希望第二个任务运行第一个任务的每次迭代。
我想知道是否有有效的方法来编程这样的模式。

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

最佳答案

干得好

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()
做了一些事情:
  • run()
  • self.tasks 作为列表没有意义,因为每个单元格都有不同的含义,所以我将它分成两个单独的成员变量。
  • 最重要的是确保每次运行时都会再次创建生成器,因为它无法重置。我通过使用 lambda 实现了这一点,因此您可以调用每次创建生成器的函数,而不是生成器本身。请注意 self._xy_tasks() .这将调用一个创建生成器的函数。
  • 关于python - 如何在python中创建嵌套的生成器结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62971103/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com