我想了解以下内容:
outer_dir=os.path.expanduser("/home/nsingh/ansible-environments/aws")
print (outer_dir)
random_names = os.listdir(outer_dir)
print (random_names)
_____________________________________________________________
inner_dirs = [
os.path.join(outer_dir, name, "inventory/group_vars")
for name in random_names
]
print (inner_dirs)
inner_dirs = [name for name in inner_dirs if os.path.isdir(name)]
__________________________________________________________________
盒子里面的部分是我想要清楚理解的部分以及它是如何被执行的。有人可以帮忙吗?
答案 0 :(得分:1)
这些是 list comprehensions ,Python语法元素,允许您在生成器表达式中动态生成列表内容。
基本上,当展开时,此代码将如下所示:
inner_dirs = []
for name in random_names:
element = os.path.join(outer_dir, name, "inventory/group_vars")
inner_dirs.append(element)
print(inner_dirs)
new_inner_dirs = []
for name in inner_dirs:
if os.path.isdir(name):
new_inner_dirs.append(name)
inner_dirs = new_inner_dirs
这显然不是最佳的(涉及创建不需要的列表和追加,因此需要花费更多的时间和内存),因此这种理解可以让您的循环更清晰,更简洁,更高效。
评估顺序如下:
[(3) for i in (1) if (2)]
(1)
仅在输入时评估一次,(2)
和(3)
在每次迭代时独立评估
(1)
应该是一个可迭代的对象,(2)
应该返回一个可以转换为bool
类型的值