| 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 - y
f[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/Reap
vs.Throw/Catch
True
,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|>]