2015-03-03 995 views
1

單行if語句 - Python的

我想重構爲一條線。像下面這樣:

board[a][b] = chr(current_char) if board[a][b] == 0 

看來,我可以來此最接近的是

board[a][b] = chr(current_char) if board[a][b] == 0 else board[a][b] 

但else子句似乎是多餘的。有沒有更好的方法來完成這個任務?

+4

爲什麼你需要這樣做?你的計算機在換行符上運行很慢嗎? – Barmar 2015-03-03 02:41:37

+0

@Barmar好一個大聲笑。你曾經去過阿靈頓的Comellas嗎? – Apollo 2015-03-03 02:42:21

+1

是的,沒有留下深刻的印象。看起來更適合那些可以利用他們的晚餐「喧鬧」的家庭,我是單身。 – Barmar 2015-03-03 02:43:25

回答

6

老校友的Python有一個竅門做三元的Python有一個三元運算符之前。實際上,這個技巧可以在許多編程語言中使用。我只會告訴你,如果你答應不使用它。

Promise?

[val_if_false, val_if_true][bool(condition)]

OK,現在Python有三元,它看起來像

val_if_true if condition else val_if_false 

但即使這樣,是有點兒馬虎。如果你真的想要一個班輪,做一個功能。

def val(): 
    if condition: 
     return val_if_true 
    else: 
     return val_if_false 

具體情況下是一個小更專業,因爲你想要的else是原始值。你可以做

box[a][b] = box[a][b] or chr(current_char) 

但是,if語句再一次對於意圖更具可讀性和清晰性。如果你打算是把這個一行

if board[a][b] == 0: board[a][b] = chr(current_char) 

-1

你的兩行版本很容易清晰。堅持下去。

>>> board[a][b] = board[a][b] or chr(current_char) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: an integer is required 

這裏發生了什麼?如果你的經理寫了它,你想找一個新的經理。如果你這樣做了,也許你的經理會尋找一名新員工,因爲這個程序在你度假時崩潰了。

+0

我想這裏發生的事情仍然會發生在兩行版本中。 – kojiro 2015-03-03 03:57:46

+0

這取決於哪一行會導致錯誤。 – 2015-03-03 04:24:12

+0

你可能是對的。但你確定嗎?這就是我想說的。錯誤在哪裏? a,b,board,chr(),current_char? – 2015-03-03 04:30:28

2

做這類事情的更「Python化」的方法是:

board[a][b] = board[a][b] or chr(current_char) 
+1

+1這是正確的,但我不同意它是Pythonic。顯然是Pythonic-ness的重要組成部分。平均維護程序員真的很明顯當'或'操作符的操作數不是布爾值時應該這樣操作嗎? – kojiro 2015-03-03 03:55:43

+0

如上所述,絕對不是「Pythonic」。看看我的例子。在兩行版本中出現問題會更清楚。這個例子更像C,儘管我懷疑C程序員是否會提出這個建議。 – 2015-03-03 04:33:22

+0

我們可以同意不同意,但很多被認爲是「Pythonic」的東西是利用該語言的特徵來獲取常用模式的簡潔表達。例如,Python的「真實性」經常被利用(包括我的解決方案)來減少額外的「噪音」(例如,如果len(some_list)!= 0 ... vs vs如果some_list ...)。在輸入變量時顯式使用變量更多的是C語言。利用「鴨子打字」的模式,你會在「Pythonic」程序中定期看到。從維護的角度來看哪一個更好是另一個爭論。 – Balthamos 2015-03-04 00:41:46

2

可以在的Python做到這一點。