Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和函数递归中的函数_Python_Recursion - Fatal编程技术网

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并不是为了防白痴而设计的,所以不要浪费时间与该语言作斗争,只需按原样使用它。