2017-10-17 84 views
2

下面是我在一個項目中編寫的代碼。在函數python中定義函數是否很好

哪一個是一個更好的寫蟒蛇?

def get_list_of_university_towns(): 
    .... 
    def parse_state(item): 
     return re.sub('\[edit\]', '', item) 
    uni_towns['State'] = uni_towns['State'].apply(parse_state) 
    return uni_towns 

或者:

def parse_state(item): 
    return re.sub('\[edit\]', '', item) 
def get_list_of_university_towns(): 
    .... 
    uni_towns['State'] = uni_towns['State'].apply(parse_state) 
    return uni_towns 

這種 「parse_state(項目)」 功能只在調用一次 「get_list_of_university_towns()」,將再次從未使用過。我個人認爲在函數內定義它會更容易理解。但是,我在其他人的項目中幾乎看不到這種代碼。

所以,我應該怎麼寫這段代碼?

+2

或者你可以定義一個lambda函數內聯 – khelwood

+1

這真的取決於你使用的情況。如果你會發現函數parse_state在代碼的其他位置很有用,那麼第二種情況更有意義。 –

+1

如果您在其他地方不需要'parse_state',我會投票在'get_list_of_university_towns'內定義它或使用lambda函數。 – timgeb

回答

6

Pythonic在函數內寫funciotns

是的。實際上,爲了不污染模塊命名空間,它在外部做了更多Pythonic。

我應該如何寫這篇文章的代碼?

在其他函數中使用函數定義的選項有效。另一種Python的方式是使用匿名lambda函數:

def get_list_of_university_towns(): 
    .... 
    uni_towns['State'] = uni_towns['State'].apply(lambda item: re.sub('\[edit\]', '', item)) 
    return uni_towns 

優化

因爲它已被sugested,而現在,你說這是熊貓的數據幀是什麼意思,該函數將被調用一次以上,您應該編譯expresion或使用str.replace()代替re.sub()

def get_list_of_university_towns(): 
    .... 
    uni_towns['State'] = uni_towns['State'].apply(lambda item: item.replace('[edit]', '')) 
    return uni_towns 
+0

我不同意第二部分;在這裏,'lambda'表達式是否比命名函數更好,這在某種程度上是個人偏好的問題。 – chepner

+0

@chepner編輯這兩個選項的值相同。我試圖避免根據個人喜好來回答我的答案,但有時他們會溜進去。 – Adirio

0

兩者都是罰款。第一個更清潔,因爲您不會污染模塊名稱空間,而其名稱不會在別處使用。

與第一表格應該是稍快爲parse_state是一個局部變量,當它被調用時,如果它是一個循環內使用尤其重要。在另一個函數中定義函數沒有運行時成本。在運行時,這是一個簡單的任務。

但是,如果它是一個循環內使用,你也應該在編譯的模塊範圍內的正則表達式:

_state_re = re.compile('\[edit\]') 
def get_list_of_university_towns(): 
    ... 
    def parse_state(item): 
     return _state_re.sub('', item) 
    uni_towns['State'] = uni_towns['State'].apply(parse_state) 
    return uni_towns 
0

我Adirio的答案達成一致,如果需要的功能。

或者,你可以考慮功能是否真的有必要,如果它只能使用一次。 如果可以遍歷uni_towns [「國家」],這將達到相同的,在我看來更具可讀性:

def get_list_of_university_towns(): 
    .... 
    for state in uni_towns['State']: 
     state = re.sub('\[edit\]', '', state) 
    return uni_towns 
+0

您沒有關於'uni_town ['State']'的信息,您只知道它具有接受函數作爲參數的apply方法。 – Adirio

+0

沒錯,我假設它是一串字符串,內置的可迭代應用函數 –

+0

而通過一個數組,你正在從字面上挖掘熊貓的數組嗎?我認爲這是一個假設,不應該在未發表評論之前提出要求。 – Adirio

-1

您無需再創建一個功能你正在嘗試實現。在外部創建函數更好,這樣您就可以在其他函數中調用它,而不是將它的使用僅限制在寫入的位置。

+0

如果你想在不創建另一個函數的情況下做到這一點,你需要更多關於'uni_town ['State']是什麼的信息。在外面創建一個函數並不是更好,你正在污染模塊命名空間,他已經說過它不會在其他地方被調用。 – Adirio

+0

我的意思是要麼創建一個單獨的函數,要麼在相同的函數內部進行所需的更改而不創建另一個函數。基本上不需要像前面提到的那樣具有其他功能。 –