在函数python中定义函数是否合适?

时间:2017-10-17 11:49:01

标签: python

以下是我在项目中编写的代码。

编写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(item)"函数只在" get_list_of_university_towns()"中被调用一次。并且永远不会再使用。我个人认为在函数内部定义它会更容易理解。但是,我几乎没有在其他人的项目中看到这种代码。

那么,我该如何编写这段代码?

4 个答案:

答案 0 :(得分:6)

在函数

中编写函数是Pythonic吗?

是的,确实如此。实际上,为了不污染模块命名空间,它更多的Pythonic在外面做它。

我该如何编写这段代码?

其他功能中的功能定义选项有效。另一种Pythonic方式是使用匿名lambda函数:

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

优化

由于它已被淹没,现在您说它是熊猫的数据帧意味着该函数将被多次调用,您应该编译表达式或使用str.replace()而不是{{1} }:

re.sub()

答案 1 :(得分: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

答案 2 :(得分:0)

如果需要某项功能,我同意Adirio的答案。

或者,您可以考虑一个功能是否真的有必要,如果它只使用一次。 如果可以迭代uni_towns [' State'],这将实现相同的目标,并且在我看来更具可读性:

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

答案 3 :(得分:-1)

您无需为要实现的目标创建其他功能。在外部创建一个函数是更好的,这样你就可以在其他函数中调用它,而不是将它的使用限制在它的写入位置。