2008-12-06 63 views
7

我剛剛在一些開放源碼的Python中遇到了這個習慣用法,我my嚥了我的飲料。這是成語pythonic嗎? (someBool和「True Result」或「False Result」)

不是:

if isUp: 
    return "Up" 
else: 
    return "Down" 

甚至:

return "Up" if isUp else "Down" 

代碼閱讀:

return isUp and "Up" or "Down" 

我可以看到這是同樣的結果,但是這是一個典型的成語在Python中?如果是這樣,是否有一些性能快速跑?或者它只是一次需要代碼審查?

回答

17

在編寫和實施PEP 308之前,「a和b或c」成語是表達三元算術(如果在Python中)的規範方式。這個成語不符合「b」的答案本身就是假的;支持一般情況下,你可以寫

return (a and [b] or [c])[0] 

拼寫它的另一種方法

return (b,c)[not a] 

其中,引進的布爾類型的,可以改寫爲

return (c,b)[bool(a)] 

(在不明確的情況下:如果a不知道是bool,則轉換爲bool,非操作符是必要的)

今天,如果事物必須是表達式,那麼應該使用條件表達式語法;否則我建議使用if語句。

+4

另一種語法與和/或方法或三元運算符有一個不同之處 - 兩個值都始終進行評估。如果它們只是變量就沒有什麼大不了的,但如果存在函數調用(特別是帶有副作用),它將會產生變化。 – Brian 2008-12-06 11:00:27

0

這段代碼對我的口味來說是一個非常富有和聰明的東西,但我想這本身沒有任何問題。我認爲這實際上只是一個「讓所有人都適合」的病例。

我個人會選擇第一種形式。

-1

不,它不是。

前些日子我有一個不知何故similar question

如果結構

val if cond else alt 

不是很受歡迎(至少由SO社區)和首選之一是:

if cond: 
    val 
else: 
    alt 

你可以得到自己的結論。 :)

-1

哎呀。根本不可讀。對我而言,pythonic意味着易於閱讀。

return isUp and "Up" or "Down" 

聽起來你會在Perl中做的事情。

相關問題