2017-10-17 82 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

我的意思是要么创建一个单独的函数,要么在相同的函数内部进行所需的更改而不创建另一个函数。基本上不需要像前面提到的那样具有其他功能。 –