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

2024-06-16 12:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题特别是关于使用生成器语句的问题,源于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()

我在projecteuler中经常遇到这样的问题,这会很有用,但我最终不得不使用普通的嵌套循环。你知道吗

还有,这个问题可以吗?你知道吗


Tags: inforreturnifismaindefgreen
2条回答

这是一个生成器表达式语法。它可以与多行一起工作的原因是,他用()将它包装起来(通常写在一行较短的语句中,以使语句更短、更干净)

您可以查看更多详细信息here

此语法的工作原理如下:

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

第一个one\u值是我们希望对列表中的每个元素执行的操作(因此我们可以执行类似于one\u值+1的操作,以返回一个所有值都递增1的列表)

有一个“for one\ u value”这样我们就把每个元素称为一个名称

“在我的列表中”-指定我们正在迭代的女巫列表

“如果一个值==0”-将应用于列表中每个值的条件

if可以在生成器表达式和带有for关键字的列表理解中使用,如您的示例所示。前一种情况请参见"^{}"的相关Python语法BNF,后一种情况请参见"^{}"。你知道吗

也可以在表达式中使用if内联。它类似于C的三级运算符? :。你知道吗

例如

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

在这个语句中,对条件<some_condition>进行求值,并确定将哪个表达式的值赋给a。你知道吗

相关问题 更多 >