以下是我在项目中编写的代码。
编写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()"中被调用一次。并且永远不会再使用。我个人认为在函数内部定义它会更容易理解。但是,我几乎没有在其他人的项目中看到这种代码。
那么,我该如何编写这段代码?
答案 0 :(得分:6)
是的,确实如此。实际上,为了不污染模块命名空间,它更多的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)
您无需为要实现的目标创建其他功能。在外部创建一个函数是更好的,这样你就可以在其他函数中调用它,而不是将它的使用限制在它的写入位置。