簡體   English   中英

在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 行短語句中,以使語句更短更清晰)

你可以在這里看到更多細節

此語法的工作原理如下:

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

第一個 one_value 是我們想要對列表中的每個元素執行的操作(因此我們可以執行類似 one_value+1 的操作來返回一個所有值都加 1 的列表)

比有一個“for one_value”,我們將每個元素稱為一個名稱

"in my_list" - 指定我們正在迭代的女巫列表

"if one_value ==0" - 將應用於列表中每個值的條件

if可以用在你的例子中,在生成器表達式和列表推導中使用for關鍵字。 對於前一種情況,請參閱comp_if的相關 Python 語法 BNF,對於后一種情況,請參閱list_if

您還可以在表達式中使用if內聯。 它類似於 C 的三級運算符? : ? :

例如

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

在這個語句中,條件<some_condition>被評估,並確定哪個表達式的值被分配給a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM