2 回答

TA貢獻1780條經驗 獲得超1個贊
您可以設置鏈式生成器以降低縮進級別。
iter_tasks = (task for job in jobs for task in job.tasks)
iter_commands = (command for task in iter_tasks for command in task.commands)
for command in iter_commands:
print(command.actual_cmd)
我同意OldBunny2800的觀點,在三個嵌套循環的情況下,鏈接生成器在可讀性方面可能不會給你帶來太多好處。
如果您的嵌套邏輯比這更深,生成器就會開始變得有吸引力。不僅縮進級別受到控制,您還可以為每個生成器分配一個有意義的變量名稱,有效地為for循環命名。

TA貢獻1943條經驗 獲得超7個贊
它是蟒蛇式的。已經。
但是如果你擔心這會深入 10 層以上,只有最內層的循環有任何有趣的東西,你可以考慮的一件事是創建一個生成器。你的代碼可以變成:
def get_command(jobs):
for job in jobs:
for task in job.tasks:
for command in task.commands:
yield command
for command in get_command(jobs):
print command.actual_cmd
所以整個目的是避免過度縮進。
為了使它在多層次上通用,所以即使它有 100 多個層次,你也不用擔心:
def get_nested(objlist, attribs):
for x in objlist:
if len(attribs) == 0:
yield x
else:
x_dot_attr = getattr(x, attribs[0])
for y in get_nested(x_dot_attr, attribs[1:]):
yield y
for command in get_nested(jobs, ["tasks", "commands"]):
print command.actual_cmd
但是不,這種概括并沒有使它更加pythonic。它只是避免過度縮進。
添加回答
舉報