Опубликован: 27.12.2010 | Уровень: специалист | Доступ: платный
Лекция 4:

Детализация

Аргументы, которые могут быть пропущены

С помощью шаблона можно также описать, что делать, если аргумент функции отсутствует.

Шаблон "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

У многих встроенных функций и констант имеются заранее заданные опции. Обычно они имеют вид правил lhs \to rhs. Чтобы посмотреть опции у объекта 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,..., выполните команду SetOptions[s, \{name1 \to values1, name2 \to value2, \dots \}]:

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 (правая часть выражения name \to Rhs ) из списка опций 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 (или lhs \to rhs ), так и в виде 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
Светлана Петрова
Светлана Петрова
Украина
Марина Семенова
Марина Семенова
Россия, г. Чебоксары