2013-10-31 67 views
1

假設我有一個條件評估爲布爾值,condition,我想將變量foo設置爲取決於該條件的值。Python:大多數習慣用法有條件設置變量的方法?

我可以用幾種不同的方式編寫(爲了簡單起見,我們假設some_valuesome_other_value是常量而不是函數調用)。這裏有一個辦法:

foo = None 
if condition: 
    foo = some_value 
else: 
    foo = some_other_value 

這種做法很好,因爲foo在頂部明確宣佈;但有點冗長。我們可以把它寫更簡單地稱爲:

if condition: 
    foo = some_value 
else: 
    foo = some_other_value 

這節省了我們的任務,但一些程序員能找到的foo的範圍不清楚確切性質。

另一種方式可以是:

foo = some_other_value 
if condition: 
    foo = some_value 

這是更簡潔,節省了我們的一個分支;然而,對於快速閱讀代碼的人來說,這可能會產生誤導。

是風格還是執行速度的首選方法之一? (儘管我懷疑這裏的性能增益會很小,如果不是空的話) 或者是另一種編寫此代碼的推薦方式?

+3

使用'if' /'else'沒有predeclaration ;人們應該知道你的意思。性能並不重要,但我想它也是最快的。 – Ryan

回答

3

foo = some_value if condition else some_other_value

+0

我認爲三元運算符被認爲是「unpythonic」? – bitgarden

+0

我沒有看到這比OP的最後一個例子好。 – jramirez

+5

@bitgarden,如果他們是unpythonic,Guido不會添加它們;-)嚴重的是,簡短易懂的ternarys是Pythonic。他們認爲程序員過度迷戀「單線疾病」的時候就是這樣。 –

0

Python有一個三元運算

foo = ifTrue if predicate else ifFalse 

謂詞是任何布爾值表達式。例如,

def abs(x): 
    return x if x > 0 else -x 

它緊湊,經濟,易於理解。如果謂詞非常複雜,請小心使用謂詞上的parens。

0

對於它的價值,我更喜歡三元運算符:

foo = baz if quux() else bar 

但有一個性能理由,更喜歡一個比其他?

In [15]: %timeit foo = 2 if random.randint(0,1) else 3 
100000 loops, best of 3: 1.69 µs per loop 

In [16]: %%timeit 
    ....: if random.randint(0,1): 
    ....:  foo = 2 
    ....: else: 
    ....:  foo = 3 
    ....: 
100000 loops, best of 3: 1.6 µs per loop 

In [17]: %%timeit foo = 0 
if random.randint(0,1): 
    foo = 2 
else: 
    foo = 3 
    ....: 
1000000 loops, best of 3: 1.59 µs per loop 
1

雖然這可以用三元運算符

foo = some_value if condition else some_other_value 

圭多從來沒有像三元運算符來完成,所以很難被稱爲「Python化」

我認爲這是首選並與每個版本的Python兼容

if condition: 
    foo = some_value 
else: 
    foo = some_other_value 

區別是吐溫說和

foo = some_other_value 
if condition: 
    foo = some_value 

在情況需要some_other_value被計算(通過函數說),你希望避免調用函數不必要