Juliaの基本構文
オブジェクトの型を調べる
$ typeof()
関数のメソッドを調べる
$ methods()
配列の宣言
ベクトルと行列
;は改行と思っているあんも.icon
多次元配列における;;は改行の改行
code:vetor&matrix.jl
mat = [1 2
3 4] # こうすると実際の表記に合う
transpose(mat) # 転置
mat' # これでもできる(糖衣構文)
column_mat = 1; 2; 3;; # 縦1列の行列も定義できるが、通常のベクトル型で十分 # 多次元配列
multidimensional_array = [1 3
2 4
;;;
5 7
6 8]
内包表記
Pythonなどで使えるリスト内包表記と同等の機能がある
code:array.jl
# 多次元配列も生成できる
# [~ for x=1:N, y=1:M, z=1:L]とするとN×M×Lサイズの3次元配列が生成できる
配列の演算
code:array-operation.jl
# .を演算子につけてブロードキャストする
vec .+ 1
mat .* 2
sin.(vec)
# 要素ごとの演算
vec .* vec # vec_1by3 .^2 と等価
dot(vec, vec) # ドット積(内積)
cross(vec, vec) # クロス積(外積)
horizontal_concatenation = mat mat # 横並び連結(水平連結) vertical_concatenation = mat; mat # 積み上げ連結(垂直連結) リテラル
literal
式展開が便利あんも.icon
変数の埋め込みが簡単にできる
タプルのうまい使い方がわからないあんも.icon
イミュータブルなのがいいのかな?
code:literal.jl
### 数値リテラル
## 整数値
0x123456789abcddef # 16進表記リテラル UInt64
0o1234567 # 8進リテラル UInt32
0b11010101 # 2進リテラル UInt8
## 浮動小数点数値
1.0e-17 # 指数表記 Float64
1.0f0 # 指数表記 Float32
## 有理数
1//2 # Rational{Int64}
## 複素数
1 + im # Complex{Int64}
### 文字のリテラル
'あ' # 文字リテラル Char
"abc" # 文字列リテラル String
## 式展開 interpoolation
x = 1
"x = $x"
"x = $(x)x$x" # ()で囲むと位置を明示できる
## raw文字列リテラル
# エスケープシーケンスのかかかる文字列をそのまま流し込める
raw"C:\Users\user\Lecture" # Windowsのファイルパス
# 正規表現リテラル
### 範囲リテラル 最初の値:<ステップ数(既定は1)>:最後の値
1:5 # [1, 2, 3, 4, 5]と等価
### タプルリテラル
(1, 2) # Tuple{Int64, Int64}
(1, ) # 値が1つのタプル Tuple{Int64}
# 名前つきタプル
(c='a', i=2, fp=99.9, pi=π) # NamedTuple{(:c, :i, :fp, :pi), Tuple{Char, Int64, Float64, Irrational{:π}}}
配列リテラル
組み込み定数
$ pi # \pi + Tab
虚数単位
$ im
$ ℯ # \euler + Tab
code:builtin-constants.jl
Inf # 正の無限大
NaN # Not a Number;NaN 0/0やInf-Infのような不定形を表す
nothing # 値が存在しないことを示す
missing # 欠損値 値が存在するが不明であることを示す
演算子
除算
code:operator.jl
x / y # 真の除算
x ÷ y # 切り捨て除算 \div + Tab
x // y # 有理数除算 分数(有理数)のまま保持する 浮動小数点数には定義されない
x \ y # y/xと等価
x % y # 割り算のあまり
論理演算子
if文で使うかもしれない
code:operator.jl
!x # 論理否定 ¬x
x && y # 論理積 x ∧ y
x || y # 論理和 x ∨ y
x ⊻ y # 排他的論理和 x ⊻ y
文字列操作
$ "Hello " * "World!"
3項演算子
code:operator.jl
condition ? true_expression : false_expression
# これと等価
if condition
true_expression
else
false_expression
end
代入
code:assignment.jl
const one = 1 # 定数代入 完全な定数代入ではない(同じ型の場合に変更を受け付けてしまう)
x_1, x_2, x_3 = 1, 2, 3 # 一括代入
y_1, y_2, y_3, y_4 = 4; 5; 6 # 代入先が余っているとエラーになる 関数
引数
スプレッド演算子は便利
配列の長さが固定ではないとき
大量の引数を一度に関数に渡す必要があるとき
code:func-arguments.jl
# オプショナル引数として、後方に省略可能な引数を指定できる
funcWith3Arg(x, y=0, z=0) = x+y+z
# 通常は1つの引数を受ける。キーワード引数として、keyword=valueで順不同で指定できる
funcWithKeywordArg(x; y=1, z=1) = x+y+z
# スプレッド演算子による引数の展開
nums = (1, 1//2, 2.5)
promote(numbers...) # promote(nums[1], nums[2], nums[3])と等価
# キーワード引数をタプルで格納して展開できる
params = (framestyle=:origin, legend = false)
x = 0:0.1:10
plot(x, x.^2; params...)
# 多重定義
add(a, b) = a+b # add()のメソッドは1つ
add(a, b, c) = a+b+c # add()のメソッドが2つになる
# 可変長引数を使った定義もできる
function add(a, b, c...)
add(a+b, c...)
end
関数適用演算子
code:operator-for-func.jl
1:2:20 |> sum |> sqrt |> println # パイプライン演算子 多重ネストするよりマシ
(println ∘ sqrt ∘ sum)(1:2:20) # ∘は\circ+Tab
無名関数
code:anonymous-func.jl
squared_arr = (x -> x^2).(arr) # ブロードキャストできる
squared_arr = map((x -> x^2), x)
filtered_arr = filter(x -> x%2 == 0, arr) # 2で割ったあまりが0のものを抜き出す
ブロック構文
繰り返し
code:control-structures.jl
# if文
x = 10
if x > 0
println("xは正の数です")
else
println("xは非正の数です")
end
# forループ
for i in 1:5
println("iの値は $i です")
end
# whileループ
n = 5
while n > 0
println("nの値は $n です")
n -= 1
end
Doブロック構文
code:do-block.jl
map(1:10) do x # map(x -> x^2, 1:10)と等価
x^2
end
# ファイルの読み書きに使える
open("sample.txt") do f
for line in eachline(f)
println(line)
end
end
# Doブロックなしで書くとめんどくさい close()しないといけない
f = open("sample.txt");
try
for line in eachline(f)
println(line)
end
finally
close(f)
end
beginブロック
ローカルスコープを作らない
手続き的な処理を、処理の目的に注目しながらまとめて書ける
これ便利だあんも.icon
code:begin-block.jl
y = begin
x = rand() * 10
a = cos(x)
b = sin(x)
a * a + b * b
end
# 実行時間を計測する区間を指定できる
@time begin
# 複数の式
end
letブロック
ハードスコープを作る
ブロック内で宣言・利用された変数は、そのブロック内でのみ有効になる
code:let-block.jl
c = d = 0.0
let
y = rand() * 10
c = cos(y)
d = sin(y)
c * c + d * d
end
c # 0.0
d # 0.0
y # ERROR: UndefVarError: y not defined
# キーワード引数の指定のように変数代入を書ける
x = Float64(π); y = 1.0; a = b = 0.0
let x = x, y = y
x, y = y, x
a = cos(x)
b = sin(x) * cos(y)
c = sin(x) * sin(y)
a * a + b * b + c * c
end
x, y, a, b