2013-12-10 62 views
1

我的序列的邏輯等效性嚴重不足的睡眠,我需要幫助重寫邏輯的這個小Python的一塊如果否則如果else子句

for _ in range(100): 
    if a: 
     continue 
    elif b: 
     continue 
    elif c and d: 
     continue 
    else: 
     e() 

我想有像

if (some_exprt of a,b,c,d): 
    e() 

我得到的是:

if not a and not b and (not c or not d): 
    e() 

,但我真的不能告訴我們,如果這是正確與否,對嗎?

+0

究竟是你想做些什麼? –

+0

試着從「自下而上」思考它。 「如果a或b或c和d都不爲真,則執行e()」 –

+0

您可以使用[De_Morgan's_laws](http://en.wikipedia.org/wiki/De_Morgan's_laws)將答案轉換爲@Martijn給出 –

回答

6

開始於什麼條件下else分支會不是匹配。這將會是一個a,或b,或c and d,所以你需要使用ornot這裏來表達時,你的原代碼else分支將被拾起:

if not (a or b or (c and d)): 
    e() 

然後,您可以把not入括號通過施加one of De Morgan's laws,更冗餘表達之前的測試爲:

if not a and not b and not (c and d): 
    e() 

其然後可以進一步擴展爲:

if not a and not b and (not c or not d): 
    e() 

這是你自己已經擴展到的。但我會發現第一個版本更具可讀性。

1

continue不能在if語句內工作。所以我假設你在循環內運行(while或for)。試試這個:

#whatever loop 
if not(a or b or (c and d)): 
    e() 

沒有第二條本辦法未將是:

if a or b or (c and d): 
    continue 
else: 
    e() 

爲M. Martjin彼得斯在評論中解釋說,第二種方法內的其他塊是沒有必要的。您可以刪除else並將e()移動到if塊之外。不過,在我看來,if後的else會使代碼更具可讀性。

第二種方法也可以寫爲:

if a or b or (c and d): 
    continue 
e() 
+0

我是,我將擴展上下文 – baibo

+0

我認爲我們可以假設'if'語句是循環中唯一的代碼。 –

+0

這是一個安全的假設:-)我只是想澄清OP,繼續不能在一個if塊中使用,以防他正在嘗試:-) – thiruvenkadam

1
if not any((a, b, (c and d))): 
    e() 
+1

這會在調用'any()'之前評估'a','b'和'c'(也許是'd')。當a評估爲錯誤值時,這將*不會*短路。這可能很重要。 –