香港編程學院 | Julia課程

Julia 編程語言完整教學

這是一個專為初學者設計的 繁體中文 Julia 教學網站。你將學會 REPL 與腳本執行方式、基本語法、 陣列與索引、條件判斷、迴圈、函式、多重派發、廣播運算,以及資料分析與繪圖的入門範例。

1-based 索引 end 結束區塊 多重派發 廣播 .() DataFrames Plots
為什麼學 Julia? Julia 擅長數值運算、科學計算與資料處理,同時保有高可讀性與靈活語法。
初學者最該先懂 Julia 使用 end 關閉區塊、陣列索引從 1 開始、條件式必須是布林值。
Julia 的亮點 函式可依參數型別定義多種方法;對陣列做逐元素運算時可使用 dot 語法,例如 sin.(x)

認識 Julia

先建立正確的語言觀念,學習會快很多。

核心特色

1-based 索引

Julia 的陣列、字串等索引是從 1 開始,而不是像 Python 那樣從 0 開始。 此外,切片區間通常包含最後一個元素,這對從 MATLAB 或 R 轉來的使用者較直觀。

語法習慣

end 結束區塊

在 Julia 中,ifforwhilefunction 等區塊 都要明確以 end 結束。縮排建議保持整齊,但它不是像 Python 那樣決定語意的關鍵。

語言設計

函式與多重派發

Julia 的函式可以依據參數型別擁有不同方法。這種設計稱為 多重派發, 也是 Julia 在科學計算與泛型程式設計中非常重要的核心能力。

Julia 語法教學

下面依照初學者最常碰到的主題,整理成可直接閱讀與練習的教學區塊。

入門

1. 啟動 REPL 與執行檔案

你可以直接啟動 Julia REPL 互動式環境,輸入表達式後立刻看到結果。若表達式後面加上分號, REPL 會抑制輸出。上一個結果可由 ans 取得。若要執行檔案,可使用 julia script.jl,或在 REPL 中以 include("file.jl") 載入。

Julia REPL 基本操作
1 + 2
# 3

ans
# 3

x = 10;
# 結尾加分號時,REPL 不顯示輸出

include("hello.jl")
# 載入並執行檔案內容
提示:離開 REPL 可使用 Ctrl + D 或輸入 exit()
基礎資料

2. 變數與常見型別

Julia 會依照值自動推斷型別。整數如 42 是整數型別,帶小數點的值如 3.14 則是浮點數。 字串使用雙引號,單引號通常代表字元。函式呼叫即使沒有參數也要加括號,例如 rand()

變數與型別示例
name = "Julia"
age = 10
pi_value = 3.14159
is_fast = true
grade = 'A'

typeof(name)      # String
typeof(age)       # Int64
typeof(pi_value)  # Float64
typeof(is_fast)   # Bool
typeof(grade)     # Char
集合資料

3. 陣列、範圍與索引

Julia 的陣列使用方括號表示,索引從 1 開始。你也能用範圍語法 1:5 產生連續整數。 Julia 的切片通常包含結尾位置,這和某些語言不同。指定給另一個變數時,陣列內容不會自動複製。

陣列與索引
nums = [10, 20, 30, 40, 50]

nums[1]      # 10
nums[2:4]    # [20, 30, 40]

r = 1:5      # 1, 2, 3, 4, 5
collect(r)   # [1, 2, 3, 4, 5]

a = nums
a[1] = 999

nums         # [999, 20, 30, 40, 50]
# 因為 a 與 nums 指向相同資料
流程控制

4. if、三元運算子與布林條件

Julia 的 if 條件式必須是 布林值,不能像某些語言那樣把 0 或 1 直接當條件。 此外,if 區塊會回傳值,因此可以直接把它當成表達式使用。

條件判斷
score = 82

if score >= 90
    level = "A"
elseif score >= 80
    level = "B"
else
    level = "C"
end

println(level)  # B

result = score >= 60 ? "及格" : "不及格"
println(result)
Julia 的 if 區塊不會建立新的區域作用域,這點和 for 迴圈的行為不同。
迴圈與例外處理

5. for、while、break、continue、try-catch

for 迴圈是最常見的走訪方式,可搭配範圍或集合使用。while 則在條件為真時持續執行。 若發生錯誤,可用 try-catch 攔截,必要時再配合 finally 做清理。

迴圈與例外
for i in 1:5
    if i == 3
        continue
    end
    println(i)
end

n = 1
while n <= 3
    println("n = ", n)
    n += 1
end

try
    x = parse(Int, "abc")
catch err
    println("發生錯誤:", err)
finally
    println("清理完成")
end
函式重點

6. 函式、匿名函式、關鍵字參數、多重派發

Julia 函式可用傳統寫法,也可用簡潔的單行定義。匿名函式常用在資料轉換或高階函式中。 若函式需用名稱指定參數,可使用關鍵字參數。更進一步,還可以依參數型別定義多個同名方法。

函式與多重派發
function add(x, y)
    x + y
end

square(x) = x^2

triple = x -> x * 3

function greet(name; punctuation="!")
    "你好,$(name)$(punctuation)"
end

describe(x::Int) = "這是整數"
describe(x::String) = "這是字串"

println(add(3, 5))                 # 8
println(square(6))                 # 36
println(triple(4))                 # 12
println(greet("小明", punctuation="~"))
println(describe(10))
println(describe("Julia"))
數值運算

7. 廣播(Broadcasting)與逐元素運算

Julia 對陣列做逐元素運算時非常優雅。只要在函式或運算子前後加入 dot, 就能把原本針對單一值的計算,自動套用到整個陣列。像 sin.(x)A .+ 3 都是典型範例。

廣播示例
x = 0:0.5:2
y = sin.(x)

A = [1, 2, 3]
B = A .+ 10       # [11, 12, 13]

A .= A .* 2       # 原地更新 A
println(A)        # [2, 4, 6]
dot 語法是 Julia 的重要特色。它可讓標量函式自然地套用到陣列上,也能支援高效的融合運算。
新手常犯錯誤

8. 與 Python / MATLAB / R 的重要差異

• 索引從 1 開始,不是 0。

• 所有程式區塊都要用 end 結束。

• 縮排不是決定程式區塊的語法條件,但仍建議一致。

• 陣列指定給新變數時不會自動複製。

• 逐元素運算通常需要 dot,例如 .*.+sin.(x)

• 函式名稱後方有驚嘆號 ! 通常表示它會修改原資料。

• 條件判斷必須是布林值,不能直接用數字代替。

• 0 參數函式仍需寫括號,例如 rand()

範例應用例子

學會語法後,最重要的是看到它如何用在真實情境中。

範例 1

成績統計小程式

這個例子示範陣列、迴圈、條件判斷與函式的搭配。你可以很快看懂 Julia 在資料處理上的自然寫法。

計算平均與最高分
scores = [88, 76, 93, 85, 91]

function grade_summary(arr)
    total = 0
    best = arr[1]

    for s in arr
        total += s
        if s > best
            best = s
        end
    end

    avg = total / length(arr)
    return avg, best
end

avg, best = grade_summary(scores)
println("平均:", avg)
println("最高分:", best)
範例 2

DataFrames 資料表入門

若你要做資料分析,DataFrames.jl 是最常見的表格資料工具之一。下面示範建立資料表、 取欄位與篩選資料的基本概念。

DataFrames.jl 基本操作
using DataFrames

df = DataFrame(
    name = ["Amy", "Ben", "Cindy", "David"],
    score = [92, 75, 88, 64]
)

println(df)

# 取出欄位
println(df.name)
println(df[!, :score])

# 篩選及格者(示範布林索引)
passed = df[df.score .>= 80, :]
println(passed)
df[!, :score] 會直接取到原欄位參照;若你需要複本,常見寫法是 df[:, :score]
範例 3

Plots.jl 繪製正弦曲線

Julia 的繪圖生態系很完整。以下示範 Plots.jl 中最基本的流程:載入套件、準備資料、呼叫 plot()

簡單繪圖
using Plots

x = range(0, 10, length=100)
y = sin.(x)

plot(
    x, y,
    title = "Sine Wave",
    xlabel = "x",
    ylabel = "sin(x)",
    linewidth = 3,
    label = "sin curve"
)

這裡的重點是 sin.(x)sin 原本是對單一數值計算,但加上 dot 後, 它就能對整個範圍逐元素計算。

Julia 小測驗

作答後按下「提交測驗」,系統會立即計分並顯示解析。

1. Julia 的陣列索引預設從哪個數字開始?

2. 下列哪個語法表示「逐元素」套用 sin 到陣列 x

3. 在 Julia 中,哪個關鍵字用來結束 iffunction 區塊?

4. 下列哪一個是 Julia 的單行函式定義?

5. 如果 Julia 的條件判斷式收到一個非布林值,正確描述是哪一個?

6. 函式名稱後面帶有驚嘆號,如 sort!,通常代表什麼?