以下部分如何工作?

时间:2017-02-19 07:58:14

标签: python

我想了解以下内容:

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)]
__________________________________________________________________

盒子里面的部分是我想要清楚理解的部分以及它是如何被执行的。有人可以帮忙吗?

1 个答案:

答案 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类型的值