- Julia機器學習核心編程:人人可用的高性能科學計算
- 朱紅慶
- 1688字
- 2020-07-28 11:01:31
1.5 使用REPL
Read-Eval-Print-Loop(REPL)是一個交互式shell,類似于Python或Swift的Playground,提供了測試代碼片段的功能。Julia在后端提供了一個帶有JIT編譯器(由Julia使用)的交互式shell。我們可以在一行中輸入、編譯,結果在下一行中給出。Julia命令行界面如圖1-13所示。

圖1-13 Julia命令行界面
只要在終端鍵入julia,就可以輕松啟動Julia的shell。在打開shell時,會顯示Julia標志和有關版本的信息。這里的“julia>”是Julia提示符,類似于Python中的“>>>”,我們可以在其后面編寫表達式、語句和函數,就像在代碼文件中編寫一樣。REPL的好處是可以測試代碼是否存在錯誤,適合初學者快速上手。另外,Julia包或自定義編寫的Julia程序可以使用include包含在REPL中。接下來,我們打開文本編輯器來編寫第一個Julia程序,具體如范例1-1所示。
【范例1-1】第一個Julia程序
這里定義了一個helloworld函數,為后面include包含命令的測試做準備。
01 function helloworld() 02 println("你好Julia") 03 end
代碼01行定義了一個helloworld函數,02行調用了println函數輸出數據,03行的end用來標記函數結束。
我們將其保存為名為hello.jl的文件。現在不用糾結于具體的語法,這里僅僅定義了一個函數并讓其輸出一行“你好Julia”。接下來,在REPL中將這個文件包含進來,并調用其中的函數,具體如圖1-14所示。

圖1-14 在REPL中包含Julia文件
這里通過include函數將hello.jl包含進來,路徑視存儲hello.jl文件的位置而定。在包含文件之后,我們就可以在REPL中調用在該文件中定義的函數了。
當在REPL中包含文件時,可以看到它提供了有關文件中函數的信息,我們可以使用該功能將文件中所有函數的信息都打印到終端。Julia還會將所有在REPL中編寫的命令存儲在.juliahistory文件夾中,它位于Windows上的C:\Users\%username%目錄或者Linux和macOS上的~/.juliahistory目錄下。這一點與Linux終端類似,我們可以在Julia的shell中使用“Ctrl+R”組合鍵進行反向搜索,來找到之前執行過的命令。
1.5.1 在Julia中使用幫助
在Julia的REPL中還提供了一個功能,即幫助手冊(help),我們可以通過從鍵盤輸入“?”字符來使用這個功能。在輸入“?”后提示符將更改為:
help?>
它提供Julia中函數、類型、宏以及運算符等的詳細信息。比如讓它顯示我們剛剛使用過的include函數信息,如圖1-15所示。
Julia還提供了使用REPL常規shell命令的功能,我們可以通過從鍵盤輸入“;”字符來使用REPL中的shell。在輸入“;”后提示符將更改為:
shell>
這里嘗試使用ls命令(在Windows中是dir)列出當前目錄中的文件,并嘗試通過ping與baidu.com進行數據通信,如圖1-16所示。通過REPL的這個特性,不用離開Julia就可以完成那些需要在終端完成的任務。

圖1-15 include函數信息

圖1-16 在Julia中使用shell
在Julia中還有一些交互式功能和宏,利用它們可以顯著地提高編碼效率,進而提升生產力。下面列出其中幾個比較有代表性的功能和宏。
? varinfo():顯示當前存在的全局符號信息,如圖1-17所示。

圖1-17 使用varinfo顯示全局符號信息
? @which:顯示函數定義的具體信息。比如下面的代碼,在代碼01行中,通過which命令來查詢sin函數的具體信息,02行顯示的就是sin函數的具體信息結果,包括函數名、參數類型、聲明位置等。
01 julia> @which sin(10) 02 sin(x::Real) at math.jl:204
? versioninfo():在啟動Julia REPL時,顯示一部分版本信息,如果想了解更詳細的信息,則可以使用versioninfo()。比如下面的代碼,在代碼01行中,我們調用了該函數,02~09行均為顯示結果。其中02行顯示了所使用的Julia版本,05行顯示了計算機的系統信息,06行顯示了計算機的CPU信息等。
01 julia> versioninfo() 02 Julia Version 0.7.0 03 Commit a4cb80f3ed (2018-08-08 06:46 UTC) 04 Platform Info: 05 OS: macOS (x86_64-apple-darwin14.5.0) 06 CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz 07 WORD_SIZE: 64 08 LIBM: libopenlibm 09 LLVM: libLLVM-6.0.0 (ORCJIT, skylake)
? edit("anyfileinhomedirectory"):用于編輯主目錄中的文件。默認打開的編輯器會根據所使用的操作系統而不同,比如在macOS中默認打開的是vim。
? less("anyfileinsamedirectory"):其類似于在shell中將文件顯示出來的應用程序。
? clipboard("some_text"):可以將一些信息復制到系統的剪貼板中。
? clipboard():可以將鍵盤內容粘貼到REPL中。在將一些命令從其他地方復制到REPL中時它很有用。
? dump():在屏幕上顯示Julia對象的信息。
? workspace():擦除我們之前聲明的所有變量,創造一個全新的、干凈的工作區。
1.5.2 REPL中的圖表
REPL的功能十分強大,甚至可以在REPL中創建圖表——雖然只是一些很簡單的圖表,但看起來相當不錯,并且僅占用少量的資源。要實現這個功能,需要添加一個包。我們可以通過下面這行代碼,添加繪圖所需要的包。
julia> Pkg.add("UnicodePlots")
UnicodePlots包由Christof Stocker提供。現在我們就用這個包來繪制一個簡單的圖表,如圖1-18所示。

圖1-18 在REPL中繪制圖表
我們可以使用UnicodePlots包創建很多類似的圖表,例如散點圖、線圖、直方圖等。在后面有關數據可視化的章節中,我們會介紹更多、更強大的繪圖包,用來處理更復雜的數據。
- HTML5+CSS3王者歸來
- Practical Data Analysis Cookbook
- 深入淺出數據科學:Python編程
- Java系統分析與架構設計
- Machine Learning with R Cookbook(Second Edition)
- Mastering Entity Framework
- Mastering Natural Language Processing with Python
- MySQL數據庫管理與開發實踐教程 (清華電腦學堂)
- Flux Architecture
- jQuery開發基礎教程
- Learn React with TypeScript 3
- Learning Apache Karaf
- Data Science Algorithms in a Week
- 基于GPU加速的計算機視覺編程:使用OpenCV和CUDA實時處理復雜圖像數據
- Java Web應用開發