Julia Essentials のまとめ
julia perl python r rubyTable of Contents
#+File Created:
#+Last Updated:
https://lectures.quantecon.org/jl/julia_essentials.html
をもとにして, julia 言語での書き方を見てみたのでその記録.
混乱は忘却の素ともいうので, 自分がちょっとだけ知ってる他の言語での書き方との違いを比較しながらみていこうと思う.
1 Common Data Types
まずは基本的な型についてみていく.
Julia は他の script 言語とひかくして
型の取扱いがちょっとめんどくさい印象.
1.1 真偽値
true, false は言語によって微妙に取扱いがことなる.
0 を true/false どちらに入れるかとか?
各言語でどーなってるのか比較.
1.1.1 julia
typeof: Bool
値: true, false
julia では Boolian 値は true, false (全部小文字)
0, 1 は自動で Bool に直してくれない(java と同じ).
いちいち convert(型, 値) としないといけないようです.
http://docs.julialang.org/en/release-0.4/manual/conversion-and-promotion/
julia のこの型指定, これからも色々と出て来るみたいだけどちょっと面倒なかんじ.
# true, false が予約語(小文字で書く) x=true println(x) # 型は Bool 型 println(typeof(x)) # こんな感じでかける. y= 1 > 2 println(y) @printf("T+F = %d\n",true + false) # 数値に直すと true は 1, false は 0 @printf("sum=%d\n",sum([true,false,false,true])) #if(1) とかやると error となる. 以下の様に書く必要がある. if(convert(Bool,1)) println("1 is true") end #if(0) とか書くとこれも error となる if(convert(Bool,0)) println("pass") else println("0 is false") end
true Bool false T+F = 1 sum=2 1 is true 0 is false
1.1.2 perl
perl には, true, false に相当する語句がない?
0, '0', undef, '', (), ('') は false
それ以外は true
1: use strict; 2: use warnings; 3: # 参照: 4: # http://stackoverflow.com/questions/1036347/how-do-i-use-boolean-variables-in-perl 5: print "true\n" if(1); 6: print "false\n" unless(0);
true false
1.1.3 python
python は, True, False(一文字目が大文字)
1 は True. 0 は False
1: if(True): 2: print("True") 3: 4: if(False): 5: pass 6: else: 7: print("False") 8: 9: if(1): 10: print("1 is True") 11: 12: if(0): 13: pass 14: else: 15: print("0 is False")
True False 1 is True 0 is False
1.1.4 R
R は TRUE, FALSE (全部大文字)
1 は TRUE, 0 は FALSE
1: if(TRUE) { 2: print("TRUE") 3: } 4: if(FALSE) { 5: print("pass") 6: } else { 7: print("FALSE") 8: } 9: if(1) { 10: print("1 is TRUE") 11: } 12: if(0) { 13: print("pass") 14: }else { 15: print("0 is FALSE") 16: }
[1] "TRUE" [1] "FALSE" [1] "1 is TRUE" [1] "0 is FALSE"
1.1.5 Ruby
Ruby は true/TRUE どっちでもいいのか?
他の言語と違い 0 は true!! (何かやな感じ)
false と nil 以外は true として扱われる.
1: if(TRUE) 2: puts("TRUE") 3: end 4: 5: if(true) 6: puts("true") 7: end 8: 9: if(false) 10: else 11: puts("false") 12: end 13: 14: puts("FALSE") unless(FALSE) 15: puts("nil is FALSE") unless(nil) 16: 17: if(0) 18: puts("0 is true!!") 19: end
TRUE true false FALSE nil is FALSE 0 is true!!
1.1.6 まとめ
微妙に違ってて間違えそう.
表でまとめておく.
言語 | true を示すもじ | 0 の扱い |
---|---|---|
julia | true | false (convert(Bool,0) |
perl | 1 | false |
python | True | false |
R | TRUE | false |
ruby | true/TRUE | true |
もう既にまとめがあったのでこっちを参照した方がよいでしょう.
http://blog.mirakui.com/entry/20090604/truefalse
1.2 整数及び浮動小数点
1.2.1 julia
typeof: Int64, Float64
# 1.0 と書くと自動で Float64 # 1 と書くと自動で Int64 println("type of 1.0=",typeof(1.0)) println("type of 1 =",typeof(1)) x=2 y=1.0 # 自動で型を Float64 にしてくれる. println("x*y=",x*y) # 累乗は ^ で書く(** ではない. LaTeX 数式) println("x^2=",x^2) println("y/x=",y/x) # 2*x は 2x と書ける(必要あるのかな...) println("2x-3y=",2x-3y) # +, * を関数とみなして後ろに引数, 的な書き方もできる. # なるほど. 一貫してていいような. println("10+20=",+(10,20)) println("10*20=",*(10,20)) # 複素数 im # あんまり使わないと思うけどとりあえず書いておく. x=1+2im println("1+2i=",x) y=1-2im println("1-2i=",y) x*y println("x*y=",x*y) # "" の中で変数を書かせたいときは, $変数 と書くとよい. println("x=$x") println("x+y=$(x+y)")
type of 1.0=Float64 type of 1 =Int64 x*y=2.0 x^2=4 y/x=0.5 2x-3y=1.0 10+20=30 10*20=200 1+2i=1 + 2im 1-2i=1 - 2im x*y=5 + 0im x=1 + 2im x+y=2 + 0im
julia が他のと違うのは, 2x 的な表現で書けること位.
何か気持ち悪いので多分使わないと思うけど…
以下別の言語でどーかくのか.
累乗だけ書いておきます.
1.2.2 perl
use strict; use warnings; my $x=10; my $y=$x**3; print $y."\n";
1000
1.2.3 python
x=10 y=x**3 print(y)
1000
1.2.4 R
x <- 10 y <- x**3 y z <- x^3 # これもいける!! z
[1] 1000 [1] 1000
1.2.5 ruby
x = 10
y = x**3
puts y
1000
1.2.6 まとめ
一応まとめておきます.
julia だけ累乗は 2^3 みたいに書くらしい.
こういうオリジナリティいらないんだけどなー(注: R でも同じように書けるっぽい).
ついつい 2**3 って書いてしまいそう.
言語 | 累乗 |
---|---|
julia | 2^3 |
perl | 2**3 |
python | 2**3 |
R | 2**3 |
ruby | 2**3 |
1.3 文字列
typeof: String
文字列操作は自分の場合 perl でやったほうが早そう.
なので julia での書き方だけさらっと見ておく.
1: # 文字列の連結には, 何と "*" を使う. 2: # 何でこの記号なのか... 3: # わからんけど何か深い理由があるんだろう. 4: # つーか perl と同じ "." とか python, Java の "+" でいいような... 5: fb = "foo" * "bar" 6: println("concat foo and bar = foo * bar: ",fb) 7: 8: s="Charlie don't surf" 9: # perl でもおなじみの split 関数 10: println(split(s)) 11: 12: # 文字列の置換 13: # この辺は実際に使うようになってから詳しく調べよう 14: println(replace(s,"surf","ski")) 15: 16: # split(文字列,分割文字) 17: println(split("fee,fi,fo",",")) 18: 19: # trim 20: # 前後の空白取り除きには strip という関数がある. 21: println(strip(" foobar ")) 22: 23: # 文字列の中から数値をみつける. 24: println(match(r"(\d+)","Top 10"))
concat foo and bar = foo * bar: foobar SubString{String}["Charlie","don't","surf"] Charlie don't ski SubString{String}["fee","fi","fo"] foobar RegexMatch("10", 1="10")
1.4 タプル
1.4.1 julia
typeof: Tuple, Array
1: # tuple の宣言 2: # x = ("foo","bar") でもよい. 3: # x = "foo", "bar" でもよい. 4: x=tuple("foo","bar") 5: println(x) 6: println(typeof(x)) 7: w1, w2 = x 8: println(w1) 9: print(length(x))
("foo","bar") Tuple{String,String} foo 2
1.4.2 python
python での宣言
x=tuple([1,2,3]) y=(2,3,4) z=x+y print(z) print(type(z)) print(len(z)) for p in z: print(p)
(1, 2, 3, 2, 3, 4) <class 'tuple'> 6 1 2 3 2 3 4
1.4.3 まとめ
まとめ表です.
言語 | 宣言 | 長さ |
---|---|---|
julia | tuple(1,2,3) | length(x) |
python | tuple([1,2,3]) | len(x) |
1.5 配列
1.5.1 julia
julia では配列の添字は 1 はじまり!!
1: # 配列の宣言 2: x= [10,20,30,40] 3: println(x) 4: println(typeof(x)) 5: println("x[end ]=",x[end]) 6: println("x[end-1]=",x[end-1]) 7: println("x[1:3] =",x[1:3]) 8: println("x[2:end]=",x[2:end])
[10,20,30,40] Array{Int64,1} x[end ]=40 x[end-1]=30 x[1:3] =[10,20,30] x[2:end]=[20,30,40]
# 文字列と配列 # 部分文字列 println("foobar"[3:end])
obar
配列に関する書き方いろいろ.
1: # 配列について 2: a=[1,2,3] # 列ベクトル 3: @printf("array a = %s\n", a) 4: 5: # "," をつけないでかくこともできる. 6: b=[1 2 3] # 行ベクトルになる. 7: @printf("array b = %s\n", b) 8: 9: # 行列は以下のように宣言 10: mat=[1 4 7; 2 5 8; 3 6 9] 11: @printf("mat[2,1] =%d\n",mat[2,1]) # 2 行 1 列目 12: @printf("mat[1,3] =%d\n",mat[1,3]) 13: @printf("mat[1,end]=%d\n",mat[1,end]) 14: @printf("mat[4] =%d\n",mat[4]) 15: @printf("mat[end] =%d\n",mat[end]) 16: @printf("mat=%s\n",mat) 17: @printf("mat'=%s\n",mat') # 転置行列 には ' をつける 18: @printf("mat'=%s\n",transpose(mat)) # transpose 関数でもよい 19: # exit() 20: 21: col=[1,2,3] # 列ベクトル 22: row=[1 2 3] # 行ベクトル 23: 24: inn=row*col # 1 つしか要素を持たない配列 25: @printf("inner product=%d\n",inn[1]) # 要素は 1 から始まる. 26: 27: # 型の表示 28: println(typeof(inn)) 29: 30: # 配列初期化 31: xs = zeros(Float64,5) # 配列を 0 で初期化 32: print("xs =") 33: println(xs) 34: 35: xs2=[0.0 for i in 1:5] # リスト内包表記 36: @printf("xs2=%s\n",xs2) 37: 38: x1=ones(Float64,5) # 1 で初期化 39: # x1=ones(5) # Float64 は省略可能 40: @printf("x1=%s\n",x1) 41: 42: # 単位行列 43: mt0=eye(Float64,3) 44: @printf("mt0=%s\n",mt0) 45: 46: # 3x4 行列(初期化なし) 47: m34=Array(Float64,(3,4)) 48: # 適当な値が入ってる 49: @printf("m34=%s\n",m34)
array a = [1,2,3] array b = [1 2 3] mat[2,1] =2 mat[1,3] =7 mat[1,end]=7 mat[4] =4 mat[end] =9 mat=[1 4 7; 2 5 8; 3 6 9] mat'=[1 2 3; 4 5 6; 7 8 9] mat'=[1 2 3; 4 5 6; 7 8 9] inner product=14 Array{Int64,1} xs =[0.0,0.0,0.0,0.0,0.0] xs2=[0.0,0.0,0.0,0.0,0.0] x1=[1.0,1.0,1.0,1.0,1.0] mt0=[1.0 0.0 0.0; 0.0 1.0 0.0; 0.0 0.0 1.0] m34=[2.22637e-314 2.22637e-314 0.0 0.0; 2.22619e-314 2.22619e-314 0.0 0.0; 2.22619e-314 2.22619e-314 0.0 0.0]
他言語との比較用
1: ar = [ i*2 for i in 1:9 ] 2: println(length(ar)) 3: push!(ar,1) 4: unshift!(ar,2) 5: pop!(ar) 6: shift!(ar) 7: ax=[1,2] 8: append!(ar,ax) 9: println(ar)
9 [2,4,6,8,10,12,14,16,18,1,2]
1.5.2 perl
1: use strict; 2: use warnings; 3: use Data::Dumper; 4: 5: my $arr=[1 .. 9]; 6: @$arr = map {$_*2} @$arr; 7: 8: print scalar(@$arr)."\n"; 9: push(@$arr,1); # 後ろ くっつけ 10: unshift(@$arr,1); # 前 くっつけ 11: pop(@$arr); # 後ろ 削除 12: shift(@$arr); # 前 削除 13: my @ax=(1,2); 14: push(@$arr,@ax); 15: 16: print Data::Dumper->Dump([$arr]);
9 $VAR1 = [ 2, 4, 6, 8, 10, 12, 14, 16, 18, 1, 2 ];
1.5.3 python
1: arr = [ i*2 for i in range(1,10)] 2: print(len(arr)) # 長さ 3: arr.append(1) # 後ろにくっつける 4: arr.insert(0,2) # 前(0 番目)にくっつける 5: arr.pop() # 後ろを削除 6: arr.pop(0) # 前(0 番目)を削除 7: ax = [1,2] 8: arr.extend(ax) # 後ろにくっつける 9: print(arr)
9 [2, 4, 6, 8, 10, 12, 14, 16, 18, 1, 2]
1.5.4 R
R も添え字は 1 からはじまります.
1: ar <- 2*seq(1:9) 2: length(ar) 3: 4: # push 5: ar <- append(ar,1) 6: # unshift 7: ar <- append(ar,2,1) # append(array,value,index) 8: # pop 9: ar <- ar[-length(ar)] 10: # shift 11: ar <- ar[-1] 12: # extend 13: ax <-c(1,2) 14: ar <-append(ar,ax,length(ar)) 15: ar
[1] 9 [1] 2 4 6 8 10 12 14 16 18 1 2
1.5.5 ruby
1: arr = [*1..9] 2: arr = arr.map {|i| i*2} 3: puts arr.length 4: arr.push(1) 5: arr.unshift(2) 6: arr.pop 7: arr.shift 8: ax = [1,2] 9: arr.concat(ax) 10: print(arr)
9 [2, 4, 6, 8, 10, 12, 14, 16, 18, 1, 2]
1.5.6 numpy
1: import numpy as np 2: ar = np.array([ i*2 for i in range(1,10)]) 3: print(len(ar)) 4: ar = np.append(ar,1) 5: ar = np.insert(ar,0,2) 6: ar = np.delete(ar,-1) 7: ar = np.delete(ar, 0) 8: ax = [1,2] 9: ar = np.append(ar,ax) 10: print(ar)
9 [ 2 4 6 8 10 12 14 16 18 1 2]
1.5.7 まとめ
書き方が似ててややこしいので以下にまとめておく.
言語 | length | push | unshift | pop | shift | extend |
---|---|---|---|---|---|---|
julia | length(a) | push!(a) | unshift!(a) | pop!(a) | shift!(a) | append!(a,x) |
perl | length(@a) | push(@a,$x) | unshift(@a,$x) | pop(@a) | shift(@a) | push(@a,@x) |
python | len(a) | a.append(x) | a.insert(0,x) | a.pop() | a.pop(0) | a.extend(x) |
R | length(a) | append(a,1) | append(a,x,1) | a[-length(a)] | a[-1] | append(a,x,length(a)) |
ruby | a.length | a.push(x) | a.unshift(x) | a.pop | a.shift | a.concat(x) |
numpy | len(a) | np.append(a,x) | np.insert(a,0,x) | np.delete(a,-1) | np.delete(a,0) | np.append(a,x) |
js | a.length | a.push(x) | a.unshift(x) | a.pop() | a.shift() | a.concat(x) |
1.6 辞書(hash)
1.6.1 julia
typeof: Dict
1: # tuple は小文字なのに Dict は大文字. おぼえにくい. 2: # {} ではなく () で囲む. 3: # アクセスは hash["key"] で, 配列と同じような書き方. 4: hash = Dict("name" => "Frodo", "age"=>33) 5: println(typeof(hash)) 6: println("hash=",hash) 7: println("name=",hash["name"]) 8: println("age =",hash["age"])
Dict{String,Any} hash=Dict{String,Any}(Pair{String,Any}("name","Frodo"),Pair{String,Any}("age",33)) name=Frodo age =33
1.6.2 perl
1: use strict; 2: use warnings; 3: use Data::Dumper; 4: my $hash={name=>'Frodo',age=>33}; 5: print Data::Dumper->Dump([$hash]); 6: print $hash->{'name'}."\n"; 7: # print $hash->['name']."\n"; # エラーとなる. 8: # 以下のようにも書ける. 9: my %hash=(name=>'Frodo', agen=>33); 10: print $hash{name}."\n"; 11: # print $hash['name']."\n"; # こんなふうには書けない.
$VAR1 = { 'name' => 'Frodo', 'age' => 33 }; Frodo Frodo
1.6.3 python
1: hash={'name':'Frodo','age':33} 2: print(hash) 3: print(hash['name'])
{'age': 33, 'name': 'Frodo'} Frodo
1.6.4 ruby
1: hash = {'name'=>'Frodo','age'=>33} 2: puts hash 3: puts hash['age']
{"name"=>"Frodo", "age"=>33} 33
1.6.5 js
1: hash = {'name':'Frodo',age:33} 2: console.log(hash) 3: console.log(hash['name'])
{ name: 'Frodo', age: 33 } Frodo
1.6.6 まとめ
以下に書き方をまとめる.
R はパッケージをインストールしないとダメっぽいので省略.
その代わり JavaScript をいれてみた.
言語 | 定義 | アクセス |
---|---|---|
julia | Dict(key:value) | hash["key"] |
perl | {key=>value} | $hash->{key} |
python | {key:value} | hash["key"] |
ruby | {key=>value} | hash["key"] |
js | {key:value} | hash["key"] |
2 Basic file I/O
ファイル書き込み
標準的な書き方でわかりやすい.
ファイルへの書き込みは print ではなく write
1: f=open("newfile.txt", "w") 2: write(f,"testing\n") 3: write(f,"more testing\n") 4: close(f)
ファイル読み込み
readall(f) でファイル中身を読み込み
1: f=open("newfile.txt","r") 2: x=readall(f) 3: print(x) 4: close(f)
testing more testing
file 読み書きについてはまた別途.
3 繰り返し
3.1 julia
for 文は in を使って書く.
python みたいにいちいち ":" を使わなくてよい.
end で終わる ruby みたいな書き方.
終わりがはっきりしててわかりやすいとおもう.
1: actions = ["surf","ski"] 2: for act in actions 3: println("Chalie don't $act") 4: end 5: 6: for i in 1:3 7: println(i) 8: end
Chalie don't surf Chalie don't ski 1 2 3
Dictionary(hash) についての繰り返しもできる.
1: d = Dict("name"=>"Frodo","age"=>33) 2: println(keys(d)) 3: println(typeof(keys(d))) 4: # collect で Array にする 5: println(collect(keys(d))) 6: println(typeof(collect(keys(d))))
String["name","age"] Base.KeyIterator{Dict{String,Any}} String["name","age"] Array{String,1}
1: d = Dict("name"=>"hoge","age"=>32) 2: println(keys(d)) 3: for k in keys(d) 4: @printf("key=%s value=%s\n",k,d[k]) 5: end 6: println(collect(keys(d))) 7: for k in collect(keys(d)) 8: @printf("key=%s value=%s\n",k,d[k]) 9: end
String["name","age"] key=name value=hoge key=age value=32 String["name","age"] key=name value=hoge key=age value=32
どっちもけっかは一緒のようだ.
1: x_values=[1,2,3,4] 2: for x in x_values 3: println(x*x) 4: end 5: 6: for i in 1:length(x_values) 7: println(x_values[i] * x_values[i]) 8: end
1 4 9 16 1 4 9 16
二つの配列を同時に回すときは
zip という関数を使えばよいらしいです.
python の zip と同じ感じ.
便利.
1: countries=("Japan","Korea","China") 2: cities =("Tokyo","Seoul","Beijing") 3: for (cont,city) in zip(countries,cities) 4: println("The capital of $cont is $city") 5: end
The capital of Japan is Tokyo The capital of Korea is Seoul The capital of China is Beijing
python enumerate と同様な感じでも書けるみたい
1: countries=("Japan","Korea","China") 2: cities =("Tokyo","Seoul","Beijing") 3: for (i,cont) in enumerate(countries) 4: city = cities[i] 5: println("The capital of $cont is $city") 6: end
The capital of Japan is Tokyo The capital of Korea is Seoul The capital of China is Beijing
以下比較用のるーぷ
1: for i in 1:9 2: println(i) 3: end
1 2 3 4 5 6 7 8 9
3.2 perl
1: use strict; 2: use warnings; 3: 4: my @ar=(1..9); 5: for (@ar) { 6: print $_."\n"; 7: }
1 2 3 4 5 6 7 8 9
3.3 python
range(1,10) と書くと 1 から 9 までな点にちゅういする.
1: for i in range(1,10): 2: print(i)
1 2 3 4 5 6 7 8 9
3.4 ruby
1: for i in 1..9 2: puts i 3: end
1 2 3 4 5 6 7 8 9
3.5 R
1: for(x in 1:9) { 2: print(x) 3: }
[1] 1 [1] 2 [1] 3 [1] 4 [1] 5 [1] 6 [1] 7 [1] 8 [1] 9
3.6 js
1: var ar=[] 2: for(var i=1;i<10;i++) { 3: ar.push(i); 4: // console.log(i) 5: } 6: for(var x of ar) { 7: console.log(x); 8: } 9: console.log(Array.from(new Array(9),(val,index)=>index+1));
1 2 3 4 5 6 7 8 9 [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
3.7 まとめ
for 文のかきかたまとめ.
言語 | for 文 | range 1 から 9 まで |
---|---|---|
julia | for x in ar … end | 1:9 |
perl | for (@ar) {} | (1..9) |
python | for x in ar: | range(1,10) |
ruby | for x in ar … end | 1..9 |
R | for(x in ar) {} | 1:9 |
js | for(x of ar) {} |
3.8 内包表記
3.8.1 julia
julia でのリスト内包表記いろいろ
dbls = [2i for i in 1:4] # 2x 的な書き方をつかってます println(dbls) anmls = ["dog","cat","bird"] pls = [a * "s" for a in anmls] # * は文字列連結の意味であることに注意 println(pls) # 内包表記で二次元配列も作れる # python でも出来るんだろーか? p = [i+j for i in 1:3, j in 4:6] println(p) # 辞書(hash) もこれで作れる h = ["$i" => i for i in 1:3] println(h)
[2,4,6,8] String["dogs","cats","birds"] [5 6 7; 6 7 8; 7 8 9] Dict("1"=>1,"2"=>2,"3"=>3)
3.8.2 python
python でのかきかた
1: dbls=[ 2*i for i in range(1,5)] 2: print(dbls) 3: 4: anmls = ["dog","cat","bird"] 5: pls = [ a + "s" for a in anmls] 6: print(pls) 7: 8: # 行列は無理っぽい 9: # p = [i+j for i in range(1,4), j in range(4,7)] 10: 11: # hash もそのままでは無理っぽい 12: # h = [ i=>i for i in range(1,4)]
[2, 4, 6, 8] ['dogs', 'cats', 'birds']
4 比較
4.1 julia
1: x=1 2: 3: # x==2 であるかどうか. false 4: println(x==2) 5: 6: # x が 3 じゃないかどうか. true 7: println(x!=3) 8: 9: # こんな感じでも書ける 10: println(1<2<3) 11: println(1<=2<=3) 12: 13: # 上でもかいたけど 1 は自動で true に変換してくれない 14: if(convert(Bool,1)) 15: println("convert(Bool,1) is true") 16: end 17: 18: # and と or 19: println(true && false) # false 20: println(true || false) # true
false true true true convert(Bool,1) is true false true
ごく簡単なれいでくらべてみよう.
4.2 perl
1: use strict; 2: use warnings; 3: my $x=1; 4: print($x==2); # 何と, 何も書き出されない(undef ってこと?). 5: print("\n"); 6: print($x!=3); # 1 7: print("\n"); 8: if($x) { 9: print("1 is true in perl\n"); 10: } 11: print(1 and 0); # 0 12: print("\n"); 13: print(1 or 0); # 1
1 1 is true in perl 0 1
4.3 python
1: x=1 2: print(x==2) 3: print(x!=3) 4: print(1<2<3) 5: print(1<=2<=3) 6: # 1 は true 7: if(1): 8: print("1 is true in python") 9: # and or はそのまま書けばよい. 10: print(True and False) 11: print(True or False)
False True True True 1 is true in python False True
4.4 ruby
1: x=1 2: puts(x==2) 3: puts(x!=3) 4: if(x) 5: puts("1 is true in ruby") 6: end
false true 1 is true in ruby
4.5 R
1: x <- 1 2: x==2 3: x!=3 4: if(x) { 5: print("1 is true in R") 6: }
[1] FALSE [1] TRUE [1] "1 is true in R"
5 関数
5.1 julia
1: function func(a,b) 2: return a*b 3: end 4: 5: # こんな感じでも関数を定義できる. 6: f(x) = sin(1/x) 7: 8: # default 値の設定 9: function hoge(x,a=1) 10: return exp(cos(a*x)) 11: end 12: 13: # keyword でアクセスする引数の指定. ";" 14: # a,b は普通にアクセス 15: # max, min は max=, min= としてアクセス 16: function fuga(a,b; max=5,min=2) 17: x = a + b 18: if(x>max) 19: return max 20: end 21: if(x<min) 22: return min 23: end 24: return x 25: end 26: 27: k = func(2,5) 28: p = f(1.0) 29: q = hoge(pi) 30: r = hoge(pi,2) 31: c = fuga(2,4) 32: d = fuga(2,4,max=10) 33: println(k) 34: println(p) 35: println(q) 36: println(r) 37: println(c) 38: println(d)
10 0.8414709848078965 0.36787944117144233 2.718281828459045 5 6
5.2 まとめ
比較表だけかいてみる.
perl だけちょっとちがう感じ. 引数をかっこで渡さない.
関数定義のやり方 | |
---|---|
julia | function hoge() end |
perl | sub hoge { } |
python | def hoge() |
ruby | def hoge() end |
js | function hoge() { } |