Детализация
Аргументы, которые могут быть пропущены
С помощью шаблона можно также описать, что делать, если аргумент функции отсутствует.
Шаблон "x_:v" - если аргумент пропущен, то его значение по умолчанию ( Default ) равно v. Шаблон "x_h:v" - то же с указанием типа.
Шаблон "x_." - если аргумент пропущен, то его значение по умолчанию ассоциировано с определяемой функцией, а именно, если имя этой функции f, то умолчание хранится в Default[f] (отметим, что Default[f] нужно задавать до определения функции):
In[126]:=f[x_; 10] := x2; f[5] f[5, 7] f[] Out[127] = 25 Out[128] = f [5, 7] Out[129] = l00 In[130]:= Clear [f ] Default[f] = 9; f[x_.] : = x2; f[5] f[5, 7] f[] Out[133] = 25 Out[134] = f [5, 7] Out[135] = 81
Команда Clear не очищает значение Default. Чтобы очистить его, воспользуйтесь либо Default[f] =., либо ClearAll[f] :
In[136]:=Clear[f] Definition[f] Out[137] = Default[f]=9 In[138]:=Default[f] =. Definition[f] Out[139]=Null In[140]:=Default[f]=9; f[x_]:=x2 ; Definition[f] ClearAll[f]; Definition[f] Out[142] = f[x_]:=x2 Default[f]=9 Out[144]=Null
Выбор объектов по шаблону
Выбор из списка объектов {e1,e2,...} по шаблону pattern можно осуществить с помощью команды Cases[{e1,e2,...},pattern]:
In[145]:=Cases [{l, {2, x2}, y3 , 2}, _^_] Out[145]={y3}
Выбор из объектов {e1,e2,...} по шаблону pattern на уровнях, заданных levelspec, - командой Cases[{e1,e2,...},pattern,levelspec]:
In[146]:=Cases [{l, {2, x2}, у3, 2}, _^_, {2}] Out[146]={x2}
Команда Cases[expr,pattern,levelspec] применима к произвольным выражениям expr:
In[147]:= Cases [fexp[l, {2, x2} , y3 , 2, g[y, z1/2]], _^_, {0, Infinity}] Out[147]={x2, y3, √z } In[148] :=Clear [f, tint, fobj , fexp, fseq, fnulseq]
Опции
С опциями мы сталкивались выше, настраивая вид графики. Здесь мы разберемся с тем, как они устроены.
Каждому объекту s можно приписать опции rhs, выполнив команду Options[s] = rhs:
In[l49]:=Options[s]={a, b, c} Out[149]={a, b, c}
Меняя Options, можно управлять процессом вычисления выражения. В приведенном ниже примере команда MemberQ[Options[s], a] проверяет, входит ли объект a в список Options[s] :
In[150]:=s[x_]:=If[MemberQ [Options [s], a] , Print["a входит в Options"], Print["a HE входит в Options"]] s[2] а входит в Options In[152]:= Options[s]={b,с}; s[2] a HE входит в Options
У многих встроенных функций и констант имеются заранее заданные опции. Обычно они имеют вид правил . Чтобы посмотреть опции у объекта s, выполните команду Options[s]:
In[154]:=Options[Plot] Out[154] = {AlignmentPoint -> Center, AspectRatio -> 1/(GoldenRatio), Axes -> True, AxesLabel -> None, AxesOrigin -> Automatic, AxesStyle -> {}, Background -> None, BaselinePosition -> Automatic, BaseStyle -> {}, ClippingStyle -> None, ColorFunction -> Automatic, ColorFunctionScaling ->True, ColorOutput ->Automatic, ContentSelectable -> Automatic, CoordinatesToolOptions -> Automatic, DisplayFunction : -> $DisplayFunction, Epilogs {}, Evaluated -> Automatic, EvaluationMonitor -> None, Exclusions -> Automatic, ExclusionsStyle -> None, Filling -> None, FillingStyle -> Automatic, FormatType : -> TraditionalForm, Frame -> False, FrameLabel -> None, FrameStyle -> {}, FrameTicks -> Automatic, FrameTicksStyle -> {}, GridLines -> None, GridLinesStyle -> {}, ImageMargins -> 0., ImagePadding -> All, ImageSize -> Automatic, ImageSizeRaw -> Automatic, LabelStyle -> {}, MaxRecursion -> Automatic, Mesh -> None, MeshFunctions -> {Bl &}, MeshShading -> None, MeshStyle -> Automatic, Method -> Automatic, PerformanceGoal : -> $PerformanceGoal, PlotLabel -> None, PlotPoints -> Automatic, PlotRange -> {Full, Automatic}, PlotRangeClipping -> True, PlotRangePadding -> Automatic, PlotRegion -> Automatic, PlotStyle -> Automatic, PreservelmageOptions -> Automatic, Prologs -> {}, RegionFunction -> (True s) , RotateLabel -> True, Ticks -> Automatic, TicksStyle -> {}, WorkingPrecision -> MachinePrecision}
Чтобы посмотреть значение конкретной опции объекта s, выполните команду Options[s,name], где name - имя требуемой опции:
In[155]:=Options[Plot,Plotstyle] Out[155]={PlotStyle -> Automatic} In[156]:=Plot[{Sin[x],Cos[x]},{x,0,1}]
Чтобы изменить опции объекта s с именами name1, name2,..., выполните команду :
In[157]:=SetOptions [Plot, PlotStyle -> Dashing [{. 05 , .01}]]; Options[Plot, PlotStyle] Out[158]={PlotStyle ->Dashing[{0.05,0.01}] } In[159]:=Plot[{Sin[x], Cos[x]}, {x,0,1}]
In[160]:=SetOptions [Plot, PlotStyle -> abc] ; Options[Plot, PlotStyle] Plot[{Sin [x] , Cos[x]}, {x, 0, 1}] Out[l6l]={PlotStyle -> abc}
Graphics: :gprim: abc was encountered where a Graphics primitive or directive was expected. >> Graphics: :gprim: abc was encountered where a Graphics primitive or directive was expected. >>
Для опций, определенных в виде правил замены, имеются удобные способы их использования и изменения в пользовательских функциях. Выражение OptionsPattern[] используется в качестве последовательности опций определяемого выражения. Выражение OptionValue[name] - значение опции name (правая часть выражения ) из списка опций OptionsPattern[]:
In[16З]:=Clear[s] Options[s]={u ->u0,v->v0}; s[x_,OptionsPattern[]]:= {x,OptionValue[u],OptionValue[v]} s[l] s[l,u->4] s[1,u->4,v->7] s[l] Out[166]={1, u0, v0} Out[167]={1, 4, v0} Out[168]={1, 4, 7} Out[169]={1, u0, v0}
Список OptionsPattern[s] позволяет использовать в качестве аргумента выражения f опции другого выражения s, не меняя при этом опции самого выражения f:
In[l70]:=f [x_, OptionsPattern[s]]:= {х, OptionValue[u], OptionValue[v]} Options[f] Out[171]={} In[172]:=f [1] f [1, u -> 4] f[l, u -> 4, v -> 7] f[l] Out[172]= {1, u0, v0} Out[173]= {1, 4, v0} Out[174]= {l, 4, 7} Out[175]= {1, u0, v0}
Правила в опциях могут быть как в виде Rule (или ), так и в виде RuleDelayed (или lhs :> rhs ). В этом примере значение опции с именем u равно 10 и не меняется при изменении х:
In[176]: = х = 10; Options [s] = {u -> x, v -> v0}; s[l] Out[179]= {1, 10, v0} In[179]: = x = 8; s[l] Out[180]= {1, 10, v0}
А в этом примере значение опции с именем u равно текущему значению выражения x:
In[181]: = х = 12; Options [s] = {u: -> x, v -> v0}; s[l] Out[183] = {1, 12, v0} In[184]:=x = 9; s[l] Out[185]= {1, 9, v0}
В этом примере значение опции с именем u также равно текущему значению выражения x:
In[186] := Clear [s, x] Options [s] = {u -> x} ; s[OptionsPattern[]] : = OptionValue[u] s[] s[u -> 1] Out[189] = x Out[190] = 1 In[191]:=x = 5; s[] Out[192] = 5 In[193]: = x = 7; s[] Out[194] = 7
Команда Clear[s] не очищает опции для s. Чтобы очистить s полностью, вместе с опциями (и еще некоторыми связанными с s объектами), воспользуйтесь командой ClearAll[s]:
In[195] := Clear [s, f] Definition[s] Out[196] = Options [s] = {u -> 9} In[197]:=ClearAll [s] Definition[s] Out[198]=Null