在 python 中,何时以及如何使用没有冒号或缩进的 for 和 if 语句?

In python, when and how can you use for and if statements without colons or indentation?

这个问题专门与使用生成器语句有关,并且源于 Udacity 的计算机程序设计课程中的这个程序:

旨在解决这个难题https://en.wikipedia.org/wiki/Zebra_Puzzle 此 img 可能更具可读性 http://imgur.com/klkaSry

import itertools

def zebra_puzzle():

    houses = [first, _, middle, _,_] = [1,2,3,4,5]
    orderings = list(itertools.permutations(houses))
    return next((WATER, ZEBRA)

        for (red, green, ivory, yellow, blue) in orderings
        if im_right(green,ivory)

        for (Englishman, Spaniard, Ukranian, Japanese, Norwegian) in orderings
        if Englishman is red
        if first is Norwegian
        if nextto(Norwegian, blue)

        for (dog, snails, fox, horse, ZEBRA) in orderings
        if Spaniard is dog

        for (coffee, tea, milk, oj, WATER) in orderings
        if coffee is green
        if Ukranian is tea
        if middle is milk

        for (OldGold, Kools, Chesterfields, LuckyStrike, Parliaments) in orderings
        if OldGold is snails
        if Kools is yellow
        if nextto(Chesterfields, fox)
        if nextto(Kools,horse)
        if LuckyStrike is oj
        if Parliaments is Japanese
        )

def im_right(h1,h2):
    return h1-h2 == 1

def nextto(h1,h2):
    return abs(h1-h2) == 1

def main():
    zebra_puzzle()

if __name__ == '__main__':
    main()

我一直 运行 解决 Project Euler 中的问题,这会很有用,但我最终不得不使用普通的嵌套循环。

还有,这个问题可以吗?

这是生成器表达式语法。它与多行一起工作的原因是因为他用 () 包裹它(通常它写在 1 行简短的陈述中以使陈述更短更清晰)

可以看到更多详情here

此语法的工作原理如下:

(one_value for one_value in my_list if one_value == 0)

第一个 one_value 是我们要对列表中的每个元素执行的操作(因此我们可以对 one_value+1 执行类似 return 的列表,其中包含所有值递增 1)

比有一个 "for one_value" 这样我们给每个元素起一个名字

"in my_list" - 指定 我们正在迭代的列表

"if one_value ==0" - 将应用于列表中每个值的条件

if 可以在生成器表达式和带有 for 关键字的列表理解中使用,如您的示例所示。对于后一种情况,请参阅 "comp_if" for the former case and "list_if" 的相关 Python 语法 BNF。

您还可以在表达式中使用 if 内联。类似于C的三级运算符? :.

E. g.

a = <expression_foo> if <some_condition> else <expression_bar>

在此语句中,条件 <some_condition> 被评估,并确定哪个表达式的值被分配给 a