虚拟全书 > 核心语言 > 表达式的计算 > 属性 >

属性

等定义给出了函数值. 有时仅需要规定函数的特性,而不需要明确指定函数的值.
Mathematica 提供了指定函数特性的一系列属性函数. 例如,Flat 函数规定一个函数有"无层次"特性,所有的嵌套结构都被压平从而具有结合性.
给函数 赋以 Flat 属性.
In[1]:=
Click for copyable input
现在函数 具有可结合属性,嵌套结构被压平.
In[2]:=
Click for copyable input
Out[2]=
Flat 等函数不仅影响计算,而且影响模式匹配运算. 当对一个函数进行定义或变换时,必须首先确认这个函数的属性.
函数  的定义.
In[3]:=
Click for copyable input
由于 具有结合律,因而对自变量序列自动应用这一定义.
In[4]:=
Click for copyable input
Out[4]=
Attributes[f]给出 f 的属性
Attributes[f]={attr1,attr2,...}设置 f 的属性
Attributes[f]={}f 无任何属性
SetAttributes[f,attr]f 增添属性 attr
ClearAttributes[f,attr]f 属性中清除 attr

属性的处理.

显示 的属性.
In[5]:=
Click for copyable input
Out[5]=
清除  的属性.
In[6]:=
Click for copyable input
Out[6]=
Orderless可交换性 (自变量按标准顺序排列)
Flat可结合性 (自变量处于"平等地位")
OneIdentity 在模式匹配中等价于 a
Listablef 线状插入变量列表中 (如 成为
Constantf 的所有导数是零
NumericFunction当自变量是数值时,f 就有一个数量值
Protectedf 的值不能改变
Lockedf 的属性不能改变
ReadProtected不允许读 f 的值
HoldFirstf 的第一个自变量不计算
HoldRestf 的第二个及以后的自变量不计算
HoldAllf 的所有自变量不计算
HoldAllCompletef 的所有自变量不动
NHoldFirstf 的第一个自变量不受 N 的影响
NHoldRestf 除第一个外的自变量不受 N 的影响
NHoldAllf 的所有自变量不受 N 的影响
SequenceHoldf 的自变量中的对象 Sequence 不能被压平
Temporaryf 是一个局部变量,不再使用时就被删除
Stubf 没有明确输入时自动调用 Needs

Mathematica 中符号的属性表.

内部函数 Plus 的属性.
In[7]:=
Click for copyable input
Out[7]=
Mathematica 函数属性中的一个重要属性是 Listable. 该属性规定函数必须线状分布到其自变量中去,即该函数分别作用于每一个自变量列中的每一个元素上.
内部函数 Log 具有属性 Listable.
In[8]:=
Click for copyable input
Out[8]=
定义函数 Listable.
In[9]:=
Click for copyable input
现在 自动线状作用于作为它的自变量的列表上.
In[10]:=
Click for copyable input
Out[10]=
Mathematica 中可赋于函数的许多属性直接影响函数的计算,也有些属性仅影响函数处理的其它方面. 例如属性 OneIdentity 仅影响模式的匹配,如 "有交换性和结合性的函数" 中讨论的. 同样地,属性 Constant 仅与求导有关的运算相关.
Protected 属性影响函数的赋值. Mathematica 不允许对具有此属性的符号进行定义. "修改内部函数" 节中讨论的 ProtectUnprotect 函数可以用来作为设置或清除这一属性的除 SetAttributesClearAttributes 之外的选择. 从 "修改内部函数" 节看出,大部分 Mathematica 的内部对象都被保护以避免错误的定义.
函数 的定义.
In[11]:=
Click for copyable input
Out[11]=
给  设置属性 Protected.
In[12]:=
Click for copyable input
Out[12]=
现在就不能再修改 的定义.
In[13]:=
Click for copyable input
Out[13]=
通过 ?f 或一些内部函数就可以查看对一些符号的定义,但当设置了 ReadProtected 属性后,Mathematica 就不允许再查看这个符号的定义. 不过在计算时仍可以继续使用此定义.
尽管无法修改 ,但还可以查看它的定义.
ReadProtected 属性.
In[15]:=
Click for copyable input
现在就不能查看的 定义.
SetAttributesClearAttributes 等用来修改符号的属性. 但当对一个符号设置了 Locked 属性后, Mathematica 就不能再修改它的属性了. 用 LockedProtectedReadProtected 属性可以防止用户查看或修改定义.
Clear[f]清除 f 的值,保留其属性
ClearAll[f]清除 f 的值和属性

清除已有值和属性.

清除 的值和属性 ( 在前面设置了属性 Listable ).
In[17]:=
Click for copyable input
现在 不再是 Listable.
In[18]:=
Click for copyable input
Out[18]=
给函数设置属性就是令函数具有一些性质,该函数在任何时候都具有此性质. 但有时仅需要在特定情况下,函数具有这一性质,此时最好不要使用属性,而调用一个特定函数来实现与属性有关的变换.
调用函数 Thread 可以实现 Listable 属性的功能.
In[19]:=
Click for copyable input
Out[19]=
OrderlessSort[f[args]]
FlatFlatten[f[args]]
ListableThread[f[args]]
ConstantDt[expr,Constants->f]

进行与属性有关变换的函数.

Mathematica 中只能给单个符号永久定义属性,但 Mathematica 也可以建立具有类似于属性特性的纯函数.
Function[vars,body,{attr1,...}]具有属性 , ... 的纯函数

具有属性的纯函数.

这个纯函数将 作用于整个集合.
In[20]:=
Click for copyable input
Out[20]=
增添属性 Listable,使 作用于每个元素上.
In[21]:=
Click for copyable input
Out[21]=
Ask a question about this page  |  Suggest an improvement  |  Leave a message for the team
格式:   HTML  |  CDF