web-dev-qa-db-ja.com

数学関数の複数のステートメント

Mathematicaの関数で複数のステートメントを評価する方法を知りたかったのです。
例えば。

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

これは(x+5)^2として変更できることは知っていますが、元々は関数内のファイルからデータを読み取り、データ操作を行った後に結果を出力したかったのです。

15
mrig

複数のコマンドをグループ化して最後のコマンドを出力する場合は、次のようにそれらの間にセミコロン(;)を使用します。

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

;を使用しないでください。最後のステートメント。

コマンドのセットが大きくなる場合は、 ModuleBlock などのスコープ構造を使用することをお勧めします。

17

あなたが探しているのは CompoundExpression (短縮形;):

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

;の優先順位が非常に低いため、括弧が必要です。

Szabolcsが私を呼んだように、あなたは書くことができません:

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

説明と代替案については、 この回答 を参照してください。


Leonid 、あなたが聞くべき人は、thingをローカライズする必要があると言います。 CompoundExpressionを「andthen」コンストラクトに特に適合するものとして強調したかったので、上記ではこれを行いませんでした。書かれているように、これはthingのグローバル値に影響します。これは、実際に実行したいことである場合とそうでない場合があります。そうでない場合は、上記のリンク先の回答と、次の両方を参照してください。

7
Mr.Wizard

何人かの人々はあなたが使うことができるとすでに述べました CompoundExpression

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

ただし、式で引数と同じ変数xを使用すると、

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

次に、数値を使用して関数を評価するときにエラーが発生します。これは、:=が基本的にlhsからのパターン変数のreplacementを定義するためです。つまり、f[1]は(正しくない)と評価されます。 (1 = 1+5; 1^2)

したがって、Sjoerdが言ったように、Module(またはBlockを使用することもありますが、 これには注意事項があります !)を使用して関数変数をローカライズします。

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
6
Szabolcs