2013-01-10 36 views
0

例如,如果我的代碼:更優雅的方式來寫,如果其他人在python

class Example(): 

    def a(self): 
     return 'Buy' 

    def b(self): 
     if (self.a() == 'Buy'): 
      return 'BUY SET' 
     elif (self.a() == 'Sell'): 
      return 'SELL SET'' 

o = Example() 
value = o.b() 
print value 

有沒有我可以寫函數B(個體經營)更優雅/ Python的方式?

+1

刪除不需要的parens並在比較之前存儲'result = self.a()'(個人偏好)。有一個else子句可能也有用。 – mmgp

+3

我認爲,作爲一個開始,「更優雅/ pythonic」的事情將是使用有意義的名字。 – 2013-01-10 23:58:41

回答

14

首先,擺脫不必要的括號;他們只是使你的代碼更難的結構如下:

def b(self): 
    if self.a() == 'Buy': 
     return 'BUY SET' 
    elif self.a() == 'Sell': 
     return 'SELL SET'' 

然後刪除雜散',導致它提出一個SyntaxError

def b(self): 
    if self.a() == 'Buy': 
     return 'BUY SET' 
    elif self.a() == 'Sell': 
     return 'SELL SET' 

下,不叫self.a()兩次。雖然這是無害的在這裏,在實際的代碼有一個非常好的機會,它就會有副作用,或者至少需要足夠長的時間,你是在浪費時間:

def b(self): 
    order = self.a() 
    if order == 'Buy': 
     return 'BUY SET' 
    elif order == 'Sell': 
     return 'SELL SET' 

接下來,如果a回報什麼,但'Buy''Sell',你要返回None。那真的是你想要的嗎?你如何解決這個問題取決於你實際需要什麼。例如,您可能希望:

def b(self): 
    order = self.a() 
    if order == 'Buy': 
     return 'BUY SET' 
    elif order == 'Sell': 
     return 'SELL SET' 
    else: 
     raise ValueError("Unexpected order type '{}'".format(order)) 

或許:

def b(self): 
    order = self.a() 
    if order == 'Buy': 
     return 'BUY SET' 
    else: # We know there's nothing else it could be 
     return 'SELL SET' 

如果有兩個以上的可能性,這可能是值得將東西放入一個dict,而不是使用if/elif鏈,或編寫動態代碼。示例:

def b(self): 
    return {'Buy': 'BUY SET', 'Sell': 'SELL SET', 'Trade': 'TRADE SET', 
      'Barter': 'BARTER SET', 'Steal': 'STEAL SET'}[self.a()] 

def b(self): 
    return '{} SET'.format(order.upper()) 

請注意,這些爲上一個問題做出了不同的選擇。對於未知值,dict版本將產生KeyError; format版本會將任何內容視爲有效。

此外,如果您使用dict,您可能希望將其移動到b函數之外,例如,使其成爲類屬性(這也鼓勵您給它一個不錯的名稱)。

但是,只有兩種選擇,我認爲你有什麼更清晰。

最後,給函數無意義的單字母名稱並不是很pythonic;它會更好地做這樣的事情:

def get_formatted_order(self): 
    order = self.calculate_order() 
    if order == 'Buy': 
     return 'BUY SET' 
    elif order == 'Sell': 
     return 'SELL SET'' 
+1

但是,如果'a'只能返回''Buy''或''Sell'',那麼使用'if-else'子句而不是'if-elif'子句會更好。 – Volatility

+0

@Volatility:以「接下來,如果'a'返回......」開頭的段落是爲了解決這個問題。但也許它應該更明確?我會嘗試重寫它;謝謝。 – abarnert

+0

Geeze。已經下了演講講臺^^(一個很好的全面答案。) – 2013-01-11 00:06:55

4

您可以使用字典:

def b(self): 
    return {'Buy': "BUY SET", 'Sell': "SELL SET"}.get(self.a()) 

或書面的更清楚:

def b(self): 
    d = {"Buy": "BUY SET", 
     "Sell": "SELL SET"} 
    return d.get(self.a()) 
+2

只有2個選擇,我會猶豫稱這更「優雅/ pythonic」.. – 2013-01-10 23:58:12

+0

@Marcin這就是爲什麼我用'get' - 默認爲'None' – l4mpi

+0

這是短暫的,看起來沒問題,但你是沒有必要的啓動一本字典。 – ajon

1

爲什麼不只是緩存它呢?

def b(self): 
    a = self.a() 

    if a == 'Buy': 
     return 'BUY SET' 
    elif a == 'Sell': 
     return 'SELL SET'' 

我會給你的變量清晰的名字以及。 ab根本沒有描述性。

2

雖然abarnet的答案肯定是最確鑿,對於給定的代碼,這也將工作:

def b(self): 
    return self.a().upper() + " SET" 

但是,這使得很多不是非常普及的假設。

+0

這相當於我的答案中的一個選項,除了我使用'format'而不是連接。將它拉出來作爲單獨的答案有助於突出它作爲一種可能性,但我不確定它是否值得突出顯示。 – abarnert

1

畢竟所有酷推薦abarnert製造here你可以嘗試一個更多的技巧來縮短你的代碼。

def get_formatted_order(self): 
    order = self.calculate_order()   
    return 'BUY SET' if order == 'Buy' else 'SELL SET' 

這是三元運算符的pythonic形式。如果訂單評估爲「購買」功能將返回「購買設置」。在相反的情況下,它會返回'賣出套'

相關問題