Python 基礎教學

1. Python 環境設定 2. Python 基本變數 3. Python 流程控制 4. Python 模組與套件概念 5. Pandas 資料處理 6. Matplotlib 繪圖 7. Jieba 切詞
課程介紹 & 程式碼

迴圈for

為何機器可以取代人力,因為高重複性的事情正是電腦的強項,而為何電腦可以做到持續重複不出錯呢?其實背後都是靠for迴圈指令在進行的,也因此不管在哪種程式語言中,都可以看到for迴圈的身影,因為沒有for迴圈,那該語言就無法有效地取代人力了。在Python中,最基本的for迴圈的構造如下所示:

for 變數 in 範圍:
    執行的指令

1. 冷知識:為什麼迴圈的變數都是「i」?

寫了5年的程式,在一次上課中有學生問了這樣一個問題:「為什麼大家這麼有默契,迴圈的變數都是用i阿?」說真的我被考倒了。的確!迴圈的變數跟一般的變數命名一樣,只要不要使用到該程式語言的保留字元即可但是:

我寫過VBA、Java、Python、R語言、PHP、SQL、JavaScript...,為何每個教學者或範例在迴圈中都使用「i」,還指定是小寫的「i」。

你以為是「變數」這個單子的英文縮寫嗎?變數的英語可以用:Variable,scalar,這裡面只有Variable 出現了一個「i」,要說因為這樣而大家都使用「i」也很遷強。雖然說知道這個冷知識也不會讓程式能力增加多少,但好奇心驅使我花這個時間。這個問題尋找了許久無果,直到碰到一位老教授才為我解惑。

其實這個概念是來自於數學微積分當中的「積分(英文:integral)」這個詞。微積分就是要將每一個微小的數值累積,計算出總面積,這個感有沒有很像for迴圈在做的事情呢?另一方面,當時程式也在微積分的領域中發揮了舉足輕重的地位,在沒有使用程式幫我們算積分之前,用人工的方式算出來可是非常耗時的(想想您國中的地獄時光)。至此早期的數學家與工程師都開始使用小寫的「i」作為迴圈的變數,而後輩的模仿之下,成就了今天的「神秘小i」。

2. 訂定迴圈範圍

1. range()

看到的十個迴圈中有一半是使用range()的方式呈現的,以打印出0~5的範例來舉例,他會這樣寫:

for i in range(5):
    print(i)

以上的指令會產出以下的結果:

0
1
2
3
4

您可能會很好奇明明輸入5,為何出來的結果只到4,別忘了在基本變數-陣列List這堂課中有分享過,Python程式的編號是從0開始喔!可以想像成從0開始,打印五個數字出來。

但如果不想要從0開始,或者想要公差不一樣的數列,那就先來理解一下range()這個方法有哪些參數可以使用:

range(開始, 結束, 公差):

用數字來舉例會比較明瞭,可以看到產出的數字從1開始,並且公差是2。值得一提的是,最後的結果只有到9,原因是因為9+2已經超過10了,因此迴圈就直接結束了。

for i in range(1, 10, 2):
    print(i)

以上的指令會產出以下的結果:

1
3
5
7
9

2. 陣列list

若我們想要把list的每筆資料拿出來進行使用,在python中非常的方便,可以直接取用(在許多程式語言是無法這樣做的),使用的方法如下:

for i in ['由於本次國際間的晶片短缺', '導致於護國神山的台積電(2330)', '股價一路升突破600大關', '外資揚言喊到破千']:
    print(i)

# 也可以寫成以下這樣,正常來說其實都是這樣寫
thestr = ['由於本次國際間的晶片短缺', '導致於護國神山的台積電(2330)', '股價一路升突破600大關', '外資揚言喊到破千']
for i in thestr:
    print(i)

以上的指令會產出以下的結果:

由於本次國際間的晶片短缺
導致於護國神山的台積電(2330)
股價一路升突破600大關
外資揚言喊到破千

3. 字串str

在基本變數-文字str,字串處理課程中有學過,字串也可以理解為每一個文字組成的「陣列」,因此也可以這樣做:

for i in '外資揚言喊到破千':
    print(i)

# 也可以寫成以下這樣,正常來說其實都是這樣寫
thestr = '外資揚言喊到破千'
for i in thestr:
    print(i)

以上的指令會產出以下的結果:

外
資
揚
言
喊
到
ç ´
千

4. 字典dict

在基本變數-字典Dict的課程中有分享過,字典與陣列最大的不同在於,陣列才有順序性,因此若用for迴圈將字典的資料格式打開,多半是在「找字典」裡面的某個資料時所使用:

dic = {
    '縣市名稱': '台北',
    '人口數(萬)': 200,
    '歷年市長': ['獎萬安','柯文哲','馬英九']
}
for i in dic:
    print(i)

以上的指令會產出以下的結果:

縣市名稱
人口數(萬)
歷年市長

發現使用for迴圈打開字典,得到的竟然是key,有學過基本變數-字典Dict這堂課程的您一定知道要如何取出每筆資料的value了:

dic = {
    '縣市名稱': '台北',
    '人口數(萬)': 200,
    '歷年市長': ['獎萬安','柯文哲','馬英九']
}
for i in dic:
    print(dic[i])

以上的指令會產出以下的結果:

台北
200
['獎萬安','柯文哲','馬英九']

3. for結合if

for 結合if 是非常常見的,我們就已在課程判斷式If賣的關子:如果想要檢查list的各個物件內,有沒有想要的關鍵字,要怎麼查詢呢?:

news = ['由於本次國際間的晶片短缺', '導致於護國神山的台積電(2330)', '股價一路升突破600大關', '外資揚言喊到破千', '但有專家指出', '目前台灣的景氣燈號', '正轉向', '藍燈'] # 新聞文章
for i in news:
    if '藍燈' in i:
        print('藍燈這個字有在news裡面')

先使用for迴圈將陣列list變數news給打開,而每個資料內容都是字串str的格式,接著就用我們學過的in來尋找即可。

4. 雙重for迴圈

CPU計算資源比工程師貴 這裡要先提醒程式的初學者,我們在學習的階段可以盡量的使用迴圈,但若您真的要實際搭建程式系統時,請盡量避免使用迴圈。原因在於,迴圈所消耗的記憶體與CPU運算資源其實是非常可觀的,尤其在迴圈的執行量很大的時候。 當迴圈中還有迴圈,則會產生如下的成果。可以發現每次i這個變數執行一次,j這個變數都會執行三次,也就是第二層迴圈整體被執行了三次:

for i in range(2): # 第一層
    for j in range(3): # 第二層
        print('目前i: ' + str(i) + ' 目前j: '+ str(j))
    print('\n')

以上的指令會產出以下的結果:

目前i: 0 目前j: 0
目前i: 0 目前j: 1
目前i: 0 目前j: 2


目前i: 1 目前j: 0
目前i: 1 目前j: 1
目前i: 1 目前j: 2

可以注意到換行print('\n')的部分所在的位置,使每次第一層迴圈執行完以後,都會有個換行來幫助我們閱讀。

5. 跳過continue

有時候迴圈的內容並不是我們能夠控制的(如上網爬下來),因此有時碰到一些資料我們需要「略過」。以數字來舉例,若我們要列出0~10之中所有的奇數:

for i in range(10):
    if i % 2 == 1:
        print(i)
    else:
        continue

以上的指令會產出以下的結果:

1
3
5
7
9

6. 跳出break

break是個非常好用的指令。當您突然非常想吃「炙燒鮭魚壽司」而來到迴轉壽司店,坐下來等了許久終於等到「炙燒鮭魚壽司」,一口塞下肚以後目標已達成,沒有坐在那裏的必要了,那你會怎麼做呢?當然是直接離開,起身去結帳,break就是那個驅動你身體離開的指令。一樣以數字來舉例,雖然列出0~10的數字,但只要看到5就跳出去:

for i in range(10):
    print(i)
    if i == 5:
        break

以上的指令會產出以下的結果:

0
1
2
3
5

記住break只會跳出「一層」的迴圈,因此以雙重迴圈為例,若在第二層迴圈中加入break條件,則出來的結果如下:

for i in range(2): # 第一層
    for j in range(5): # 第二層
        if j == 5:
            break
        else:
            print('目前i: ' + str(i) + ' 目前j: '+ str(j))
    print('\n')

以上的指令會產出以下的結果:

目前i: 0 目前j: 0
目前i: 0 目前j: 1
目前i: 0 目前j: 2
目前i: 0 目前j: 3
目前i: 0 目前j: 4


目前i: 1 目前j: 0
目前i: 1 目前j: 1
目前i: 1 目前j: 2
目前i: 1 目前j: 3
目前i: 1 目前j: 4

作者:楊超霆 行銷搬進大程式 創辦人

©2023 行銷搬進大程式 Marketing Live in Code