Introducing Julia/The REPL


« Introducing Julia
REPL 環境
»
新手入門 數組和元組

REPL 環境

編輯

默認情況下,鍵入 julia 將啟動一個交互式 REPL,即讀取/求值/列印/循環。它允許您在 Julia 代碼中鍵入表達式,並立即在屏幕上看到計算結果。


  • Reads what you type (讀取你輸入的內容)
  • Evaluates it (求值)
  • Prints out the return value, then (列印出返回值,然後)
  • Loops back and does it all over again (返回並周而復始)

REPL 是一個開始嘗試這種語言的好地方。但是對於正式代碼編寫,文本編輯器或交互式筆記本環境 (例如 IJulia/Jupyter) 才是更好的選擇。

REPL 的優勢在於:它很簡單,不需要任何安裝或配置就可以工作,還有一個內置的幫助系統。通過它你可以快速的驗證一些想法。總而言之,它很適合用於學習 Julia.

使用 REPL

編輯

鍵入一些 Julia 代碼,然後鍵入 Return/Enter。Julia 將計算您鍵入的內容並返回結果:

julia> 42 <Return/Enter>
42

julia>

如果您使用的是 Jupyter (IPython) notebook,則可能必須鍵入 Control-Enter 或 Shift-Enter.

如果不希望看到列印表達式的結果,請在表達式末尾使用分號:

julia> 42;

julia>

此外,如果要訪問在 REPL 上鍵入的最後一個表達式的值,它將存儲在變量 ans 中:

julia> ans
42

如果未完成第一行的表達式,請繼續鍵入,直到完成為止。例如:

julia> 2 +  <Return/Enter>

Julia 會有耐心地等待著,直到你結束這個表達式:

2  <Return/Enter>

於是乎你就能看到答案:

4

julia>


幫助和查找幫助

編輯

鍵入問號 ?

julia> ?

您將立即切換到幫助模式,(在終端中)提示符將變為黃色:

help?>

現在,您可以鍵入某項的名稱(函數名稱應不帶括號):

help?> exit
search: exit atexit textwidth process_exited method_exists indexin nextind IndexLinear TextDisplay istextmime
   
exit(code=0)
   
Stop the program with an exit code. The default exit code is zero, indicating that the 
program completed successfully. In an interactive session, exit() can be called with the 
keyboard shortcut ^D.
   
julia>

請注意,幫助系統已嘗試查找與您鍵入的字母匹配的所有單詞,並向您顯示它找到的內容。

如果要搜索文檔,可以使用 apropos 和一個搜索的字符串:

julia> apropos("determinant")
LinearAlgebra.det
LinearAlgebra.logabsdet
LinearAlgebra.logdet

您將看到一個函數列表,其名稱或描述包含字符串。

julia> apropos("natural log")
Base.log
Base.log1p

help?> log
search: log log2 log1p log10 logging logspace Clong Clonglong Culong Culonglong task_local_storage

log(b,x)

Compute the base b logarithm of x. Throws DomainError for negative Real arguments.

諸如此類。


Shell 模式

編輯

如果鍵入分號

julia> ;

立即切換到 shell 模式:

shell>

(提示變為紅色)。在shell模式下,您可以鍵入任何shell(即非Julia)命令並查看結果:

shell> ls
file.txt   executable.exe   directory file2.txt

julia>

然後提示符切換回julia,因此每次想執行shell命令時,都必須鍵入分號。該模式下可用的命令是系統 shell 的命令。

包管理模式

編輯

如果鍵入右方括號作為第一個字符:

julia> ]

立即切換到 package 模式:

v1.0 pkg> 

這是您執行包管理任務的地方,例如添加包、測試包等等。

要離開 package 模式,請在空行上按 Backspace 或 CTRL+C。


內置函數和宏

編輯

以下是在REPL提示中提供的一些有用的交互函數和宏:

  • varinfo() – 列印有關 module 中導出的全局變量的信息。
julia> varinfo()
name                    size summary    
–––––––––––––––– ––––––––––– –––––––––––
Base                         Module     
Core                         Module     
InteractiveUtils 222.893 KiB Module     
Main                         Module     
ans                1.285 KiB Markdown.MD


  • @which – 告訴您將為函數和特定參數調用具體哪個方法:
julia> @which sin(3)
sin(x::Real) in Base.Math at special/trig.jl:53
  • versioninfo() – 獲取 Julia 版本和平台信息:
julia> versioninfo()
Julia Version 1.0.0-rc1.0
Commit f92a55a06a (2018-08-07 16:29 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin14.5.0)
  CPU: Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.0 (ORCJIT, skylake)
Environment:
  JULIA_EDITOR = mvim

還有一種快速查找版本的方法:

julia> VERSION
v"1.0.0"
  • edit("pathname") – 啟動默認編輯器並打開文件pathname進行編輯
  • @edit rand() – 啟動默認編輯器並打開包含定義了內置函數 rand() 的文件
  • less("filename-in-current-directory") – 在當前位置顯示文件
  • clipboard("stuff") – 複製 "stuff" 到系統剪貼板
  • clipboard() – 將剪貼板的內容粘貼到當前 REPL 行中
  • dump(x) – 在屏幕上顯示有關Julia對象 x 的信息
  • names(x) – 獲取 module x所以導出的名稱的數組。
  • fieldnames(typeof(x)) – 獲取屬於類型為 x 的符號的數據欄位的數組。

<TAB> 鍵: 自動補全

編輯

TAB 鍵通常能夠完成或建議完成您鍵入其名稱的某項內容。例如,如果我鍵入w,然後按Tab鍵(在有多個選項時按兩次),則會列出以「w」開頭的所有當前可用函數:

julia> w <TAB>
wait    walkdir  which    while    widemul  widen    withenv  write

這既適用於 Julia 實例,也適用於 shell 和 package 模式。例如,下面是如何從Julia內部導航到某個目錄:

shell> cd ~
/Users/me

shell> cd Doc <TAB>
shell> cd Documents/

shell> ls
...

請記住,您可以使用 ? 並鍵入其全名(或使用 TAB-補全)來獲得有關函數的幫助。


TAB-補全也適用於unicode符號:例如鍵入 \alp 然後按 TAB 將會得到 \alpha 再按一次 TAB 就會得到 α

對於Emoji: 鍵入 \:fe 然後按 TAB 將會得到 \:ferris_wheel: 再按一次 TAB 就會得到 🎡。


歷史記錄

編輯

您可以使用上箭頭鍵和下箭頭鍵回顧以前的命令記錄(您可以退出並重新啟動,而不會刪除該歷史記錄)。

因此,您不必再次鍵入長的多行表達式,因為您可以從歷史中回憶起它。如果您鍵入了大量表達式,則可以通過按Ctrl-R和Ctrl-S來前後搜索它們。

變量作用域與性能

編輯

一個關於 REPL 的警告。REPL 在 Julia 的 全局範圍 內運行。

通常,當編寫較長的代碼時,您會將代碼放在函數中,並將函數組織到模塊和包中。當您的代碼被組織成函數時,Julia的編譯器工作得更有效,因此您的代碼將運行得更快。

還有一些事情在 top level 是做不到的:比如為變量的值指定類型。

更改提示符並自定義 Julia 會話

編輯

每次啟動Julia時,都會運行以下 Julia 文件(除非使用startup-file=no選項)。

~/.julia/config/startup.jl

這使您可以加載任何您所知的以後需要的包。例如,如果要自動定製 REPL 會話,可以安裝能在啟動文件中自定義REPL的外觀和行為的包 OhMyREPL.jl (https://github.com/KristofferC/OhMyREPL.jl) ,然後在 startup 文件中:

using OhMyREPL

如果您只想在每次啟動 Julia 會話時設置提示,則只需添加以下說明:

using REPL
function myrepl(repl)
    repl.interface = REPL.setup_interface(repl)
    repl.interface.modes[1].prompt = "julia-$(VERSION.major).$(VERSION.minor)> "
    return
end

atreplinit(myrepl)

這只會設置當前的REPL提示符,以顯示您的會話正在使用的 Julia 版本號。


Julia 與 數學

編輯

你把 Julia REPL 當作一個強大的計算器。這也是很好的練習。(這是介紹交互式程式語言的傳統,也是認識該語言的好方法。)

輸入長數字

編輯

世界上一半的人使用逗號(,)將長數字分成三組,另一半使用句點(.)。(我們其餘的人使用科學記法)。

在Julia中,可以使用下劃線(_)分隔:

julia> 1_000_000 - 2_015
997985

儘管你在返回的結果中看不到。

要使用科學符號,只需鍵入「e」,並記住不要使用空格:

julia> planck_length = 1.61619997e-34

我的電腦有多快?(每秒執行多少個十億次的浮點運算)

julia> peakflops() / 1e9
48.778354495441356
 
julia> peakflops() / 1e9
54.20509453559899

(請注意第二次速度更快,這是因為 Julia 的編譯起作用了。)

操作符即函數

編輯
julia> 2 + 2
4

julia> 2 + 3 + 4
9

數字相加的等效形式:

julia> +(2, 2)
4

通常在值之間使用的運算符是普通的 Julia 函數,可以與其他函數用相同的方式使用。類似的:

julia> 2 + 3 + 4
9

可以寫成

julia> +(2, 3, 4)
9

以及

julia> 2 * 3 * 4
24

可以寫成

julia> *(2,3,4)
24

Julia 還提供了一些數學常量:

julia> pi
π = 3.1415926535897...

你可以在 MathConstants 模塊上找到一些其他的數學常量:

julia> Base.MathConstants.golden
φ = 1.6180339887498...

julia> Base.MathConstants.e
e = 2.7182818284590...

所有常用操作符均可用:

julia> 2 + 3 - 4 * 5 / 6 % 7
1.6666666666666665

注意運算符的優先級。在這種情況下,它是:

((2 + 3) - ((4 * 5) / 6) % 7)

如果要檢查運算符的優先級,請將表達式包含在 :() 中:

 julia> :(2 + 3 - 4 * 5 / 6 % 7)
 :((2 + 3) - ((4 * 5) / 6) % 7)

(有關這方面的更多信息,請參閱本書的元編程章節).

乘法通常是寫成 * 的,但當將變量乘以數字文字時,可以省略這一點:

julia> x = 2
2

julia> 2x + 1
5
julia> 10x + 4x - 3x/2 + 1
26.0

這使得方程式更容易寫。

有時需要括號來控制計算順序:

julia> (1 + sqrt(5)) / 2
1.618033988749895

其他一些需要注意的事項包括:

  • ^ 乘方
  • % 餘數

要生成有理數,請使用兩個斜槓(//):

julia> x = 666//999
2//3

也有反除法"\",所以 x/y = y\x.

標準算術運算符還具有特殊的更新版本,您可以使用該版本快速更新變量:

  • +=
  • -=
  • *=
  • /=
  • \=
  • %=
  • ^=

例如,在定義了變量 x 之後:

julia> x = 5
5

你可以給它加 2

julia> x += 2
7

然後乘以 100

julia> x *= 100
700

再然後把它減到它模11的值:

julia> x %= 11
7

有對數組起作用的元素級運算符。這意味著可以將兩個數組元素乘以元素:

julia> [2,4] .* [10, 20]
2-element Array{Int64,1}:
 20
 80

數組是 Julia 的基礎,在這本書中也有他們自己的章節。

如果對兩個整數用 / 進行除法運算,則答案始終是一個浮點數。如果您使用過 Python 2 版本,您會記得 Python 返回一個整數結果。Python 3 現在返回一個浮點數。

Julia提供了一個整數除法運算 ÷ (鍵入 \div TAB ,或使用函數版本的 div() 。當您希望得到整數結果而不是用 / 返回的浮點時,應使用此選項。

julia> 3 ÷ 2
1

julia> div(3, 2)
1

整型數溢出

編輯

如果您認為您的計算將突破64位限制,請通過使用 big 函數將操作數存儲為大數來選擇「大整數」:

julia> 2^64 # oops
0

julia> big(2)^64 # better
18446744073709551616

julia> 2^big(64) # equally better
18446744073709551616

要為Julia程序獲得最快的執行速度,您應該了解如何在不引入「類型不穩定」的情況下存儲數據和變量。


進制轉換

編輯

當使用 REPL 作為計算器時,這些方便的實用函數可能會很有用。

bitstring() 函數顯示數字的文字二進制表示形式,存儲如下:

julia> bitstring(20.0)
"0100000000110100000000000000000000000000000000000000000000000000"

julia> bitstring(20)
"0000000000000000000000000000000000000000000000000000000000010100"

請注意,正如您所預期的,浮點「版本」的存儲方式是不同的。

要從二進制字符串返回十進制,您可以使用 parse(),它接受目標類型和數字基數:

julia> parse(Int, "0000011", base=2)
3 
julia> parse(Int, "DecaffBad", base=16)
59805531053

若要使用默認10以外的數字基,請使用 string 函數將整數轉換為字符串:

julia> string(65535, base=16)
"ffff"
julia> string(64, base=8)
"100"

相反, digits(number, base=b) 返回給定基數的數字位的數組 :

julia> digits(255, base=16)
2-element Array{Int64,1}:
 15
 15

變量

編輯

在這個表達式中:

julia> x = 3

x 是一個變量,是數據對象的命名存儲位置。在 Julia 中,雖然變量名不能以數字或標點符號開頭,但可以按照您的喜好來命名變量。如果需要,可以使用Unicode字符。

若要賦值,請使用單個等號。

julia> a = 1
1

julia> b = 2
2

julia> c = 3
3

要測試相等性,您應該使用 == 運算符或 isequal() 函數。

在 Julia 中,可以同時給多個變量賦值:

julia> a, b = 5, 3
(5,3)

請注意,此表達式的返回值是一個圓括號內的、逗號分隔的、有序的元素列表:簡稱元組

julia> a
5

julia> b
3
數字和變量相乘
編輯

值得重複的是,您可以在變量名稱前面加上一個數字來將其相乘,而不必使用星號(*)。例如:

julia> x = 42
42

julia> 2x
84

julia> .5x
21.0

julia> 2pi
6.283185307179586

特殊符號

編輯

JuliaREPL提供了對特殊字符的簡單訪問,例如希臘字母字符、下標和特殊的數學符號。如果鍵入反斜槓,則可以鍵入字符串(通常是等效的LaTeX字符串)以插入相應的字符。例如,如果鍵入以下內容:

julia> \sqrt <TAB>

Julia 會將 \sqrt 替換為平方根符號:

julia> 

其他一些例子:

\Gamma Γ
\mercury
\degree °
\cdot
\in

在Julia原始碼中有一個完整的列表。作為一般原則,在 Julia 中鼓勵您查看原始碼,因此有一些有用的內置函數可用於查看Julia源文件。例如,在MacOS上,這些符號存儲在:

julia> less("/Applications/Julia-1.0.app/Contents/Resources/julia/share/julia/stdlib/v1.0/REPL/src/latex_symbols.jl")

less 通過 pager 運行文件(即 Unix 中的 less命令)如果您很勇敢,請嘗試使用 edit() 而不是 less(). 這將啟動一個編輯器並打開文件。


還可以在REPL中使用Emoji和其他Unicode字符。

對於emoji,鍵入Emoji字符名稱,在冒號之間,在反斜槓後面,然後按<TAB>:

julia> \:id: <TAB>

會更改為:

julia> 🆔

您可以在 https://docs.julialang.org/en/latest/manual/unicode-input/#Unicode-Input-1 找到列表.

輸入不在此列表中的Unicode符號是可能的,但更依賴於作業系統:在MacOS上,在鍵入Unicode十六進制數字時按住 Ctrl/Alt鍵(啟用Unicode十六進制鍵盤);在Windows上,輸入Ctrl+Shift+u,後跟十六進制數字。)

julia> ✎ = 3
3

julia> 
3

數學函數

編輯

因為Julia特別適合於科學和技術計算,所以您可以立即使用許多數學函數,而且您通常不必導入它們或使用前綴,它們已經可用了。


三角函數值要求以弧度為單位:

julia> sin(pi / 2)
1.0

但是也有基於度的版本:sind(90) 找到90度的正弦。使用 deg2rad()rad2deg() 在度數和弧度之間進行轉換。


還有許多對數函數:

julia> log(12)
2.4849066497880004

和精確的勾股定理函數 hypot()

julia> hypot(3, 4)
5.0

norm() 函數返回向量的 "p" 範數或矩陣的算子範數。下面是 divrem():

julia> divrem(13, 3) # returns the division and the remainder
(4,1)

There are dozens of others.

有一個稱為ans 的系統範圍的變量,它會記住最近的結果,因此您可以在下一個表達式中使用它。

julia> 1 * 2 * 3 * 4 * 5
120

julia> ans/10
12.0
小練習
編輯

猜猜看,然後使用幫助系統了解 mod2pi()isapprox() 做了什麼。

這裡描述了作為Julia標準提供的所有函數:[1]

隨機數

編輯

rand() – 獲取一個介於0和1之間的隨機 Float64 數值。

julia> rand()
0.11258244478647295

rand(2, 2) – 維數為 2, 2 類型為 Float64 的數組

rand(type, 2, 2) – 維數為 2, 2 類型為 type 的數組

rand(range, dims) – 具有指定的範圍內(包括兩端)的數字數組:

julia> rand(0:10, 6)
6-element Array{Int64,1}:
 6
 7
 9
 6
 3
 10

(有關範圍對象的詳細信息,請參見數組一章。)

The rand() function can generate a true or false value if you tell it to, by passing the Bool keyword:

如果傳遞 Bool 關鍵字給 rand() 函數,它可以生成 true 或 false 值:

julia> rand(Bool)
false

或是一堆 true 和 false :

julia> rand(Bool, 20)
20-element Array{Bool,1}:
 false
 true
 false
 false
 false
 true
 true
 false
 false
 false
 false
 false
 false
 false
 true
 true
 false
 true
 true
 false


服從分布的隨機數
編輯

randn() 給出常態分佈中的一個隨機數,平均值為0,標準差為1。randn(n) 給出 n 個這樣的數字:

julia> randn()
0.8060073309441075

julia> randn(10),
([1.31598,1.55126,-1.14605,-0.562148,0.69725,0.468769,-1.58275,0.238471,2.72857,1.11561],)

( randn(10) 後面的逗號僅用於行的可視化)

如果已安裝 Plots 包,則可以列印以下內容:

julia> using Plots; gr()
julia> histogram(randn(10000), nbins=100)

 

設置隨機數種子

編輯

Random 包 涵蓋了更多的隨機函數,如 randperm(), shuffle()seed!.。


在使用隨機數之前,可以為隨機數生成器設定特定值。這確保後續的隨機數將遵循相同的序列,如果它們從相同的種子開始。可以使用 seed!()MersenneTwister() 函數為生成器設定種子。


添加 Random 包後,可以執行以下操作:

julia> using Random
julia> Random.seed!(10);

julia> rand(0:10, 6)
6-element Array{Int64,1}:
 6
 5
 9
 1
 1
 0
julia> rand(0:10, 6)
6-element Array{Int64,1}:
 10
 3
 6
 8
 0
 1

在重新啟動Julia後,相同的種子保證相同的隨機數。

簡單的輸入示例

編輯

下面是一個簡單的示例,說明如何編寫和運行從鍵盤讀取輸入的函數:

julia> function areaofcircle() 
            println("What's the radius?")
            r = parse(Float64, readline(stdin))
            println("a circle with radius $r has an area of:")
            println(π * r^2)
        end
areaofcircle (generic function with 1 method)

julia> areaofcircle()
What's the radius?
42
a circle with radius 42.0 has an area of:
5541.769440932395
julia>
« Introducing Julia
REPL 環境
»
新手入門 數組和元組