Julia机器学习核心编程:人人可用的高性能科学计算
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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包创建很多类似的图表,例如散点图、线图、直方图等。在后面有关数据可视化的章节中,我们会介绍更多、更强大的绘图包,用来处理更复杂的数据。