博客 / 詳情

返回

Y 分鐘速成 wolfram

源代碼下載: learnwolfram-cn.nb

Wolfram 語言是最初在 Mathematica 中使用的底層語言,但現在可用於多種場合。

Wolfram 語言有幾個界面。

  • Raspberry Pi 上的命令行內核界面(就叫 _The Wolfram Language_),它是交互式運行的,不能產生圖形輸入。
  • Mathematica 是一個豐富的文本/數學編輯器,內置交互式的 Wolfram: 在 "代碼單元 "上按 shift+Return 鍵可以創建一個輸出單元,輸出結果,這不是動態的。
  • _Wolfram Workbench_,這是 Eclipse 與 Wolfram 語言後端的界面。

本例中的代碼可以在任何界面中輸入,並使用 Wolfram Workbench 進行編輯。直接加載到 Mathematica 中可能會很不方便,因為該文件不包含單元格格式化信息(這將使該文件作為文本閲讀時變得一團糟)--它可以被查看/編輯,但可能需要一些設置。

(* 這是一個註釋 *)

(* 在Mathematica中,您可以創建一個文本單元格,用排版好的文本和圖像來註釋您的代碼,而不是使用這些註釋 *)

(* 輸入一個表達式返回結果 *)
2*2              (* 4 *)
5+8              (* 13 *)

(* 調用函數 *)
(* 注意,函數名(和其他所有東西)是區分大小寫的 *)
Sin[Pi/2]        (* 1 *)

(* 帶有一個參數的函數調用的替代語法 *)
Sin@(Pi/2)       (* 1 *)
(Pi/2) // Sin    (* 1 *)

(* WL 中的每一種語法都有一些等價的函數調用,即萬物皆函數 *)
Times[2, 2]      (* 4 *)
Plus[5, 8]       (* 13 *)

(* 第一次使用一個變量定義它,並使其成為全局變量 *)
x = 5            (* 5 *)
x == 5           (* 返回真,C-style 的賦值和相等測試 *)
x                (* 5 *)
x = x + 5        (* 10 *)
x                (* 10 *)
Set[x, 20]       (* 當我説萬物皆函數時 我是認真的 *)
x                (* 20 *)

(* 因為WL是基於計算機代數系統的, *)
(* 可以使用未定義的變量,它們只是阻礙了計算 *)
cow + 5          (* 5 + cow, cow 是未定義的,所以無法進一步計算 *)
cow + 5 + 10     (* 15 + cow, 它將盡力計算 *)
%                (* 15 + cow, % 獲取最後一次返回的內容 *)
% - cow          (* 15, 未定義的變量cow被消去 *)
moo = cow + 5    (* 小心,moo 現在是一個表達式,不是一個數字! *)

(* 定義一個函數 *)
Double[x_] := x * 2    (*   注意 := 防止對RHS進行即時計算。
                            而 x 後面的 _ 表示沒有模式匹配的約束條件*)
Double[10]             (* 20 *)
Double[Sin[Pi/2]]      (* 2 *)
Double @ Sin @ (Pi/2)  (* 2, @-syntax 避免了閉括號的隊列 *)
(Pi/2) // Sin // Double(* 2, //-syntax 按執行順序列舉了函數 *)

(* 對於命令式編程,使用 ; 來分隔語句。 *)
(* 丟棄 LHS 的任何輸出並運行 RHS *)
MyFirst[] := (Print@"Hello"; Print@"World")  (* 請注意,外側的小括號是關鍵
                                                 ;的優先級低於:= *)
MyFirst[]                                    (* 你好,世界 *)

(* C-Style 的 For 循環,注:在 Mathematica 中使用 For 循環是低效的 *)
PrintTo[x_] := For[y=0, y<x, y++, (Print[y])]  (* 開始,測試,自增,循環體 *)
PrintTo[5]                                     (* 0 1 2 3 4 *)

(* While 循環 *)
x = 0; While[x < 2, (Print@x; x++)]     (* 帶測試和程序體的 while 循環 *)

(* If 和 條件 *)
x = 8; If[x==8, Print@"Yes", Print@"No"]   (* Condition, true case, else case *)
Switch[x, 2, Print@"Two", 8, Print@"Yes"]  (* 值匹配風格切換 *)
Which[x==2, Print@"No", x==8, Print@"Yes"] (* Elif風格切換 *)

(* 除參數外的變量默認為全局變量,即使在函數內部也是如此 *)
y = 10             (* 10, 全局變量 y *)
PrintTo[5]         (* 0 1 2 3 4 *)
y                  (* 5, 全局的 y 被 PrintTo 內的循環計數器所佔用 *)
x = 20             (* 20, 全局變量 x *)
PrintTo[5]         (* 0 1 2 3 4 *)
x                  (* 20, PrintTo 中的 x 是一個參數,並自動局部化 *)

(* 局部變量使用 Module 元函數聲明 *)
(* 帶本地變量的版本 *)
BetterPrintTo[x_] := Module[{y}, (For[y=0, y<x, y++, (Print@y)])]
y = 20             (* 全局變量 y *)
BetterPrintTo[5]   (* 0 1 2 3 4 *)
y                  (* 20, 那更好 *)

(* 實際上,模塊允許我們聲明任何我們喜歡的作用域 *)
Module[{count}, count=0;        (* 聲明這個變量count的作用域 *)
  (IncCount[] := ++count);      (* 這些函數都在該作用域內 *)
  (DecCount[] := --count)]
count              (* count - 全局變量 count 未定義 *)
IncCount[]         (* 1, 使用作用域內的counter變量 *)
IncCount[]         (* 2, incCount 升級了它 *)
DecCount[]         (* 1, decCount 也是 *)
count              (* count - 這個名字依舊不是全局變量 *)

(* Lists *)
myList = {1, 2, 3, 4}     (* {1, 2, 3, 4} *)
myList[[1]]               (* 1 - 注意列表索引從 1 開始,而不是從 0 開始。 *)
Map[Double, myList]       (* {2, 4, 6, 8} - 函數式列表的 map 函數 *)
Double /@ myList          (* {2, 4, 6, 8} - 以上的縮略語法 *)
Scan[Print, myList]       (* 1 2 3 4 - 命令式循環 *)
Fold[Plus, 0, myList]     (* 10 (0+1+2+3+4) *)
FoldList[Plus, 0, myList] (* {0, 1, 3, 6, 10} - 存值的 Fold *)
Append[myList, 5]         (* {1, 2, 3, 4, 5} - 注意 myList 沒有更新 *)
Prepend[myList, 5]        (* {5, 1, 2, 3, 4} - 如果想讓 myList 更新,就加上 "myList = " *)
Join[myList, {3, 4}]      (* {1, 2, 3, 4, 3, 4} *)
myList[[2]] = 5          (* {1, 5, 3, 4} - 這確實更新了myList *)

(* 關聯,又稱字典/哈希值 *)
myHash = <|"Green" -> 2, "Red" -> 1|>   (* 創建一個關聯 *)
myHash[["Green"]]                       (* 2, 使用 *)
myHash[["Green"]] := 5                  (* 5, 更新 *)
myHash[["Puce"]] := 3.5                 (* 3.5, 擴展 *)
KeyDropFrom[myHash, "Green"]            (* 抹去綠色的鍵 *)
Keys[myHash]                            (* {Red, Puce} *)
Values[myHash]                          (* {1, 3.5} *)

(* 做 Wolfram 的演示時 你不能不展示這個 *)
Manipulate[y^2, {y, 0, 20}] (* 返回一個反應式的用户界面,顯示y^2
                               並允許通過滑塊在 0-20 之間調整y。
                               只適用於圖形前端 *)

想多來點?

  • Wolfram Language Documentation Center

有建議?或者發現什麼錯誤?在Github上開一個 issue ,或者發起 pull request !


原著 hyphz ,並由0個好心人修改。
© 2022 hyphz
Translated by: wuyudi
本作品採用 CC BY-SA 3.0 協議進行許可。

user avatar xuriliang 頭像 amsterdam_5caf807441f49 頭像 shengmingbuxi_5c1152527848f 頭像 513928731 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.