| tags: [ Mathematica CAS ] categories: [ Reading ]
Wolfram 语言:快速编程入门
http://www.wolfram.com/language/fast-introduction-for-programmers/zh/
Shift + Enter开始计算Quit退出当前 Math Kernel 会话,再次计算会自动启动新的 Math Kernel 会话In[n],Out[n],%表示上一次输出,%%表示上上次输出,依次类推;%n表示Out[n]- CMD+L 复制并粘贴上一次输入
- 所有符号表达式都具有相同的基本结构:
head[arguments]FullForm[expr]: 显示底层结构Head[expr]: 给出表达式的头部Length[expr]: 给出表达式中参数的个素
- List
- 字面语法:
{a, b, c} - 索引:
list[[i]],i从 1 开始,负数表示从末尾开始计数 - 许多运算符都是向量化运算,比如
{1, 2, 3} + 2 - 列表切片:
list[[i ;; j]],闭区间
- 字面语法:
- Iterator
Table[x^2, {x, MAX}]Table[x^2, {x, MIN, MAX}]Table[x^2, {x, MIN, MAX, STEP}]Table[x * y, {x, ...}, {y, ...}]Array[f, n]
- Assignment
=表示立即赋值:=表示延迟复制,被用到时重新计算var = .清除赋值- 局部变量:
Module[{a = 1}, a + 8]
- Pattern
_(读做 blank)表示任意表达式:Replace[f[100], f[x_] -> x + 5],这里x_是x: _的简写__(double blank) 表示任意表达式序列:Cases[{f[1, 2], f[1], g[3]}, f[__]]a | b | c表示或者:Cases[{f[1], g[2], f[2], f[5]}, f[1 | 5]]Cases[{f[1], g[2], f[2], f[5]}, (f | g)[2]]
_head匹配包含头部head的表达式:Cases[{1, 2.5, 3.5, 4}, _Real]->使用模式来定义规则,规则右边的表达式在定义时即计算:f[x_] -> x + RandomReal[]:>与->的区别是在规则使用时才计算右边表达式:f[x_] :> x + RandomReal[]/.表示"替换所有”(应用重写规则):{f[1], g[2], f[5], g[3]} /. f[x_] -> x + 5
- Function
f[x_, y_] := x - yf[x_, y_] := x - y /; x > y,/; x > y表示当 x > y 时才应用这个函数f[1] = 2,f[2] = 3, 定义过的 case 会计算,没定义的 case 保留原样:{f[1], f[2], f[3], f[4]}Clear[f]清除函数定义- Pure function(匿名函数,lambda 表达式)
expr &, 表达式中的 # 或者 #1 表示第一个参数,#2 表示第二个参数Function[{x, y}, expr],命名参数的匿名函数
- Apply function
Map[f, {a, b, c, d}], 简写f /@ {a, b, c, d}Map[f, expr, levelspec],默认在 level 1 操作Apply[f, {a, b, c, d}]]等价于f[a, b, c, d]Apply[f, expr, levelspec],默认在 level 0 操作,将 expr 的对应 level 的 head 替换成 f@是普通函数调用:f @ {{a, b}, {c, d}}等价于f[{{a, b}, {c, d}}]@@等价于Apply(apply at level 0):f @@ {{a, b}, {c, d}}等价于f[{a, b}, {c, d}]@@@等价于 “apply at level 1”:f @@@ {{a, b}, {c, d}}等价于{f[a, b], f[c, d]}expr // f等价于f[expr]NestList[f, x, n]相当于{x, f[x], f[f[x]], ...}Nest[f, x, n]相当于f[f[f[....f[x]]]]NestGraph[f, x, n]嵌套的应用 f,形成一个图FoldList[f, x, list]- 函数选项(Options)
Func[arguments, nameA -> valueA, ...], 使用:>替换->表示每次用到这个 option 时都重新计算(跟 rule 的定义方式一致)Options[Func]查看函数的所有选项- Graphics
ListLinePlot[{5, 6, 1, 5, 7, 8, 1, 3}]Graph[{1 -> 3, 1 -> 2, 2 -> 4, 4 -> 5, 5 -> 1}]Graphics[{Orange, Disk[{0, 0}], Opacity[.7], Pink, Disk[{1, 0}]}]- Interactive Interaces
Manipulate[Plot[Sin[a x], {x, 0, 10}], {a, 1, 5}]- 过程式编程
Print[a]; Print[b]; Print[c]分号分隔表达式Module[]词法作用域,变量存放在后端(Math Kernel) 中Block[]动态作用域DynamicModule[]词法作用域,变量存放在前端(Notebook) 中Sow/Reapvs.Throw/CatchTrue,False,If- 数字:
N[expr, precision]和expr`precision - 字符串:
<>连接字符串~~连接正则表达式和字符串- 输入 Unicode 字符:
\[Alpha], ESCAESC,\:03b1都是输入α - 字符串模版:
TemplateApply["number `` date: <* Now *>", {56}], `` 表示占位符,<* expr *>表示插值 - 关联 (Associations)
<|"a" -> x, "b" -> y|>定义关联,expr[key]获取值- 匿名函数中可以用
#key得到关联中的值:{#b, 1 + #b}&[<|"a"->x, "b"->y|>] - 关联和列表同时使用:
<|"a" -> x, "b" -> {5, 6}|>[["b", 1]] - 字符串模版:
TemplateApply["first `a`; second `b`; first `a`", <|"a" -> x, "b" -> y|>]