【发布时间】:2013-09-16 00:05:19
【问题描述】:
假设我在 Mathematica 中定义了以下函数:
f[list_] := Map[Prime[Sow[#]] &, list];
它输出一个素数列表,这样如果输入列表在位置 i 有 n,那么输出列表将在位置 i 包含第 n 个素数。例如,
In[2]:= f[{1, 3, 4}]
Out[2]= {2, 5, 7}
现在,如果出于某种原因(调试等),我想检查将哪些值输入Prime 函数。因为函数里有Sow命令,我可以做
In[3] := Reap[f[{1, 3, 4}]]
Out[3] := {{2, 5, 7}, {{1, 3, 4}}}
有关播种/收割的更多详细信息,请参阅Wolfram Documentation。我的问题是,是否存在与 Mathematica 的 Sow and Reap 功能等效的自然 Python? 特别是,有没有一种方法可以在不从您想要执行的 python 函数中显式返回额外内容的情况下执行此类操作它是,编写第二个几乎相同但返回额外内容的第二个python函数,还是使用全局变量?
【问题讨论】:
-
你不能用函数来做(不使用全局变量)。您可以做的是编写一个以某种方式存储中间结果的类,然后稍后再读取它们。不过,没有内置工具。
-
顺便说一下,在这里使用全局变量是否是错误的并不完全清楚。如果我对这些文档的理解正确,Mathematica sow/reap 会操纵一种全局堆栈。
-
是的,也许这是正确的思考方式。只要堆栈包含有关每只母猪被调用的函数的信息,就可以以这种方式对其进行建模。也就是说,Sow/Reap 操作的变量必须表现得好像它是每个函数调用的本地变量。
-
它甚至需要跟踪吗?如果您从使用
sow的函数中获得收益并且该函数调用另一个也使用sow的函数,我无法从 Mathematica 文档中得知会发生什么。这些值是全部堆积在一个收获列表中,还是以某种方式嵌套? -
sow 将结果传递到最近的封闭 reap[].. 一个 reap 下的多头母猪会导致值列表(数组)的列表。我不认为这个问题真的需要实现所有的复杂性。
标签: python wolfram-mathematica