【问题标题】:Multiple statements in mathematica function数学函数中的多个语句
【发布时间】:2012-01-09 03:45:05
【问题描述】:

我想知道,如何在 Mathematica 中评估函数中的多个语句。
例如

f[x_]:=x=x+5 and then return x^2

我知道这么多可以修改为(x+5)^2,但最初我想在函数中从文件中读取数据并在进行一些数据操作后打印结果。

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    您正在寻找CompoundExpression(短格式;):

    f[x_]:= (thing = x+5 ; thing^2)
    

    括号是必要的,因为; 的优先级很低。

    Szabolcs 叫我,你不能写:

    f[x_]:= (x = x+5 ; x^2)
    

    请参阅 this answer 了解解释和替代方案。


    Leonid,你应该听谁说,thing 应该本地化。我没有在上面这样做,因为我想强调 CompoundExpression 是特别适合您的“然后”构造。正如它所写的那样,这将影响thing 的全局值,这可能是也可能不是您真正想要做的事情。如果不是,请参阅上面链接的答案,以及:

    【讨论】:

    • 哇,30 秒!我会删除我的:)
    • 但前提是您通过使用另一个变量或HoldAll 或避免明显错误的方法更正x=x+5 位!
    • @Szabolcs 哎呀!速度是失败的。
    • 这越来越荒谬了。不知道Mr.Wizard是否发现了时间旅行的秘密。
    • 我认为thing应该本地化。
    【解决方案2】:

    已经有人提到你可以使用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
    

    【讨论】:

    • 非常感谢。我认为这会奏效。我觉得 Mathematica Help 是可悲的,他们应该让它更有用和用户友好......除了我喜欢它。
    • @newGuy 我发现 Mathematica 文档与我见过的大多数其他程序相比非常出色。在文档浏览器中输入tutorial/SequencesOfOperations,然后单击虚拟书按钮。
    【解决方案3】:

    如果要将多个命令分组并输出最后一个,请在它们之间使用分号(;),例如

    f[y_]:=(x=y+5;x^2)
    

    只是不要使用 ;最后一条语句。

    如果您的命令集变得更大,您可能希望使用ModuleBlock 等范围结构。

    【讨论】:

    • 我认为无论程序大小如何,都应该本地化变量,因为程序确实会发展,而未本地化的变量会招来麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多