迴圈

迴圈 在 Julia

2 個練習

關於 迴圈

迴圈基本上有兩種:

  1. 重複執行,直到滿足某個條件。
  2. 對集合中的元素逐一走訪。

這兩種在 Julia 中都可行,不過第二種可能更常見。

while迴圈

對於迴圈要繞幾次事先無法確定的開放式問題,Julia 提供了while迴圈。

基本形式相當簡單:

while condition
    do_something()
end

在這種情況下,程式會一直繞著迴圈跑,直到condition不再是true。

有兩種方法可以提早離開迴圈:

  • break會讓迴圈結束,程式接著從迴圈end之後的下一行繼續執行。
  • return x會停止目前函式的執行,並把回傳值x交回給呼叫端。

有了這些選項,有時用while true ... end建立一個「無限」迴圈會很方便,然後在迴圈主體裡找到停止條件來觸發break或return。

走訪集合

最簡單的示範,就是走訪一個範圍。

如果我們想讓某件事做 10 次:

for n in 1:10
    do_something(n)
end

如果目前的疊代沒有滿足某個條件,可以用continue直接跳到下一次疊代:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

寫得更精簡一點,可以把if區塊換成is_useless(n) && continue。

還有許多其他型別的集合可以走訪:陣列中的元素、字串中的字元、字典中的鍵……

前提是這個集合必須是iterable。 這點會在之後的概念中詳細說明,但基本上,集合必須有辦法在被要求時產生下一個項目,還要能指出已經到達結尾、沒有更多項目了。

目前為止的例子都是對範圍1:10做迴圈,此時值同時也是迴圈索引。

更一般來說,我們需要的可能不只是值,還有索引。 這時候就要用eachindex()函式,例如for i in eachindex(my_array) ... end。

推導式

在 Julia 裡,直接寫出明確的迴圈通常比在許多傳統語言中來得少見,因為有各種更簡潔的選擇。

一個特別常見的情況,是需要用某個其他集合(向量、字串、集合……可能性很多)的元素來建立一個新的向量。

喜歡 Python 列表推導式的人會很開心,因為 Julia 也能使用類似的語法。

它的精髓,是在向量裡建立一個非常精簡的迴圈。

最簡單的語法形式是result = [f(x) for x in some_collection]。

用傳統迴圈的話,可以寫成:

result = []
for x in some_collection
    push!(result, f(x))
end

也可以選擇在最後加上條件,只挑出集合中符合的元素:

# multiples of 3
julia> [n^2 for n in 1:10 if n%3 == 0]
3-element Vector{Int64}:
  9
 36
 81

# letters beyond 'h' in the alphabet
julia> [uppercase(c) for c in "Julia" if c > 'h']
3-element Vector{Char}:
 'U': ASCII/Unicode U+0055 (category Lu: Letter, uppercase)
 'L': ASCII/Unicode U+004C (category Lu: Letter, uppercase)
 'I': ASCII/Unicode U+0049 (category Lu: Letter, uppercase)

這個語法和 Python 很類似,但並不_完全相同_。 在多個變數和/或多維陣列的情況會有些差異,所以這個主題會在之後的概念中更詳細地介紹。

其他選擇

作為一個現代、以函式為主的語言,Julia(當然)有各種操作集合的方式,不只是明確的迴圈,或在推導式裡壓縮過的迴圈。

之後的概念會探討像是廣播和高階函式之類的替代做法。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 迴圈