文章程式碼顯示

2017年11月10日 星期五

一起學 Python - 16:比C語言更強大的 for 迴圈



Python 的 for 迴圈在使用上比 C 語言的 for 迴圈還來的好用,以前用 C 語言的 for 迴圈時都是使用變量來當作判斷式,學到 Python 發現竟然可以用字串來當作判斷式!? 實在是讓我滿驚訝的,且一時之間還不是很能接受這樣的方式以及作用模式。

首先我們建立一個名為 text 的字串,並且我們想用 Python 的 for 迴圈來列印出字串的每一個字元。( C 語言要做這件事其實是頗為麻煩的)

由第二行以及第七行兩個區塊的程式碼中,我們利用 i 來當作索引值,也就是說 for 迴圈會像是自動將後方的字串先進行 list 並且會依序第 1,2,3,4,5,6 的順序來進行 "迴圈" 。



我們可以直接從結果看出當程式碼執行時 i 會依序變成

i = 'M'
i = 'y'
i = 'G'  以此類推

由上可知 for 迴圈不只可以使用在字串,當然也可以直接使用在"列表(list)"。如 14~36 行中,我們可以依序列印 list 中的每一個成員。

如前所述,在 C 語言中我們較常使用的方式是輸入一個變數值讓 for 函數進行判斷,若判斷結果為 True 則迴圈繼續執行。例如

for( i=0; i<10; i++)
  printf("%d",i);

其結果會是 0123456789

也就是說我們希望用一個數字例如 10 來代表迴圈的執行次數,若我們在 Python 使用這樣的邏輯會發現




顯然這兩個結果都不是我們要的,而且在上上圖中我們發現 python 有提醒我們 int 形態是不被允許的。
那麼我們應該怎麼辦呢?

此時我們需要使用 range 函數來幫助我們


由上圖的 range(10) 我們得到了一個不知名的結果,事實上那樣子就是代表著 " 從 0 開始,共10個數字 " ,配合上 list 將它拆解開我們就可以看出內部到底長怎樣,原來它就像是一個列表,裡面存著 0~9 共十個數字成員。如此一來我們就可以滿足python 的 for .. in .. : 函數的要求,如 37 行程式碼中所示。當然我們可以將 list(range(10)) 直接用 range(10) 取代,更為簡潔。


進階補充 :

在 for 迴圈的使用上 python 有跟 C 語言一樣的 break 還有 continue 指令,且用法也與 C 語言一模一樣。

看往本文中的第一張大圖最下方,來說明一下 break 與 continue 函數

當 break 指令被執行時,程式碼會 "整個跳出現有的迴圈" ,在此使用 while 迴圈來做示範,使用在 for 迴圈也是可以的。我們一開始假設一個數字 6 是正確的答案,並且讓使用者輸入一個數字放入 answer 中,利用 while 不斷的反覆執行迴圈,假若我們在 while 迴圈內沒有使用 break 來讓迴圈跳出,則這個程式就會進入死循環,不會有結束的一天。但我們加入了一個 if 判斷式,當使用者輸入的輸字與我們設定的數字 6 相符時我們就執行 break 來跳出迴圈。

當 continue 被執行時,迴圈會繼續被執行,但是會 " 略過循環體(迴圈)內後續的指令,並回到判斷式 "。
我們看到第 60 行程式碼,使用了 for 迴圈進行 1,2,3,4 的列印,一開始 i 會等於數字 1 ,然後進入 if 判斷式,發現判斷不成立,所以忽略了62與63行的程式碼,接著執行第 64 行的程式碼(看清楚縮排,第 64 行是屬於 for 迴圈內的程式碼) 列印出 1V 的結果。

然後回到第 60 行,此時 i 變成列表中的第二個元素(成員)也就是數字 2 ,然後執行第 61 行,發現判斷式成立,會執行 62 與 63 行。第 62 行列印出一個 X 文字, 63 行執行了 continue 命令。這時,for 函數會跳回第 60 行直接進行下一次的迴圈(也就是 i 變成第三個成員,數字 3),忽略了第 64 行。

所以我們可以說
當遇到 break , 會直接跳出整個迴圈
當遇到 continue ,會直接跳回迴圈的判斷式


註 :
1. for ... in ... :  最後的冒號是很常被我們所遺忘的,要特別注意

2. Python 對於 "空格(或稱縮排,TAB)" 符號相當敏感,這在 C 語言中倒是沒這樣的問題,我認為 C 語言中使用 { } 來代表區塊的概念在視覺上會比 Python 利用縮排來表達區塊更為直觀。

3. 對於用字串來當作索引,與其用 1,2,3,4,5,6來理解,不如可以想像是 Python 自動將字串進行了 list ,然後依序進行索引。


#Python for迴圈
text = "MyGod"
for i in text:
    print(i)
    
#
text = "MyGod"
for i in text:
    print(i,end='')

print('\n')

#
text = ['一號','二號','三號','四號']

for i in text:
    print(i)

print('\n')

#
text = ['一號','二號','三號','四號']

for i in text:
    print(i,end=' ')

print('\n')

#
text = ['一號','二號','三號','四號']

for i in text:
    print(i,len(i))

print('\n')

#運用range來實現C語言常用的迴圈
myrange = list(range(10))
print(myrange)

for i in myrange:
    print(i)

#break強制中止迴圈
correct = 6
answer = int(input('輸入您覺得正確的數字:'))

while True:
    if answer == correct:
        break
    else:
        print('輸入錯誤!')
        answer = int(input('再次輸入您覺得正確的數字:'))


print('輸入正確! 結束')

#continue 跳過循環體內後續的指令,並回到循環的判斷式

for i in range(4):# [0,1,2,3]
    if i==2:
        print('X') #若i等於2,則列印文字X,且將下方的print(str(i)+'V')忽略掉,也就是說不會列印文字'2V'出現
        continue #在此與for迴圈搭配使用
    print(str(i)+'V') #若i不等於2,則該指令不會被continue忽略掉
#

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引