Python和函数递归中的函数
假设我有这样的示例代码Python和函数递归中的函数,python,recursion,Python,Recursion,假设我有这样的示例代码 def foo(n): def bar(): return -1 if n = 0: return 0 else: return foo(n+bar()) 我假设每次递归调用foo时,它都会创建一个新的bar实例。然而,这看起来像是可以用python(或任何其他语言)优化的东西,但我找不到任何东西说明它是否已经为此进行了优化 我在foo中定义bar的原因是我试图对用户隐藏bar,而python的bar()或u bar
def foo(n):
def bar():
return -1
if n = 0:
return 0
else:
return foo(n+bar())
我假设每次递归调用foo时,它都会创建一个新的bar实例。然而,这看起来像是可以用python(或任何其他语言)优化的东西,但我找不到任何东西说明它是否已经为此进行了优化
我在foo中定义bar的原因是我试图对用户隐藏bar,而python的bar()或u bar()的“请先生不要使用这个亲爱的用户”让我很恼火,因为我受过非脚本语言的训练。
def
是python中的一个可执行语句(class
)。每次调用foo()
时,都会为bar
创建一个新的函数对象,但成本非常低。它只检索已编译的代码对象,并将其包装到新的函数对象中。人们对此压力太大;-)通常,为了使闭包正常工作,并捕获适当的默认参数,必须这样做。您是对的,在许多情况下,这可以稍微优化一下,但CPython实现并不麻烦。真正的问题是您试图对用户隐藏内容。这不是Python的做事方式。如果要将函数设置为“private”,请不要将其名称包含在模块的\uuuuu all\uuuu
全局变量中。Python没有“真正的”私有函数。如果用户想要访问bar
,那么打他们耳光并说他们做不到是没有意义的。我在foo中定义bar的理由是我试图对用户隐藏bar,python的“请先生,不要使用这个亲爱的用户”这让我很恼火,因为我接受过非脚本语言的培训。
如果您使用的是解释语言,他们无论如何都可以访问您的代码。为什么你觉得有必要把它隐藏得如此彻底。如果一个用户可以进入一个私有方法并修改它,而不必突然通过designedforroute,那么程序流就不再有意义了。EI的人喜欢说“哦,这是一个计数器。我希望它完成的速度是我不清楚为什么要等待的速度的两倍”而没有意识到它不仅仅是一个计数器。@user2309351:是的,的确如此,如果用户干扰了您的实现,他可能(或不会)破坏某些东西。那又怎么样?这是你的问题吗?不管怎样,愚蠢的人都会做愚蠢的事,那为什么还要麻烦呢?不管怎样:Python并不是为了防白痴而设计的,所以不要浪费时间与该语言作斗争,只需按原样使用它。