【发布时间】:2012-01-09 03:45:05
【问题描述】:
我想知道,如何在 Mathematica 中评估函数中的多个语句。
例如
f[x_]:=x=x+5 and then return x^2
我知道这么多可以修改为(x+5)^2,但最初我想在函数中从文件中读取数据并在进行一些数据操作后打印结果。
【问题讨论】:
我想知道,如何在 Mathematica 中评估函数中的多个语句。
例如
f[x_]:=x=x+5 and then return x^2
我知道这么多可以修改为(x+5)^2,但最初我想在函数中从文件中读取数据并在进行一些数据操作后打印结果。
【问题讨论】:
您正在寻找CompoundExpression(短格式;):
f[x_]:= (thing = x+5 ; thing^2)
括号是必要的,因为; 的优先级很低。
Szabolcs 叫我,你不能写:
f[x_]:= (x = x+5 ; x^2)
请参阅 this answer 了解解释和替代方案。
Leonid,你应该听谁说,thing 应该本地化。我没有在上面这样做,因为我想强调 CompoundExpression 是特别适合您的“然后”构造。正如它所写的那样,这将影响thing 的全局值,这可能是也可能不是您真正想要做的事情。如果不是,请参阅上面链接的答案,以及:
【讨论】:
HoldAll 或避免明显错误的方法更正x=x+5 位!
thing应该本地化。
已经有人提到你可以使用CompoundExpression:
f[x_] := (y=x+5; y^2)
但是,如果您在表达式中使用与参数中相同的变量 x,
f[x_] := (x=x+5; x^2)
那么在使用数字评估函数时会出错。这是因为:= 本质上定义了来自 lhs 的模式变量的 替换,即 f[1] 的计算结果为(不正确的)(1 = 1+5; 1^2)。
所以,正如 Sjoerd 所说,使用 Module(或 Block 有时,但 this one has caveats!)来本地化函数变量:
f[x_] := Module[{y}, y=x+5; y^2]
最后,如果你需要一个修改其参数的函数,那么你可以设置属性HoldAll:
Clear[addFive]
SetAttributes[addFive, HoldAll]
addFive[x_] := (x=x+5)
然后将其用作
a = 3;
addFive[a]
a
【讨论】:
tutorial/SequencesOfOperations,然后单击虚拟书按钮。