2.4.8 立即定义和延时定义Mathematica 中有两种赋值形式: lhs = rhs 和 lhs := rhs,其主要 区别是什么时候计算 rhs 的值. lhs = rhs 是立即赋值,即 rhs 是在赋值时立即计算, 而 lhs := rhs 则是延时赋值,即赋值时并不计算 rhs,而是在需要 lhs 的 值时才进行计算. Mathematica 中的两种赋值形式 用 := 定义 ex 由于使用了 :=,该定义中仍然保持没有计算之前的形式
使用 = 赋值时,右端立即被计算出来
Out[3]= |  |
现在保存的定义是 Expand 的结果
当执行 ex 时,就调用 Expand
Out[5]= |  |
iex 将它的变量替换到已展开的形式中去,给出不同形式的结果
Out[6]= |  |
由上面的例子看出 = 和 := 都可以用来定义函数,要特别注意它们的差异. 一个常用的原则 是:当一个表达式的值再不改变时用 = ,而通过赋值求表达式的一个值时用 := .在无法确定时用 := 总比用=好一些. 用=和 := 赋值的含意 尽管 := 比 = 用得多一些,但还有必须用 = 定义函数的一个重要情形. 当进行一个运算得到具有符号参数 x 的结果时,还需要进一步得到对应于不同 x 的结果,一种方式是用 /. 将适当的规则用于 x,通常用=去定义变量 x 的函数 就较方便一些. 涉及 x 的一个表达式
Out[7]= |  |
定义一个自变量可用 x 的值代入的值函数
Out[8]= |  |
x 为 1+a 时的结果
Out[9]= |  |
上面例子中值得注意的一点是在模式 x_ 中出现的名称没有任何特殊之处,它仅是一个符号,与其它表达式中出现的 x 没有区别. 定义表达式值的函数 = 和 := 不仅用来定义函数,还用来给变量赋值, x = value 立即求 value 的值,并将其赋于 x,而 x := value 不立即求值,每次使用 x 时才计算其值. 求出一个伪随机数,赋给 r1
Out[10]= |  |
Random[ ] 先不计算,在每次使用 r2 时进行计算 此处给出 r1 和 r2 的值
Out[12]= |  |
r1 的值维持不动,每次使用 r2 时就产生一个伪随机数
Out[13]= |  |
在一系列值语句中,要特别注意立即赋值和延时赋值的区别. 令 a=1
Out[14]= |  |
计算 a+2 得到 3,将结果赋于 ri
Out[15]= |  |
a+2 先不计算,等到 rd 使用时求其值 此处 ri 和 rd 值相同
Out[17]= |  |
此时 a 的值被改变
Out[18]= |  |
现在 rd 使用 a 的新值,而 ri 保持不动
Out[19]= |  |
可以用延时赋值 t := rhs 来设置在不同环境下有不同值的变量, 当每次需要 t 的值时,就用与 rhs 有关变量的当前值来计算它的值. 延时赋值的右端暂不计算 令 a=4,再求出 t 的值
Out[21]= |  |
令 a=6,再计算 t
Out[22]= |  |
在上面的例子中,a是一个全局变量,它的值决定了 t的大小.当参数中大部分偶尔才变化时,用这种方式是方便的. 但必须认识到明显 的或隐含的变量之间的依赖关系是容易混淆的,应该尽可能地使用函数 明确地反映依赖关系. Mathematica 中的两种变换规则 与立即或延时赋值类似,可以建立立即或延时的变换规则. 给出规则时其左端立即计算
Out[23]= |  |
这类规则不一定十分有用
Out[24]= |  |
规则的右端暂不计算,每次使用规则时才求它的值
Out[25]= |  |
使用规则时就进行展开
Out[26]= |  |
与赋值的情形类似,当用确定的值代替表达式的值时用 ->,而当给出 一个求值的命令时用 :>.
|