2013-04-23 44 views
3

我正在學習python,我想確保我以正確的方式組織「if」語句。我一直跑了很多進入的情況如下:Python Pythonic的方式來組織/設計如果語句

if x == 0: 
    dostuff_A 
    if y == 0: 
     dostuff_B    
else: 
    dostuff_B 

正如你可以看到我不停地重複「dostuff_B」了很多,有contantly是更改代碼的兩倍。我知道我可以有一個功能,而不是「dostuff_B」,但我的問題是關於如果設計。我發現另一個解決方法是執行以下操作,但後來我複製if語句。

if x == 0: 
    dostuff_A 
if x != 0 or y == 0: 
    dostuff_B 

任何想法?提前致謝!

更新:刪除冒號前的空格。還更新了我的解決方法,因爲沒有意義。原始版本:

if x == 0: 
    dostuff_A 
if x == 0 and y == 0: 
    dostuff_B 
+7

這裏的東西讓我覺得大多數unpythonic是':'前面的空格: – Eric 2013-04-23 19:45:50

+0

代碼沒有任何意義。 – enginefree 2013-04-23 19:46:48

+5

第二個'if'應該是'if x!= 0或y == 0:' – user4815162342 2013-04-23 19:47:36

回答

4

我看到一些正確的答案已經被公佈,但他們沒有解釋他們是如何得到的解決方案。的簡化嵌套if-else聲明

一種方式是通過使用真值表:

x y what you call 
----------------------- 
0 0 A and B 
0 1 A 
1 0 B 
1 1 B 

從上表可以看到,你只調用時x == 0。讓我們將它放入代碼:

if x == 0: 
    somestuff_A 

來自同一個表,你可以看到你不叫B中的唯一時間是在x == 0y == 1。 再次,讓我們將它放入代碼:

if x != 0 or y == 0: 
    somestuff_B 

或:

if not x == 0 or y == 0: 
    somestuff_B 

如果你把兩段代碼一起,這是你會得到什麼:

if x == 0: 
    somestuff_A 
if not x == 0 or y == 0: 
    somestuff_B 
+1

'不是x == 0'總是讓我感到困惑,當我看到它。 IMO,'x!= 0'更可取 – Eric 2013-04-24 19:28:47

4

我不知道這是否是更Python,但第二個風格給我讀更清楚(我同意冒號前的空間,並刪除它)。

if x == 0: 
    dostuff_A 
if x == 0 and y == 0: 
    dostuff_B 

這也可以適用於其他語言。但是,你所擁有的兩個例子(現在我仔細看看)在邏輯上並不相同;也許你的意思是這樣的:

if x == 0: 
    dostuff_A 
if x != 0 or y == 0: 
    dostuff_B 
+0

這裏的問題是處理X!= 0的情況,它在原始代碼塊中意味着destuff_B。 – 2013-04-23 19:51:23

+1

我喜歡你的第二個例子。它解決了我上面提出的問題。 – 2013-04-23 19:52:42

+1

我不喜歡你如何指定'dostuff_B'兩次。如果這是一個更長的聲明或多行,它會變得非常混亂和冗餘。在這種情況下,一個簡單的'if x!= 0或y == 0'就可以工作。 – poke 2013-04-23 20:01:55

4

考慮這個初始代碼:

if x == 0 : 
    dostuff_A 
    if y == 0 : 
     dostuff_B    
else : 
    dostuff_B 

它可以重新寫爲:

if x == 0: 
    dostuff_A 
if x != 0 or y == 0: 
    dostuff_B 
1

想必你dostuff_B實際上是代碼應該是這樣的分支之間相同的較大的塊,如果你改變一個dostuff_B,你也需要改變對方保持一致。在這種情況下,在複製代碼時存在非常實際的危險,您最好在if語句中改爲多餘。

正如在評論中指出的,你的第二個例子與第一個例子不一樣。它應該是:

if x == 0: 
    dostuff_A 
if x != 0 or y == 0: 
    dostuff_B 
0

當你寫一個一次性的腳本,它並沒有多大關係,其設計是更Python - 如果這是可以理解這是好的。當您開始將其重構爲更有用的東西時,您可以使用相應的refactoring

1

首先,你是對的,你的do_stuff應該有兩個獨立的功能。假設,我提出以下建議:

if x == 0 and y == 0: 
    do_stuff_A() 
    do_stuff_B() 
elif x == 0: 
    do_stuff_A() 
else: 
    do_stuff_B() 

在我的腦海裏,這使得明確地清楚什麼在代碼中發生的事情,因爲我讀它:

  • 如果x和y == 0,然後do_stuff_A ()和do_stuff_B()
  • 如果x == 0,則do_stuff_A()
  • 在所有其他情況下,只是do_stuff_B()
+0

@glglgl謝謝您糾正我的錯字。 – 2013-04-23 20:48:09

1

不管你的例子,可以很容易地重寫到下面的代碼,我會說這取決於更有意義的情況。無論如何,我會盡量避免不止一次地指定dostuff_Adostuff_B。所以你可以在那裏使用更復雜的條件。另一方面,如果第一個dostuff_B與之前的dostuff_A相關(暗示第二個dostuff_B在這裏是別的),我會保持兩級。如果dostuff_Adostuff_B彼此完全無關,則將它們完全分開將是優選的。

if x == 0: 
    dostuff_A 

if x != 0 or y == 0: 
    dostuff_B