Несколько операторов в функции Mathematica - PullRequest
15 голосов
/ 29 ноября 2011

Я хотел знать, как оценить несколько операторов в функции в Mathematica.
Например,

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

Я знаю, что это можно изменить как (x+5)^2, но изначально я хотел прочитать данныеиз файла в функции и распечатайте результат после некоторой обработки данных.

Ответы [ 3 ]

17 голосов
/ 30 ноября 2011

Если вы хотите сгруппировать несколько команд и вывести последние, используйте точку с запятой (;) между ними, например

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

Просто не используйте a;для последнего оператора.

Если ваш набор команд увеличивается, вы можете использовать такие объемные структуры, как Модуль или Блок .

7 голосов
/ 30 ноября 2011

Вы ищете CompoundExpression (краткая форма ;):

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

Скобки необходимы из-за очень низкого приоритета ;.

Поскольку Сабольч призвал меня, вы не можете написать:

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

См. этот ответ для объяснения и альтернатив.


Леонид , которого вы должны слушать, говорит, что thing должен быть локализован. Я не делал этого выше, потому что хотел подчеркнуть CompoundExpression как конкретное соответствие для вашей конструкции «а потом». Как написано, это повлияет на глобальное значение thing, которое может или не может быть тем, что вы действительно хотите сделать. Если это не так, см. Ответ, указанный выше, а также:

6 голосов
/ 30 ноября 2011

Несколько человек уже упоминали, что вы можете использовать CompoundExpression:

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

Однако, если вы используете ту же самую переменную x в выражении, что и в аргументе,

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

тогда вы получите ошибки при оценке функции с помощью числа.Это связано с тем, что := по существу определяет замену переменных шаблона из lhs, то есть f[1] оценивается как (неправильное) (1 = 1+5; 1^2).

Итак, как сказал Шурд,используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...