20161209-Julia Taiwan first meetup-julia語言入門

59
Julia 語語語語 語語語 Julia Taiwan 語語語 Julia Taiwan

Transcript of 20161209-Julia Taiwan first meetup-julia語言入門

Page 1: 20161209-Julia Taiwan first meetup-julia語言入門

Julia 語言入門杜岳華

Julia Taiwan 發起人

Julia Taiwan

Page 2: 20161209-Julia Taiwan first meetup-julia語言入門

Outline 變數的宣告及使用 數字相關的型別及運算 (eg. 整數、浮點數、有理數、複數 ) 布林值與運算 條件判斷與迴圈 字元與字串的型別與運算 介紹函式 介紹集合容器 (collections eg. Array, Set, Dict...)

Page 3: 20161209-Julia Taiwan first meetup-julia語言入門

想必大家都是被這個語言的高效能給吸引來的…………

Page 4: 20161209-Julia Taiwan first meetup-julia語言入門

能夠處理很快,能跑大量數據……還可以平行運算、分散式運算

Page 5: 20161209-Julia Taiwan first meetup-julia語言入門

那………其他人就不行嗎 ?

Page 6: 20161209-Julia Taiwan first meetup-julia語言入門

有誰是被這個語言的優雅及簡潔給吸引來的 ?

Page 7: 20161209-Julia Taiwan first meetup-julia語言入門

我 !

Page 8: 20161209-Julia Taiwan first meetup-julia語言入門

我是誰 杜岳華 衛生福利部疾病管制署

檢驗及研究中心 中區實驗室 研發替代役 研究助理

陽明 生醫資訊所 碩士 成大 醫學檢驗及生物技術系 學士 資訊工程系 學士

• 專案經驗• EZPrivacy 加密認證系統• Java-based• 現在應用於成大公文系統• Transcriptome 資料分析• Python-based• 碩論

Page 9: 20161209-Julia Taiwan first meetup-julia語言入門

想成為生醫資料科學家 !!

Page 10: 20161209-Julia Taiwan first meetup-julia語言入門

正片開始 println(“hello world!”)

Page 11: 20161209-Julia Taiwan first meetup-julia語言入門

一切都從數字開始… 在 Julia 中數字有下列幾種形式

整數 浮點數 有理數 複數

Page 12: 20161209-Julia Taiwan first meetup-julia語言入門

Julia 的整數跟浮點數是有不同位元版本的IntegerInt8Int16Int32Int64Int128

UnsignedUint8Uint16Uint32Uint64Uint128

FloatFloat16Float32Float64

Page 13: 20161209-Julia Taiwan first meetup-julia語言入門

有理數 有理數表示 自動約分 自動調整負號 接受分母為 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

Page 14: 20161209-Julia Taiwan first meetup-julia語言入門

複數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

Page 15: 20161209-Julia Taiwan first meetup-julia語言入門

我們來宣告變數吧! 指定或不指定型別

x = 5y = 4::Int64z = x + yprintln(z) # 9

Page 16: 20161209-Julia Taiwan first meetup-julia語言入門

變數可以很隨便 動態型別語言特性

x = 5println(x) # 5println(typeof(x)) # Int64x = 6.0println(x) # 6.0println(typeof(x)) # Float64

Page 17: 20161209-Julia Taiwan first meetup-julia語言入門

值都不會動 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

Page 18: 20161209-Julia Taiwan first meetup-julia語言入門

x

6.0Float64

5Int64

Page 19: 20161209-Julia Taiwan first meetup-julia語言入門

靜態型別與動態型別 靜態型別跟動態型別最大的差別在於型別是跟著變數還是值。

5

5

xint

xint

Static type

Dynamic type

Page 20: 20161209-Julia Taiwan first meetup-julia語言入門

躺著玩、坐著玩、趴著玩,還是運算子好玩 +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 : 次方

Page 21: 20161209-Julia Taiwan first meetup-julia語言入門

操縱數字的機械核心 ~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

Page 22: 20161209-Julia Taiwan first meetup-julia語言入門

方便的更新方法 += -= *= /= \= %= ^=

&= |= $= >>>= >>= <<=

x += 5x = x + 5

Page 23: 20161209-Julia Taiwan first meetup-julia語言入門

超級比一比 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

Page 24: 20161209-Julia Taiwan first meetup-julia語言入門

不同型別的運算與轉換 算術運算會自動轉換 強型別3.14 * 4 # 12.56parse(“5”) # 5convert(AbstractString, 5) # “5”

Page 25: 20161209-Julia Taiwan first meetup-julia語言入門

強型別與弱型別

string

Strong type

Weak type

5 “5”strin

gint

5 “5”strin

gint

+

+Implicitly

Page 26: 20161209-Julia Taiwan first meetup-julia語言入門

感覺這樣有點乾 我們來寫個小遊戲好了

Page 27: 20161209-Julia Taiwan first meetup-julia語言入門

來寫個猜拳遊戲好了

paper = 1 # 這代表布scissor = 2 # 這代表剪刀stone = 3 # 這代表石頭

Page 28: 20161209-Julia Taiwan first meetup-julia語言入門

判斷輸贏 If 判斷式 短路邏輯

if scissor > paper println("scissor win!!")endif < 判斷式 > < 程式碼 >end

if 3 > 5 && 10 > 0 …end

Page 29: 20161209-Julia Taiwan first meetup-julia語言入門

使用者輸入

println(" 請輸入要出的拳” )println(“1 代表布, 2 代表剪刀, 3 代表石頭: ")s = readline(STDIN)x = parse(s)

Page 30: 20161209-Julia Taiwan first meetup-julia語言入門

組織起來if x == paper println(" 你出布 ")elseif x == scissor println(" 你出剪刀 ")elseif x == stone println(" 你出石頭 ")end

if < 判斷式 1> < 程式碼 1>elseif < 判斷式 2> < 程式碼 2>else < 程式碼 3>end

Page 31: 20161209-Julia Taiwan first meetup-julia語言入門

電腦怎麼出拳 rand(): 隨機 0~1 rand([]): 從裡面選一個出來

y = rand([1, 2, 3])

Page 32: 20161209-Julia Taiwan first meetup-julia語言入門

巢狀比較if x == y println(" 平手 ")elseif x == paper println(" 你出布 ") if y == scissor println(" 電腦出剪刀 ") println(" 電腦贏了 ") elseif y == stone println(" 電腦出石頭 ") println(" 你贏了 ") end...

Page 33: 20161209-Julia Taiwan first meetup-julia語言入門

我的義大利麵條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

Page 34: 20161209-Julia Taiwan first meetup-julia語言入門

我想玩很多次

while < 判斷式 > < 程式碼 >end

x = …while < 持續條件 > ... x = …end

Page 35: 20161209-Julia Taiwan first meetup-julia語言入門

停止條件s = readline(STDIN)x = parse(s)while x != -1 ... s = readline(STDIN) x = parse(s)end

Page 36: 20161209-Julia Taiwan first meetup-julia語言入門

函式來幫忙

function add(a, b) c = a + b return cend

Page 37: 20161209-Julia Taiwan first meetup-julia語言入門

函式怎麼講話 參數傳遞 pass-by-sharing

個人認為跟 call by reference 很像就是了

5xint function foo(a)

enda

Page 38: 20161209-Julia Taiwan first meetup-julia語言入門

函式怎麼講話 多個回傳值

funciton foo(a, b, c) return (a, b, c)end

Page 39: 20161209-Julia Taiwan first meetup-julia語言入門

我看到重複了 函式是消除重複的好工具! 像我們之前有寫了非常多的條件判斷,其實重複性很高,感覺很蠢,我們可以設法把出拳的判斷獨立出來。

Page 40: 20161209-Julia Taiwan first meetup-julia語言入門

簡化重複function shape(x) if x == paper return " 布 " elseif x == scissor return " 剪刀 " elseif x == stone return " 石頭 " endend

Page 41: 20161209-Julia Taiwan first meetup-julia語言入門

你需要的是一個矩陣 突然神說了一句話,解救了凡人的我。 XD

是的,或許你需要一個表來讓你查。 | 布 剪刀 石頭------------------- 布 | 0 -1 1剪刀 | 1 0 -1石頭 | -1 1 0

Page 42: 20161209-Julia Taiwan first meetup-julia語言入門

陣列A = [2, 3, 5]A[2]

[ ]2 3 5

Page 43: 20161209-Julia Taiwan first meetup-julia語言入門

多維陣列

A = [0, -1, 1; 1, 0, -1; -1, 1, 0]

A[1, 2]

Page 44: 20161209-Julia Taiwan first meetup-julia語言入門

字串的簡易操作 concatenate

x 要是字串" 你出 " * x

Page 45: 20161209-Julia Taiwan first meetup-julia語言入門

簡化完畢 稱為重構

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

Page 46: 20161209-Julia Taiwan first meetup-julia語言入門

任意數量參數function foobar(a, b, x::Vararg{Int64}) println(a) println(b) println(x)end

foobar(1, 2, 3, 4)

Page 47: 20161209-Julia Taiwan first meetup-julia語言入門

可選參數function foo(a, b, c=10) ...end

foo(1, 2)foo(1, 2, 3)

Page 48: 20161209-Julia Taiwan first meetup-julia語言入門

關鍵字參數function bar(a, b; i=5, j=6) ...end

bar(1, 2, i=10)

Page 49: 20161209-Julia Taiwan first meetup-julia語言入門

我要怎麼選 我的建議

關鍵字參數 : 使用情境彼此互斥的時候 可選參數 : 類似情境而可具備預設值的時候

Page 50: 20161209-Julia Taiwan first meetup-julia語言入門

For 迴圈

for i = 1:5 # for 迴圈,有限的迴圈次數 println(i)end

Page 51: 20161209-Julia Taiwan first meetup-julia語言入門

介紹 Array homogenous start from 1 mutable

[1, 2, 3, 4, 5]

Page 52: 20161209-Julia Taiwan first meetup-julia語言入門

豆漿油條

strings = ["foo","bar","baz"]

for s in strings println(s)end

Page 53: 20161209-Julia Taiwan first meetup-julia語言入門

數值運算 介紹各種 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

Page 54: 20161209-Julia Taiwan first meetup-julia語言入門

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“ ...]

Page 55: 20161209-Julia Taiwan first meetup-julia語言入門

Tuple Immutable

tup = (1, 2, 3)

tup[1] # 1tup[1:2] # (1, 2)

(a, b, c) = (1, 2, 3)

Page 56: 20161209-Julia Taiwan first meetup-julia語言入門

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])

Page 57: 20161209-Julia Taiwan first meetup-julia語言入門

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"]))

Page 58: 20161209-Julia Taiwan first meetup-julia語言入門

Thank you for attention

Page 59: 20161209-Julia Taiwan first meetup-julia語言入門

預告 第二次 meetup

型別系統 Multiple dispatch