我遇到了一段代码,内容如下:
queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
这是否相当于:
for Xi in csp.vars:
for Xk in csp.neighbors[Xi]:
queue.append((Xi, Xk))
或者这是否表示嵌套 for 语句以外的其他内容?
我遇到了一段代码,内容如下:
queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
这是否相当于:
for Xi in csp.vars:
for Xk in csp.neighbors[Xi]:
queue.append((Xi, Xk))
或者这是否表示嵌套 for 语句以外的其他内容?
你有它完全正确。请参阅列表理解文档:
提供列表推导时,它由一个表达式组成,后跟至少一个
for
子句和零个或多个for
orif
子句。在这种情况下,新列表的元素是通过将每个for
orif
子句视为一个块、从左到右嵌套并在每次到达最里面的块时计算表达式以产生一个列表元素而产生的元素。
所以你对 for 循环嵌套的解释是正确的。
正如其他人已经指出的那样,这正是它的意思。
我还发现有时在 list-comprehension/genexp 中使用多个 for 会让人感到困惑,所以我通常会避免使用它们。当我使用它们时,我通常将每个 for 放在不同的行中,例如:
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
甚至缩进:
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
这清楚地表明哪个是内部 for 循环。
此外,list-comprehension 可以为每个 for 循环都有一个 if 表达式,因此完整的语法类似于:
queue = [(Xi, Xk) for Xi in csp.vars
if condition_one()
for Xk in csp.neighbors[Xi]
if condition_two()
... ]
尽管我希望你永远不会写出那样的东西。最后的 if 表达式很好,但是将它与 for 混合起来就太麻烦了,而且根本不可读。