20161209-Julia Taiwan first meetup-julia語言入門
-
Upload
- -
Category
Technology
-
view
341 -
download
0
Transcript of 20161209-Julia Taiwan first meetup-julia語言入門
Julia 語言入門杜岳華
Julia Taiwan 發起人
Julia Taiwan
Outline 變數的宣告及使用 數字相關的型別及運算 (eg. 整數、浮點數、有理數、複數 ) 布林值與運算 條件判斷與迴圈 字元與字串的型別與運算 介紹函式 介紹集合容器 (collections eg. Array, Set, Dict...)
想必大家都是被這個語言的高效能給吸引來的…………
能夠處理很快,能跑大量數據……還可以平行運算、分散式運算
那………其他人就不行嗎 ?
有誰是被這個語言的優雅及簡潔給吸引來的 ?
我 !
我是誰 杜岳華 衛生福利部疾病管制署
檢驗及研究中心 中區實驗室 研發替代役 研究助理
陽明 生醫資訊所 碩士 成大 醫學檢驗及生物技術系 學士 資訊工程系 學士
• 專案經驗• EZPrivacy 加密認證系統• Java-based• 現在應用於成大公文系統• Transcriptome 資料分析• Python-based• 碩論
想成為生醫資料科學家 !!
正片開始 println(“hello world!”)
一切都從數字開始… 在 Julia 中數字有下列幾種形式
整數 浮點數 有理數 複數
Julia 的整數跟浮點數是有不同位元版本的IntegerInt8Int16Int32Int64Int128
UnsignedUint8Uint16Uint32Uint64Uint128
FloatFloat16Float32Float64
有理數 有理數表示 自動約分 自動調整負號 接受分母為 0
2//3 # 2//3-6//12 # -1//25//-20 # -1//45//0 # 1//0
num(2//10) # 1den(7//14) # 2
2//4 + 1//7 # 9//143//10 * 6//9 # 1//510//15 == 8//12 # truefloat(3//4) # 0.75
複數1 + 2im (1 + 2im) + (3 - 4im) # 4 - 2im(1 + 2im)*(3 - 4im) # 11 + 2im(-4 + 3im)^(2 + 1im) # 1.950 + 0.651im
real(1 + 2im) # 1imag(3 + 4im) # 4conj(1 + 2im) # 1 - 2imabs(3 + 4im) # 5.0angle(3 + 3im)/pi*180 # 45.0
我們來宣告變數吧! 指定或不指定型別
x = 5y = 4::Int64z = x + yprintln(z) # 9
變數可以很隨便 動態型別語言特性
x = 5println(x) # 5println(typeof(x)) # Int64x = 6.0println(x) # 6.0println(typeof(x)) # Float64
值都不會動 Value is immutable
object_id(): get a hash value based on object identity.
x = 5println(object_id(x))x = 6.0println(object_id(x))x = 5println(object_id(x))println(object_id(5))
0x1595c9b31d1600090x0147908c8135e7ae0x1595c9b31d1600090x1595c9b31d160009
x
6.0Float64
5Int64
靜態型別與動態型別 靜態型別跟動態型別最大的差別在於型別是跟著變數還是值。
5
5
xint
xint
Static type
Dynamic type
躺著玩、坐著玩、趴著玩,還是運算子好玩 +x : 就是 x 本身 -x : 變號 x + y, x - y, x * y, x / y : 一般四則運算 div(x, y) : 商 x % y : 餘數,也可以用 rem(x, y) x \ y : 反除,等價於 y / x x ^ y : 次方
操縱數字的機械核心 ~x : bitwise not x & y : bitwise and x | y : bitwise or x $ y: bitwise xor x >>> y :無正負號,將 x 的位元右移 y 個位數 x >> y :保留正負號,將 x 的位元右移 y 個位數 x << y : 將 x 的位元左移 y 個位數
https://www.technologyuk.net/mathematics/number-systems/images/binary_number.gif
方便的更新方法 += -= *= /= \= %= ^=
&= |= $= >>>= >>= <<=
x += 5x = x + 5
超級比一比 x == y :等於 x != y, x ≠ y :不等於 x < y :小於 x > y :大於 x <= y, x ≤ y :小於或等於 x >= y, x ≥ y :大於或等於
a, b, c = (1, 3, 5)a < b < c # true
不同型別的運算與轉換 算術運算會自動轉換 強型別3.14 * 4 # 12.56parse(“5”) # 5convert(AbstractString, 5) # “5”
強型別與弱型別
string
Strong type
Weak type
5 “5”strin
gint
5 “5”strin
gint
+
+Implicitly
感覺這樣有點乾 我們來寫個小遊戲好了
來寫個猜拳遊戲好了
paper = 1 # 這代表布scissor = 2 # 這代表剪刀stone = 3 # 這代表石頭
判斷輸贏 If 判斷式 短路邏輯
if scissor > paper println("scissor win!!")endif < 判斷式 > < 程式碼 >end
if 3 > 5 && 10 > 0 …end
使用者輸入
println(" 請輸入要出的拳” )println(“1 代表布, 2 代表剪刀, 3 代表石頭: ")s = readline(STDIN)x = parse(s)
組織起來if x == paper println(" 你出布 ")elseif x == scissor println(" 你出剪刀 ")elseif x == stone println(" 你出石頭 ")end
if < 判斷式 1> < 程式碼 1>elseif < 判斷式 2> < 程式碼 2>else < 程式碼 3>end
電腦怎麼出拳 rand(): 隨機 0~1 rand([]): 從裡面選一個出來
y = rand([1, 2, 3])
巢狀比較if x == y println(" 平手 ")elseif x == paper println(" 你出布 ") if y == scissor println(" 電腦出剪刀 ") println(" 電腦贏了 ") elseif y == stone println(" 電腦出石頭 ") println(" 你贏了 ") end...
我的義大利麵條elseif x == scissor println(" 你出剪刀 ") if y == paper println(" 電腦出布 ") println(" 你贏了 ") elseif y == stone println(" 電腦出石頭 ") println(" 電腦贏了 ") endelseif x == stone println(" 你出石頭 ") if y == scissor println(" 電腦出剪刀 ") println(" 你贏了 ") elseif y == paper println(" 電腦出布 ") println(" 電腦贏了 ") endend
if x == y println(" 平手 ")elseif x == paper println(" 你出布 ") if y == scissor println(" 電腦出剪刀 ") println(" 電腦贏了 ") elseif y == stone println(" 電腦出石頭 ") println(" 你贏了 ") end
我想玩很多次
while < 判斷式 > < 程式碼 >end
x = …while < 持續條件 > ... x = …end
停止條件s = readline(STDIN)x = parse(s)while x != -1 ... s = readline(STDIN) x = parse(s)end
函式來幫忙
function add(a, b) c = a + b return cend
函式怎麼講話 參數傳遞 pass-by-sharing
個人認為跟 call by reference 很像就是了
5xint function foo(a)
enda
函式怎麼講話 多個回傳值
funciton foo(a, b, c) return (a, b, c)end
我看到重複了 函式是消除重複的好工具! 像我們之前有寫了非常多的條件判斷,其實重複性很高,感覺很蠢,我們可以設法把出拳的判斷獨立出來。
簡化重複function shape(x) if x == paper return " 布 " elseif x == scissor return " 剪刀 " elseif x == stone return " 石頭 " endend
你需要的是一個矩陣 突然神說了一句話,解救了凡人的我。 XD
是的,或許你需要一個表來讓你查。 | 布 剪刀 石頭------------------- 布 | 0 -1 1剪刀 | 1 0 -1石頭 | -1 1 0
陣列A = [2, 3, 5]A[2]
[ ]2 3 5
多維陣列
A = [0, -1, 1; 1, 0, -1; -1, 1, 0]
A[1, 2]
字串的簡易操作 concatenate
x 要是字串" 你出 " * x
簡化完畢 稱為重構
refactoring
win_or_lose = A[x, y]
x = shape(x)y = shape(y)if win_or_lose == 0 println(" 平手 ")else println(" 你出 " * x) println(" 電腦出 " * y) if win_or_lose == 1 println(" 你贏了 ") else println(" 電腦贏了 ") endend
任意數量參數function foobar(a, b, x::Vararg{Int64}) println(a) println(b) println(x)end
foobar(1, 2, 3, 4)
可選參數function foo(a, b, c=10) ...end
foo(1, 2)foo(1, 2, 3)
關鍵字參數function bar(a, b; i=5, j=6) ...end
bar(1, 2, i=10)
我要怎麼選 我的建議
關鍵字參數 : 使用情境彼此互斥的時候 可選參數 : 類似情境而可具備預設值的時候
For 迴圈
for i = 1:5 # for 迴圈,有限的迴圈次數 println(i)end
介紹 Array homogenous start from 1 mutable
[1, 2, 3, 4, 5]
豆漿油條
strings = ["foo","bar","baz"]
for s in strings println(s)end
數值運算 介紹各種 Array 函式
zeros(Float64, 2, 2) # 2-by-2 matrix with 0ones(Float64, 3, 3) # 3-by-3 matrix with 1trues(2, 2) # 2-by-2 matrix with trueeye(3) # 3-by-3 diagnal matrixrand(2, 2) # 2-by-2 matrix with random number
Comprehension[x for x = 1:3]
[x for x = 1:20 if x % 2 == 0]
["$x * $y = $(x*y)" for x=1:9, y=1:9]
[1, 2, 3]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[“1 * 1 = 1“, “1 * 2 = 2“, “1 * 3 = 3“ ...]
Tuple Immutable
tup = (1, 2, 3)
tup[1] # 1tup[1:2] # (1, 2)
(a, b, c) = (1, 2, 3)
Set Mutable
filled_set = Set([1, 2, 2, 3, 4])push!(filled_set,5)
intersect(filled_set, other_set)union(filled_set, other_set)setdiff(Set([1, 2, 3, 4]), Set([2, 3, 5]))
Set([i for i=1:10])
Dict Mutable
filled_dict = Dict("one"=> 1, "two"=> 2, "three"=> 3)
keys(filled_dict)values(filled_dict)
Dict(x=> i for (i, x) in enumerate(["one", "two", "three", "four"]))
Thank you for attention
預告 第二次 meetup
型別系統 Multiple dispatch