- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了让递归的过程更直观,这个例子是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))
我能理解 trace 函数“做什么”,但不明白“怎么做”。具体来说:
1) 为什么我们使用 f.indent 而不是简单的 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() + 1
更复杂。或不?那么,您正在创建一个新函数,它接受原始函数、调用它并打印一些数据。这并不比我们刚才做的更神奇。最大的区别在哪里?
好吧,有一个细节:fib() 是递归的,所以它会调用自身,对吗?没有!不是本身。它调用 fib()
,而您碰巧这样做了:
fib = trace(fib)
哇哦。 fib()
不再是它自己了! 现在 fib()
是 trace(fib)
!因此,当 fib()
进入递归时,它不会调用自身,而是调用我们创建的自身的包装版本。
这就是为什么要这样处理缩进的原因。再看看 trace()
,现在知道它实际上是递归缩进的,这很有意义,不是吗?你想在递归的每一层都有一个缩进,所以递增它,调用 fib()
(记住,现在是 trace(fib)
),然后当我们' 回来(所以递归来了又来,我们即将返回到调用链中的前一步)我们递减它。
如果您仍然看不到它,请尝试将所有功能移至 fib()。忘掉装饰功能吧,那简直令人困惑。
啊。我真的希望这会有所帮助,而且 2000 名比我先回答的人并没有让这个问题过时。
干杯!
(*) Yeah yeah duck typing yadda yadda callable objects bla bla irrelevant.
关于Python 函数跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5537425/
有没有办法在 xdebug 跟踪输出中查看 echo 或 print 函数调用。我正在为我在我的服务器中运行的所有脚本寻找一个全局配置(或一种方法)。 例子: 我希望跟踪输出显示 echo 调用。默
我将应用程序从2.0.0M2升级到了2.1.0,但是当我尝试运行该应用程序时,出现此错误: Note: /Volumes/Info/proyectos-grails/vincoorbis/Member
我如何在共享点中执行日志记录。我想使用跟踪。 以便它记录 12 个配置单元日志。 最佳答案 微软提供了一个例子: http://msdn.microsoft.com/en-us/library/aa9
如何跟踪 eclipse 和 android 模拟器的输出。我习惯于在 Flash 和 actionscript 中这样做。 在 AS3 中它将是: trace('我的跟踪语句'); 最佳答案 您有几
是否可以在 Postgresql 上进行查询跟踪?我在带有 OLEDB 界面的 Windows 上使用 9.0。 此外,我需要它是实时的,而不是像默认情况下那样缓冲... 最佳答案 我假设您的意思是在
第一天 HaxeFlixel 编码器。愚蠢的错误,但谷歌没有帮助我。 如何使用 Haxe、NME 和 Flixel 追踪到 FlashDevelop 输出。它在使用 C++ 执行时有效,但对 Flas
我有一个关于 iPhone 上跟踪触摸的快速问题,我似乎无法就此得出结论,因此非常感谢任何建议/想法: 我希望能够跟踪和识别 iPhone 上的触摸,即。基本上每次触摸都有一个起始位置和当前/移动位置
我正在做我的大学项目,我只想跟踪错误及其信息。错误信息应该与用户源设备信息一起存储在数据库中(为了检测源设备,我正在使用MobileDetect扩展名)。我只想知道应该在哪里编写代码,以便获得所有错误
我正在 Azure 中使用多个资源,流程如下所示: 从 sftp 获取文件 使用 http 调用的数据丰富文件 将消息放入队列 处理消息 调用一些外部电话 传递数据 我们如何跟踪上述过程中特定“运行”
在我的 WCF 服务中,当尝试传输大数据时,我不断收到错误:底层连接已关闭:连接意外关闭 我想知道引发此错误的具体原因,因此我设置了 WCF 跟踪并可以读取 traces.svclog 文件。 问题是
我的目标是在 Firebase Analytics 中获取应用数据,在 Google Universal Analytics 中获取其他自定义数据和应用数据。 我的问题是我是否在我的应用上安装 Fir
我正在 Azure 中使用多个资源,流程如下所示: 从 sftp 获取文件 使用 http 调用的数据丰富文件 将消息放入队列 处理消息 调用一些外部电话 传递数据 我们如何跟踪上述过程中特定“运行”
我们正在考虑跟踪用户通过 Tridion 管理的网站的旅程的要求,然后能够根据此行为将此用户识别为“潜在客户”,然后如果他们在之后没有返回,则触发向此用户发送电子邮件X 天。 SmartTarget
在 Common Lisp 中,函数(跟踪名称)可用于查看有关函数调用的输出。 如果我的函数是用局部作用域声明的,我如何描述它以进行跟踪? 例如,如何跟踪栏,如下: (defun foo (x)
有什么方法可以检测文本框的值是否已更改,是用户明确更改还是某些 java 脚本代码修改了文本框?我需要检测这种变化。 最佳答案 要跟踪用户更改,您可以添加按键处理程序: $(selector).key
int Enable ( int pid) { int status; #if 1 { printf ( "child pid = %d \n", pid ); long ret =
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有以下测试代码: #include int main(void) { fprintf(stderr, "This is a test.\n"); int ret = open("s
我有一个闭源 Java 应用程序,供应商已为其提供了用于自定义的 API。由于我没有其他文档,我完全依赖 API 的 javadoc。 我想跟踪特定用例在不同类中实际调用的方法。有什么办法可以用 ec
我正在学习 PHP。我在我的一个 php 函数中使用了如下所示的 for 循环。 $numbers = $data["data"]; for ($i = 0;$i send($numbers[
我是一名优秀的程序员,十分优秀!