这是一个广泛的问题。
当我发现自己不得不编写更长更长的脚本时,我发现我的本能是将所有东西都分解成一口大小的函数;然而,这最终导致函数调用函数调用函数调用函数....我想知道我是否完全在想错误的方法。
以下是删节脚本的外观。对不起,这有点做作。
def simple_task_1():
return
def simple_task_2():
return
def simple_task_3():
return
def simple_task_4():
return
def complex_task_1():
simple_task_2()
simple_task_3()
simple_task_4()
return
def startup():
simple_task_1()
complex_task_1()
simple_task_4()
def finish():
# other function calls
return
def main():
startup()
finish()
那么,这是使用函数的正确方法吗?有一个客观的观点,你可以说你在彼此内部进行了太多的函数调用吗?我是否应该为只完成一次的任务制作函数?
答案 0 :(得分:5)
Python有一个“递归”限制。如果你点击那个,那么你可能使用了太多的函数,否则它可能不是什么大问题 - 通常你只能在递归调用函数时达到递归限制(然后通常因为你做错了什么并没有打破你应该有的。)
功能的关键是让你的生活更轻松。如果你发现你的功能太多而你实际上并没有让你的生活变得更轻松,那么这可能就是一个问题。例如:
def add(x,y):
return x+y
这是一个非常毫无意义的功能,但是,如果你想要sinc
,最好避免使用它:
def sinc(x):
return math.sin(x)/x
这可能实际上很有用,因为新函数名称比在其中执行的代码更具描述性。此外,稍后如果您发现需要删除x = 0处的奇点,则可以轻松地将其添加到sinc
。
最终,可读性才是最重要的。如果使用函数使代码更容易阅读,那么它可能是值得的(即使你只是从一个地方调用它并且可以很容易地内联它)。如果你真的关心性能有一些灰色区域(函数执行的时间比内联代码要长一些),但你不应该以此为借口内联难以阅读的内容,除非你能够可靠地演示这是一个性能瓶颈。
答案 1 :(得分:3)
将大事件分解为更小的东西,无论是模块,类,函数等,都是处理软件复杂性的方法。分而治之。
答案 2 :(得分:2)
功能的要点是允许代码重用和更清晰的代码。如果它只是做了一次非常简单的事情,那么这个功能可能是不必要的。
话虽如此,将代码拆分为函数外观并没有明显的错误。如果它让您的生活更轻松或您的代码更具可读性,那么请继续使用它们。
答案 3 :(得分:1)
看起来很好,至少在摘要中。
将程序精确分解为函数取决于函数的作用,但如果最终结果由函数组成,每个函数执行一个任务,该函数完全由函数名称描述,那么你就是正确的轨道。
如果您发现自己拥有大量具有逻辑分组的功能,您可以考虑将它们分成模块。如果你有很多使用相同数据的函数,你可以考虑创建一个类来保存数据和相应的函数。
答案 4 :(得分:1)
你正在做出权衡。通常,按照您的方式对代码进行模块化是一件好事。大多数人做得不够。它增加了代码的可重用性和(通常)可读性。但是可以把它放得太远:如果你发现自己对哪些功能正在调用而感到困惑,并且可读性开始下降,你可能想重新考虑你的设计。
另一件需要注意的事情是调用函数需要大量的开销,这可能很重要。每次调用函数时,都必须创建激活记录并将其放在call stack上。对于非常简单的函数,这种开销是不值得的。例如,如果您正在实现一个需要平均2个数字的排序函数(可能选择快速排序的轴心?),那么仅仅编写(a+b)/2
而不是定义函数会好得多
def avg(a, b):
return (a+b)/2
你问过一个非常好的问题,这肯定是你应该经常思考的问题,但显然很难给出具体的答案。当你编写越来越多的代码时,你会对它有更好的感受。