首页 / PYTHON / Python函数跟踪
Python函数跟踪
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python函数跟踪,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2690字,纯文字阅读大概需要4分钟。
内容图文
![Python函数跟踪](/upload/InfoBanner/zyjiaocheng/760/56014c56c2a6479b9d81b29af39f7c4b.jpg)
为了使递归过程更加明显,此示例为given:
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n - 1) + fib(n - 2)
def trace(f):
f.indent = 0
def g(x):
print('| ' * f.indent + '|--', f.__name__, x)
f.indent += 1
value = f(x)
print('| ' * f.indent + '|--', 'return', repr(value))
f.indent -= 1
return value
return g
fib = trace(fib)
print(fib(4))
我能理解跟踪功能的“内容”,但我不明白“如何”.特别:
1)为什么我们有f.indent而不是简单的缩进= 0(好吧,我看到那不起作用,但我不明白为什么).
2)我不明白怎么做
print('| ' * f.indent + '|--', 'return', repr(value))
在找到值之前不会执行.
有人会善意地解释整件事吗?
解决方法:
呼.好的,我们走吧!
首先,你有一个功能,任何功能.在你的情况下,那是fib().现在,在python中,函数也是对象,它们可以在运行时创建,所以我们实际上可以这样做:
def give_me_a_function():
def f(x):
return x
return f
(警告:对于此答案的其余部分,“功能”这个词的可怕重复).
好吧,我们定义了一个不带参数和返回的函数,……另一个函数?那就对了!功能是对象!您可以在运行时创建它们!所以我们在原始函数中定义了第二个函数,并返回它,就像我们对任何其他对象一样.
现在,让我们做一些更复杂的事情:
def alter(other_function):
def altered(x):
return other_function(x) + 1
return altered
这是什么东西?
好吧,我们定义了一个函数,alter().就像上面的例子一样,它在运行时创建一个函数并将其作为对象返回.我们已经涵盖了很多.
现在,如果函数是对象,并且可以创建并返回,为什么你不能将一个作为参数传递?打电话给它,你就是它!这是正确的:alter()接受一个函数作为参数(*),并使用它.
使用alter()所需要的只是将上述魔法与这个新魔法结合起来:我们接收一个函数作为参数,动态创建另一个使用它的函数,并返回这个新的函数对象!
我们来试试吧.
>>> def f(x):
... return 2*x
>>> new_function = alter(f)
>>> f(2)
4
>>> new_function(2)
5
它去了! alter()接受我的f(),创建一个返回f()1的新函数,并将其作为返回值提供给我.我将它分配给new_function,并且我有一个新的,自制的,运行时创建的函数.
(我确实警告过你使用’功能’一词,不是吗?)
现在,到你的代码.你做的事情比f()更复杂.或者不是吗?好吧,你正在创建一个新函数,它接受原始函数,调用它并打印一些数据.这并不比我们刚刚做的那么神奇.哪个区别很大?
好吧,有一个细节:fib()是递归的,所以它自称,对吧?不!不是自己.它调用fib(),你碰巧这样做:
fib = trace(fib)
个唱. fib()本身不再存在!现在fib()是痕迹(纤维)!因此,当fib()进入递归时,它不会调用自身,而是调用我们创建的自身的包装版本.
这就是为什么缩进就像这样处理的原因.再看一下trace(),现在知道它实际上是递归缩进的,这是有意义的,不是吗?你希望每个递归级别都有一个缩进,所以递增它,调用fib()(记住,现在是trace(fib)),然后当我们回来时(所以递归来了,我们’重新回到调用链中的上一步)我们减少它.
如果您仍然没有看到它,请尝试将所有功能移至fib().忘记装饰功能,这简直令人困惑.
啊.我真的希望这会有所帮助,而那些击败我的答案的那些人并没有把这个问题弄得过时了.
干杯!
(*)是啊是的鸭子打字yadda yadda可调用对象bla bla无关紧要.
内容总结
以上是互联网集市为您收集整理的Python函数跟踪全部内容,希望文章能够帮你解决Python函数跟踪所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。