2016-03-31 18 views
4

這就是我要做的:更Python的方式

  1. 找幾個參數
  2. 基礎上的論點,形成一個字符串
  3. 返回字符串

但是,爲此,我可以看到3種潛在的方式:

def form_statement(subject, verb, object): 
    greetings = "" 
    if subject in ("Paul", "Raj"): 
     greetings = "mister" 
    return "%s %s %s %s" % (subject, verb, object, greetings) 

這樣做的第二個方法是:

def form_statement(subject, verb, object): 
    if subject in ("Paul", "Raj"): 
     greetings = "mister" 
    else: 
     greetings = "" 
    return "%s %s %s %s" % (subject, verb, object, greetings) 

而第三種方式是:

def form_statement(subject, verb, object): 
    greetings = "mister" if subject in ("Paul", "Raj") else "" 
    return "%s %s %s %s" % (subject, verb, object, greetings) 

是否有其他更好的辦法做這樣的事情?現在我選擇第一種方式,因爲獲得問候字符串的「處理」本身就是一個函數,並且使用第三種方法時,該行超過80個字符。

編輯:似乎有人困惑,我問的是哪一個更好用(因爲他們投這個意見爲基礎)。在這裏,我試圖找出是否有更好的方法去做,並舉例說明我可以考慮的事情,以便其他人可能不會給出答案。正如其中一個答案中提到的,我發現在類似的情況下使用字典對我來說更好。

+1

所有的解決方案看起來不錯。首先是「安全」,因爲你總是對'問候'有一些價值。第二個是更容易閱讀,與更復雜的邏輯,你冷靜忘記設置值'問候',並得到未定義的變量錯誤在最後的聲明。最後一個我喜歡最安全,最易讀,最簡短的。 –

回答

1

一種pythonic方法是使用字典來保存主題與他們的相對greetings,然後使用dict.get()方法,該方法還接受第二個參數,如果您的字典中沒有鍵,將返回該參數。

main_dict = {"Paul":"mister", "Raj": "mister"} 

def form_statement(main_dict, subject, verb, object): 
    greetings = main_dict.get(subject, '') 
    return "{} {} {} {}".format(subject, verb, object, greetings) 

當您處理較大的數據集時,此方法將顯示其功能。由於字典使用散列表,其索引順序爲O(1)。也可以爲每個動詞使用不同的結果。

+0

函數的第一個參數爲'subject'的錯字。它應該是'主題'。使用字典的好方法。 – thiruvenkadam

+0

另外,我認爲它應該是'subjects.get(subject,'')' –

+0

@thiruvenkadam我以爲你是在tuple中檢查'verb'的成員船。檢查編輯。 – Kasramvd

0

您可以從應該有「mister」的所有名稱和應該具有相似標題的名稱動態創建一本詞典。然後,只要get該字典的值,或""作爲缺省名稱不存在的情況下。

pairings = [(("Paul", "Raj"), "mister"), (("Anna", "Paula"), "madam")] 
greetings = {name: title for names, title in pairings for name in names} 

def form_statement(subject, verb, object): 
    return "%s %s %s %s" % (subject, verb, object, greetings.get(subject, "")) 
0

您可以將函數參數視爲列表並將它們與空格連接起來。由於args來作爲元組,它必須首先轉換爲列表。

def form_statement(*args): 
    args = list(args) 
    if args[0] in ["Paul", "Raj"]: 
     args.append("mister") 
    return " ".join(args) 

這裏是我的小測試套件(保存在同一文件中上述功能和運行通過$ py.test greet.py

def test_paul(): 
    assert form_statement("Paul", "get", "well") == "Paul get well mister" 


def test_raj(): 
    assert form_statement("Raj", "get", "well") == "Raj get well mister" 


def test_else(): 
    assert form_statement("John", "get", "well") == "John get well" 

編輯:增加了更加明確的一個位版本:

爲@thiruvenkadam正確地指出,原始版本不是很明確,這是一個改進版本的函數。

def form_statement(subject, verb, object): 
    if subject in ["Paul", "Raj"]: 
     return " ".join([subject, verb, object, "mister"]) 
    else: 
     return " ".join([subject, verb, object]) 

兩種實現的小的優勢的上方時,不存在尾部空格 本。

+1

我不太相信這種方法。 「顯式比隱式更好」。 – thiruvenkadam

+0

@thiruvenkadam謝謝。你是對的。 (這個反饋就是我喜歡的答案)。我添加了一些更明確的版本。 –

1

當條件爲真時,第一個版本對greetings進行兩項分配。

另外兩個版本是等價的。 作爲一般規則,應該使用可讀性更高的應用程序。請記住,開發者的時間是一個寶貴的資源。 這就是爲什麼我會說if-else結構總是合適的,三元條件(A if cond else B)是一個單線程的好。

如果您正在增強現有代碼,請保留其樣式。


BTW,最快的查找與一組已達到:name in {"Paul", .... }