2017-06-30 504 views
4

我試圖使用if-else表達式,如果if條件失敗,但得到一個invalid syntax錯誤,應該打破循環。爲什麼「if-else-break」在python中斷?

示例代碼:

a = 5 
while True: 
    print(a) if a > 0 else break 
    a-=1 

當然,如果我寫的傳統方式(不使用一個襯墊)它的工作原理。

請讓我知道在else關鍵字後面使用break命令有什麼問題。

+0

在這個例子中,你將如何擺脫這樣的循環? – WhatsThePoint

+0

@WhatsThePoint進行了編輯。 –

+0

是的..有兩個錯別字,(true代替true,'a> 5'代替'a> 0')。修正它們。感謝提及:) –

回答

12

如果我跑,我得到了以下錯誤:

...  print(a) if a > 0 else break 
    File "<stdin>", line 2 
    print(a) if a > 0 else break 
          ^
SyntaxError: invalid syntax 

這是因爲

print(a) if a > 5 else break 

三元運算符。三元運營商是if陳述。這些工作與語法:

<expr1> if <expr2> else <expr3> 

這是相當於到「虛擬功能」:

def f(): 
    if <expr2>: 
     return <expr1> 
    else: 
     return <expr3> 

因此,這意味着部分旁邊else應該是一個表達break不是表達式,這是一個聲明。所以Python不期望這一點。您不能return a break

,print也不是一個函數。所以這個錯誤與print聲明有關。在print是一個關鍵字。

你可以重寫你的代碼:

a = 5 
while True: 
    if a > 5: 
     print(a) 
    else: 
     break 
    a -= 1 

您可以在documentationPEP-308瞭解更多關於這一點。

+1

有關[docs](https://docs.python.org/3/reference/expressions.html#conditional-expressions)和[PEP308](https://www.python.org)的更多信息/ dev/peps/pep-0308 /) – Kendas

+1

@Kendas:謝謝。我在答案中包含了參考文獻。 –

5

If是一個表達式,break類似於return是一個聲明。你不能在一個句子中使用兩個語句(除非你使用了一個醜陋的分號)。 我知道如果我們能夠做到這一點,那將會非常酷,但可惜的是,事情就是這樣。

+2

Willem Van Onsem的答案有很多有用的信息,但我喜歡這個答案在實際應用中的清晰性和易用性;只記得你不能在一個句子中使用兩個語句更容易。 –

0

簡而言之,您濫用'單行if聲明'(ternary operator)。它總是評估爲表達式(即,值)。也就是說,

<expr1> if <condition> else <expr2> 

計算結果爲<expr1>,如果<condition>True,並<expr2>如果<condition>False。然後,該所得的值,可以使用任何類似的Python值,例如:

y = 0 
x = (5 if (y > 0) else 6) 
print(x) # 6 

當然,括號是完全沒有必要的(甚至泄氣),但希望對於理解該行的含義是有用的。

因此,

print(a) if a > 0 else break 

試圖評估print(a)(其中,在Python 3的print()定義,總是返回None - 完全有效的,但可能不是你平時想什麼),然後break,這不不評估任何事情,因爲它是statement (action), not an expression (value),因此invalid syntax錯誤。

因此,如果您想根據條件執行兩條語句中的一條,那麼您確實需要由威廉·範·翁塞姆提出的多線解決方案 。在一行中可能會有一些黑客行爲,但多行是Python中常見的解決方案。