[英]Pythonic way to write nested for loops
我正在嘗試按照用戶代碼中指定的順序遍歷多個動態生成的生成器。
我想修改run()
以便它可以支持 n 個任務,而不是現在的三個。 我嘗試使用itertools.product()
但我不確定如何一次在我的生成器上調用next()
。
我想我將不得不在這里使用遞歸,但我不確定如何繼續。 任何點都非常感謝。
class ImageSeries:
def __init__(self):
self.tasks = []
def xy(self, position):
print(f"xy: {position}")
yield "xy"
def z(self, position):
print(f"z: {position}")
yield "z"
def exp(self, exposure):
print(f"exp: {exposure}")
yield "exposure"
def xy_scan(self, positions):
self._xy_task = lambda: (self.xy(pos) for pos in positions)
self.tasks.append(self._xy_task)
def z_scan(self, positions):
self._z_task = lambda: (self.z(pos) for pos in positions)
self.tasks.append(self._z_task)
def exp_scan(self, exposures):
self._exp_task = lambda: (self.exp(e) for e in exposures)
self.tasks.append(self._exp_task)
def run(self):
for generator_0 in self.tasks[0]():
next(generator_0)
for generator_1 in self.tasks[1]():
next(generator_1)
for generator_2 in self.tasks[2]():
next(generator_2)
def __repr__(self):
return str(self.self.tasks)
if __name__ == "__main__":
s = ImageSeries()
positions = [[0, 0], [100, 100], [1000, 1000]]
s.xy_scan(positions)
s.exp_scan([50, 100, 150])
s.z_scan([0, 100, 1000, 10000])
s.run()
我想要的 output 是:
xy: [0, 0]
exp: 50
z: 0
z: 100
z: 1000
z: 10000
exp: 100
z: 0
z: 100
z: 1000
z: 10000
exp: 150
z: 0
z: 100
z: 1000
z: 10000
xy: [100, 100]
exp: 50
z: 0
z: 100
z: 1000
z: 10000
exp: 100
z: 0
z: 100
z: 1000
z: 10000
exp: 150
z: 0
z: 100
z: 1000
z: 10000
xy: [1000, 1000]
exp: 50
z: 0
z: 100
z: 1000
z: 10000
exp: 100
z: 0
z: 100
z: 1000
z: 10000
exp: 150
z: 0
z: 100
z: 1000
z: 10000
如何在run
方法中修改for
循環,如下所示,
def get_task(self):
for task in self.tasks:
yield task()
def loop_over(self, generator_obj):
for generator in generator_obj:
next(generator)
self.loop_over(self.get_task())
def run(self):
self.loop_over(self.get_task())
這將確保調用所有n
個任務。
這是遞歸 function ,其中 n 應以 0 開頭
def run(self,n):
for generator in self.tasks[n]():
next(generator)
m=n+1
if m < len(self.tasks):
self.run(m)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.