接下來是聊條件與迴圈的部分,畢竟寫程式這兩個東西非常常使用到。
條件控制的語法又可以稱之為判斷式、決策(?)等等,反正就統稱條件式,也就是你熟悉的 if...else
啦。
通常來講我們在 JavaScript 是非常常使用 if
、if/else
或 if/else if/else
語法來做條件式判斷,當條件成立時,就會走特定的 { ... }
內容,所以這邊簡單舉例一下例子好了。
舉例來講,如果現在天氣晴朗的話,我要出現「天氣好棒!」,如果天氣不好的話,要出現「天氣好差!」的字眼:
var now = true;
if(now) {
console.log('天氣好棒!');
} else {
console.log('天氣好差!');
}
上面是一個非常簡單的 JavaScript if/else
條件式判斷,若希望條件多一點的話,則是使用 if/else if/else
:
var myName = 'Ray';
if(myName === 'QQ') {
console.log('哈囉 QQ');
} else if (myName === 'Ray') {
console.log('哈囉 Ray');
} else if(myName === 'Hello') {
console.log('哈囉');
} else {
console.log('都不熟');
}
那麼 Python 呢?寫法上會有差異嗎?先讓我們看看 if/else
部分:
now = True
if now:
print('天氣好棒!')
else:
print('天氣好差!')
看起來沒什麼差別對吧?但是在 if/else if/else
撰寫上 Python 就會有那麼一點點差異。
在 Python 中不是 if/else if/else
而是 if/elif/else
:
(注意 Python 中並沒有三等號運算子,在 JavaScript 中會有這個功能主要原因是隱含轉型導致,但在 Python 不會有這個狀況,通常你必須自己轉型。)
myName = 'Ray'
if myName == 'QQ':
print('哈囉 QQ')
elif myName == 'Ray':
print('哈囉 Ray')
elif myName == 'Hello':
print('哈囉')
else:
print('都不熟')
題外話一下 Python 中沒有 Switch/Case 的寫法,但是網路上依然查得到相當多的解決方案,所以這邊就不特別拉出來講了。
目前 Python 3.10 版本已經有推出類似 switch 的語法叫做 match
,用法也與 switch 很像:
myName = 'Ray'
match myName:
case 'QQ':
print('哈囉 QQ')
case 'Ray':
print('哈囉 Ray')
剩下對於 match 有興趣的話,可以閱讀 官方 文件。
對了,Python 的 if/else
在做條件判斷時,並不需要使用 ()
包覆,但是如果你使用 ()
也是可以:
now = True
if (now):
print('天氣好棒!')
else:
print('天氣好差!')
那麼為什麼不會出錯呢?最主要是 if
的條件只接受表達式,剛好 ()
會優先執行後回傳裡面的內容,因此才不會出現錯誤,並不是代表著兩種寫法都可以這一點可以稍微注意一下,你不信?你可以試著輸入以下程式碼,看它會出現 (1)
還是 1
:
print((1))
你嘗試了嗎?我覺得應該沒有。
所以我這邊補充一下,如果上面的定論是一個錯誤的說法的話,那麼上方 print
正常來講會直接輸出 (1)
,但實際上是會出現 1
,因此可以驗證並不是 Python 可以接受 if (True)
的寫法,而是 ()
回傳一個結果給了 if/else
條件式哩。
接下來聊聊迴圈的部分,迴圈在 JavaScript 中有滿多種寫法,像是 for loop
、for...in
或者是 forEach
等等非常多,滿多都是跟陣列操作有關係,所以這邊也推薦我先前寫的 關於 JavaScript 陣列20種操作的方法,這一篇要感謝偷米騎巴哥老師的整理,這邊有興趣的人可以直接觀看那篇文章,這邊就不再著墨了。
那麼讓我們先看一段簡單的 JavaScript for loop
範例:
for(var i = 0; i < 10; i+=1){
console.log(i); // 0...1...2......9
}
上面程式碼的預期結果會出現 0~9
,那麼 Python 的迴圈該如何撰寫呢?主要寫法 for...in
的寫法,但是如果想要達到上方相同作法的話,這邊就必須使用 Python 的內建方法 range()
來產生一個陣列範圍,你可以把它想像成原本自己要手打 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
,但是透過 range()
你可以快速生成一個陣列的概念:
for i in range(10):
print(i)
這邊簡單聊一下關於 range()
這個函式有哪些功用,基本上依據你傳入的參數量可以得到不同的結果
range(10)
- 產生 0~9 的範圍range(2, 10)
- 產生 2~9 的範圍range(2, 10, 4)
- 產生遞增範圍 4,,以這個範例來講起始值是 2,因此會 2 + 4 = 6,但是因為 6 + 4 超過 range()
範圍,因此只會出現 2 跟 6。當然你也可以直接傳入一個陣列來跑迴圈也是完全沒有問題的:
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
print(i)
但我相信你不會想要這樣寫程式的,除非你真的很猛
對了,你也可以試著撰寫面試常見的 9x9 考題,答案我就留到最後再公佈吧。
這邊也額外提一個好玩的地方,如果 for loop
所傳入的是一個字串,迴圈是將字串變成一個一個單字取出:
for i in 'Ray':
print(i)
除此之外還有另一種迴圈寫法是 while loop
,我先承認我自己在 JavaScript 中是比較少使用這種寫法,之前寫也常常寫出死迴圈(怕)
回歸正題,那麼先聊聊 JavaScript 中 while loop
是怎麼寫的:
var i = 0;
while(i < 5) {
i += 1;
console.log('Hello Ray' + i);
}
另一種 while 則是 do...while
:
var i = 0;
do {
i += 1;
console.log('Hello Ray' + i);
} while(i < 5)
基本上這兩者呈現的結果是非常相似,都是 Hello Ray 1...5
,但是 do...while
中的 do
不管條件是否成立,必定會執行一次:
var i = 0;
do {
i += 1;
console.log('Hello Ray' + i);
} while(i < 0); // Hello Ray1
var i = 0;
// 條件不符合不執行
while(i < 0) {
i += 1;
console.log('Hello Ray' + i);
}
反觀我們來看看 Python 中的 while loop
寫法會不會有所不同呢?讓我們繼續看下去:
i = 0
while i < 5:
i += 1
print('Hello Ray' + str(i))
基本上感覺差異是不大,但是這邊可以額外提一下 Python 是沒有 do...while
語法的,可是我們可以模擬一個 do....while
類似的運作寫法出來:
i = 0
status = True
while status:
i += 1
print('Hello Ray' + str(i))
if i >= 0:
status = False
透過上述寫法我們就可以很簡單的達到與原本 do...while
類似的寫法,也就是不管條件語法必定會執行一次這件事情。
但是請務必要小心下面這種沒有結束條件的寫法,是很容易出現死迴圈的:
i = 0
while True:
print(i)
i += 1
這種寫法上要格外小心,在此建議不要當 7474 團(去死去死團)拿自己電腦冒險 QQ
基本上就是用兩個迴圈就可以做到了:
for i in range(2, 10):
for j in range(2, 10):
print(str(i) + 'x' + str(j) + '=' + str(i*j))
而上方寫法又稱之為「Nested For Loop」,也就是巢狀迴圈,通常在初學時滿容易混亂的。
這邊也簡單描述一下運作邏輯,第一層的 for loop 在執行時,第二層 for loop 會跑九次(0~9),第二層 for loop 跑完之後記憶體會被釋放掉,然後再跑第一層 for loop,以此類推。
稍微嘗試了一下將雞肉捲起來做花雕醉雞,身邊親人與朋友吃完之後都說不輸給外面賣的,看來我替自己的未來找到第二片春天了...