Julia

Juliaは数値計算や機械学習に向いたプログラミング言語です。この記事では、入門者向けにJuliaプログラミングをご紹介します。

インストール

LinuxへJuliaをインストールするには、julialang.org からJuliaをダウンロードする。

ダウンロードしたJuliaを展開する。

$ cd /home/tsuka/Downloads
$ tar xzf julia-1.5.3-linux-x86_64.tar.gz

適当な場所へ配置する。

$ cd /usr/local/bin
$ sudo mv /home/tsuka/Downloads/julia-1.5.3 .
$ sudo chown -R root:root julia-1.5.3

/usr/bin にシンボリックリンクを作成する。

$ cd /usr/bin
$ sudo ln -s /usr/local/bin/julia-1.5.3/bin/julia julia

バージョンアップの際は、シンボリックリンクを再作成する。古いバージョンは削除してよいが、残しておけばシンボリックリンクの向き先を変更するだけで古いバージョンに戻すことができる。

REPL

Juliaをアイコンから実行するか、シェルからJuliaを引数なしで実行すると、REPLが起動する。

REPL とは Read-eval-print loop の略称で、対話型評価環境のことである。

JuliaのREPLには、次に示す3つのモードがある。

Juliaモード

JuliaのREPLを起動すると、初めはJuliaモードになっている。

REPLがJuliaモードの場合、プロンプトは次のように表示される。

julia>

Juliaモードでは入力したコードが評価されて、その結果が表示される。

julia> 1 + 2
3

julia>

パッケージモード

REPLのJuliaモードで「]」を入力すると、パッケージモードに切り替わる。

REPLがパッケージモードの場合、プロンプトは次のように表示される。

(@v1.5) pkg>

※表示はJuliaのバージョンによって異なる。

パッケージモードでは、Juliaにパッケージを追加できる。

たとえば、Julia に HTTP.jl パッケージを追加するには、REPLのパッケージモードで次のように入力する。

(@v1.5) pkg> add HTTP

※拡張子の .jl は指定しない。

パッケージモードを終了してJuliaモードへ戻るには、Backspaceキーを押す。

ヘルプモード

REPLのJuliaモードで「?」を入力すると、ヘルプモードに切り替わる。

REPLがヘルプモードの場合、プロンプトは次のように表示される。

help?>

ヘルプモードでは、入力したキーワードについてのヘルプが表示される。

help?> println
search: println printstyled print sprint isprint

  println([io::IO], xs...)

  Print (using print) xs followed by a newline. If io is not supplied, prints to stdout.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> println("Hello, world")
  Hello, world

  julia> io = IOBuffer();

  julia> println(io, "Hello, world")

  julia> String(take!(io))
  "Hello, world\n"

julia>

ヘルプを表示すると、ヘルプモードを終了してJuliaモードへ戻る。

演算子

%

% は割った余り(剰余)を求める演算子である。実数型(Float16、Float32およびFloat64)の場合は常に0と評価される。

function fizzbuzz(x)
  if x % 15 == 0
    println("FizzBuzz")
  elseif x % 3 == 0
    println("Fizz")
  elseif x % 5 == 0
    println("Buzz")
  else
    println(x)
  end
end

for i = 1:100
  fizzbuzz(i)
end

&&

「x && y」の式は、x と y がどちらも true の場合にのみ true と評価される。Julia言語では、まず x を評価して、x が true の場合にのみ続けて y を評価する。もし x が false であれば y は評価しない。このように結果が明らかになった段階で評価を止めることを「短絡評価」という。

短絡評価の仕組みを利用して、条件分岐処理を行うことができる。たとえば、n の値が0以下の場合にエラーを発生させるには、&& を使って次のようにする。

n <= 0 && error("n must be positive")

もし n が0以下であれば、続いてerror関数が評価(実行)される。もし n が 0より大きければ、error関数は評価されない。

上記のコードは、次のように書くこともできる。

if n <= 0
  error("n must be positive")
end

||

「x || y」の式は、x と y がどちらも false の場合にのみ false と評価される。Julia言語では、まず x を評価して、x が false の場合にのみ続けて y を評価する。もし x が true であれば y は評価しない。このように結果が明らかになった段階で評価を止めることを「短絡評価」という。

短絡評価の仕組みを利用して、条件分岐処理を行うことができる。

たとえば、n の値が0以下の場合にエラーを発生させるには、|| を使って次のようにする。

n > 0 || error("n must be positive")

もし n が0以下であれば、続いてerror関数が評価(実行)される。もし n が 0より大きければ、error関数は評価されない。

上記のコードは、次のように書くこともできる。

if !(n > 0)
  error("n must be positive")
end

>>

>> は右シフト演算子である。

julia> 8 >> 1
4

julia> 8 >> 2
2

julia> 8 >> 3
1

<<

<< は左シフト演算子である。

julia> 1 << 1
2

julia> 1 << 2
4

julia> 1 << 3
8

'c'

Julia言語で文字リテラルを表すには、文字を引用符で囲む。

x = 'x'
y = 'y'

'\u0'

文字リテラルにおいて、文字をUnicodeで表すこともできる。

x = '\u78'
y = '\u79'

Tuple

Tuple(タプル)は、Julia言語のコレクションのひとつである。

Tuple
項目説明
順序性あり
要素の名前なし
値の重複
julia> x = (1, 2.0, "foo")
(1, 2.0, "foo")

julia> typeof(x)
Tuple{Int64,Float64,String}

julia> x[1]
1

julia> for i in x
         println(i)
       end
1
2.0
foo

NamedTuple

NamedTuple(名前付きタプル)は、Julia言語のコレクションのひとつである。

NamedTuple
項目説明
順序性あり
要素の名前あり
値の重複
julia> x = (a = 1, b = 2.0, c = "foo")
(a = 1, b = 2.0, c = "foo")

julia> typeof(x)
NamedTuple{(:a, :b, :c),Tuple{Int64,Float64,String}}

julia> x[1]
1

julia> x.b
2.0

julia> x[:c]
"foo"

julia> for i in x
         println(i)
       end
1
2.0
foo

Array

Array(配列)は、Julia言語のコレクションのひとつである。

Array
項目説明
順序性あり
要素の名前なし
値の重複
julia> x = [1, 2.0, "foo"]
3-element Array{Any,1}:
 1
 2.0
 "foo"

julia> typeof(x)
Array{Any,1}

julia> x[1]
1

julia> for i in x
         println(i)
       end
1
2.0
foo

Dict

Dict(辞書)はキーと値の組み合わせのコレクションである。いわゆる連想配列である。

Set
項目説明
順序性なし
要素の名前あり
値の重複

Dictのイテレーションでは、キーと値を取り出すことができる。

x = Dict("a" => 1, "b" => 2)

for (key, value) in x
  println(key)
end

Dictに指定したキーが含まれるかどうかは、haskey関数で調べられる。

julia> x = Dict("a" => 1)
Dict{String,Int64} with 1 entry:
  "a" => 1

julia> haskey(x, "a")
true

julia> haskey(x, "b")
false

Dictにキーと値を追加するには、次のようにする。

x = Dict("a" => 1)
x["b"] = 2

Set

Set(集合)は、Julia言語のコレクションのひとつである。キーのみを格納でき、値は重複できない。

Set
項目説明
順序性なし
要素の名前なし
値の重複不可
julia> x = Set([1, 2.0, "foo"])
Set{Any} with 3 elements:
 "foo"
 2.0
 1

julia> typeof(x)
Set{Any}

julia> for i in x
         println(i)
       end
foo
2.0
1

deleteat!()

deleteat!() はコレクションの指定位置から要素を削除する関数である。

julia> x = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> deleteat!(x, 2)
2-element Array{Int64,1}:
 1
 3

eltype()

eltype() はコレクションの型を返す関数である。

julia> eltype((1, 2))
Int64

julia> eltype(("foo", "bar"))
String

julia> eltype((1, "foo"))
Any

empty!()

empty!() はコレクションを空にする関数である。ただし、タプルや名前付きタプルを空にすることはできない。

julia> x = [1, 2]
2-element Array{Int64,1}:

julia> empty!(x)
Int64[]

julia> x = Dict("a" => 1, "b" => 2)
Dict{String,Int64} with 2 entries:
  "b" => 2
  "a" => 1

julia> empty!(x)
Dict{String,Int64}()

julia> x = Set([1, 2])
Set{Int64} with 2 elements:
  2
  1

julia> empty!(x)
Set{Int64}()

insert!()

insert!() はコレクションの指定位置に要素を挿入にする関数である。

julia> x = [1, 2]
2-element Array{Int64,1}:
 1
 2

julia> insert!(x, 2, 3)
3-element Array{Int64,1}
 1
 3
 2

isempy()

isempty() はコレクションが空かどうかをブール値で返す関数である。

julia> isempty(())
true

julia> isempty((1))
false

julia> isempty((a = 1, b = 2))
false

julia> isempty([])
true

julia> isempty([1])
false

julia> isempty(Dict())
false

julia> isempty(Dict("a"=>1))
true

julia> isempty(Set([]))
true

julia> isempty(Set([1]))
false

length()

length() はコレクションの要素数を返す関数である。

julia> length((1, 2))
2

julia> length((a = 1, b = 2))
2

julia> length([1, 2])
2

julia> length(Dict("a"=>1, "b"=>2))
2

julia> length(Set([1, 2]))
2

pop!()

pop!() はコレクションの末尾から要素を取り出す関数である。取り出した要素はコレクションから削除される。

julia> x = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> pop!(x)
3

julia> x
2-element Array{Int64,1}:
 1
 2

popfirst!()

popfirst!() はコレクションの先頭から要素を取り出す関数である。取り出した要素はコレクションから削除される。

julia> x = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> popfirst!(x)
1

julia> x
2-element Array{Int64,1}:
 2
 3

push!()

push!() はコレクションの末尾に要素を追加する関数である。

julia> x = [1, 2]
2-element Array{Int64,1}:
 1
 2

julia> push!(x, 3)
3-element Array{Int64,1}:
 1
 2
 3

pushfirst!()

push!() はコレクションの先頭に要素を追加する関数である。

julia> x = [2, 3]
2-element Array{Int64,1}:
 2
 3

julia> pushfirst!(x, 1)
3-element Array{Int64,1}:
 1
 2
 3

union()

unioin() はコレクションの和集合を返す関数である。引数に渡したコレクションのすべての値を含むコレクションを返す。

julia> union((1, 2, 3), (2, 3, 4))
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> union([1, 2, 3], [2, 3, 4])
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> union((1, 2), (3, 4), (5, 6))
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

intersect()

intersect() はコレクションの積集合を返す関数である。引数に渡したコレクションのすべてに含まれる値のコレクションを返す。

julia> intersect((1, 2, 3), (2, 3, 4))
2-element Array{Int64,1}:
 2
 3

julia> intersect([1, 2, 3], [2, 3, 4])
2-element Array{Int64,1}:
 2
 3

julia> intersect((1, 2, 3), (2, 3, 4), (3, 4, 5))
1-element Array{Int64,1}:
 3

endswith()

endswith() は指定した文字列で終わるかどうかを返す関数である。

julia> endswith("Julia", "ia")
true

julia> endswith("Julia", "IA")
false

findfirst()

findfirst() は指定した文字列の位置を返す関数である。

julia> findfirst("uli", "Julia")
2:4

join()

join() は指定した文字列のコレクションを結合して返す関数である。

julia> join(["Julia", "Language"], "-")
"Julia-Language"

length()

length() は文字列の長さ(文字数)を返す関数である。

julia> length("Julia言語")
7

repeat()

repeat() は文字列を指定した回数分繰り返した文字列を返す関数である。

julia> repeat("Julia", 3)
"JuliaJuliaJulia"

replace()

replace() は指定した文字列で置き換える関数である。

julia> replace("Junior", "nior" => "lia")
"Julia"

split()

split() は指定した文字列で分割する関数である。

julia> split("Julia-Language", "-")
2-element Array{SubString{String},1}:
 "Julia"
 "Language"

startswith()

startswith() は指定した文字列で始まるかどうかを返す関数である。

julia> startswith("Julia", "Ju")
true

julia> startswith("Julia", "JU")
false

run()

run() は外部プログラムを実行する関数である。

julia> run(`ls -a`)
.bash_history .bashrc

キーワード引数

Juliaの関数は、引数を名前ではなくキーワードで識別することができる。

function f(a; b=2)
  a ^ b
end

println(f(2))
println(f(2, b=3))

const

スコープ(有効範囲)がグローバルな定数を宣言するには、const 修飾子を指定する。

ただし警告は出るものの、型を変更しなければ値を変えることができる。つまり、型を変更できない変数となる。

julia> const x = 1.0
1.0

julia> const x = 2
ERROR: invalid redefinition of constant x
Stacktrace:
 [1] top-level scope at REPL[3]:1

julia> const x = 2.0
WARNING: redefinition of constant x. This may fail, cause incorrect answers, or produce other errors.
2.0

error()

指定したメッセージでErrorExceptionを発生させる。

error("wrong argument")

exit()

プログラムを停止する。既定の終了コードは0で、プログラムが正常に完了したことを示す。

exit()

終了コードを使用してプログラムを停止する。

exit(1)

open()

ファイルをreadモードでオープンする。

f = open("example.txt", "r")

ファイルをwriteモードでオープンする。

f = open("example.txt", "w")

ファイルをappendモードでオープンする。

f = open("example.txt", "a")

open() do

オープンしたファイルを自動的にクローズするために、open() do という構文が用意されている。

open("example.txt") do f
  for l in eachLine(f)
    println(l)
  end
end

open do に対応する end に達すると、ファイルが自動的にクローズされる。

occursin

occursinは第1引数に指定した文字列が第2引数に含まれていればtrue、含まれていなければfalseを返す。第1引数には正規表現を指定できる。

file = "index.html"
if occursin(r"[a-zA-Z]*html$", file)
  println(file)
end

ソート

Julia 言語で配列の値をソート(並び替え)するには、sort 関数を使う。

julia> sort([3, 1, 2])
3-element Array{Int64,1}:
 1
 2
 3

デフォルトでは昇順(小さい順)でソートされる。

降順

降順(大きい順)にソートするには、rev 引数に true を指定する。

julia> sort([3, 1, 2], rev=true)
3-element Array{Int64,1}:
 3
 2
 1

アルゴリズム

alg 引数にソートのアルゴリズムを指定することもできる。次のアルゴリズムを指定できる。

julia> sort([3, 1, 2], alg=InsertionSort)
3-element Array{Int64,1}:
 1
 2
 3

Base.Libc.strftime

時刻を指定したフォーマットに変換した文字列で返す。指定できるフォーマットは標準Cライブラリと同じ。

フォーマット説明
%d
%H24時間表記の時
%I12時間表記の時
%m
%M
%S
%y西暦の下2桁
%Y4桁の西暦
lastmod = Libc.strftime("%Y-%m-%d", mtime(path))

CSV.jl

JuliaからCSV形式のデータを扱うには、CSVパッケージとDataFramesパッケージが必要になる。

JuliaのREPLでCSVパッケージとDataFramesパッケージを追加する。

julia> using Pkg

julia> Pkg.add("CSV")

julia> Pkg.add("DataFrames")

CSV.read()

CSVファイルからデータを読み込むには、read関数を使う。特定の列を抽出するには、1から始まる列番号を指定する。

using CSV
using DataFrames

df = CSV.read("./quotes.csv", DataFrame)

dates = df[!,1]
names = df[!,2]

println(dates)
println(names)

CSVファイルにヘッダ行があれば、抽出する列を列名で指定することもできる。

using CSV
using DataFrames

df = CSV.read("./quotes.csv", DataFrame)

println(df.Date)
println(df.Name)