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

时间:2015-09-14 18:24:40

标签: python loops generator 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中遇到问题,这会有用,但我最终不得不使用普通的嵌套循环。

此外,这个问题还可以吗?

2 个答案:

答案 0 :(得分:1)

这是一个生成器表达式语法。它与多行一起工作的原因是因为他用()将它包裹起来(通常它用一行短的语句写成,以便明显更简洁,更清晰)

您可以看到更多详情here

此语法的工作原理如下:

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

第一个one_value是我们想要对列表中的每个元素执行的操作(因此我们可以执行类似one_value + 1的操作来返回所有值增加1的列表)

比一个"对于one_value"这样我们称每个元素为名称

"在my_list" - 指定我们正在迭代的女巫名单

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

答案 1 :(得分:0)

如您的示例所示,

if可以在for关键字的生成器表达式和列表推导中使用。对于前一种情况,请参阅"comp_if"的相关Python语法BNF,对于后一种情况,请参阅"list_if"

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

电子。克。

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

在此声明中,条件<some_condition>得到评估,并确定将哪个表达式的值分配给a