7 For 迴圈

迴圈是撰寫程式相當重要的環節,它可以幫助我們省去撰寫重複內容的程式。假設我們現在想做一件事情:我們想讓 Python 輸出美國影集六人行(Friends)的六個主要演員:

print("Jennifer Aniston")
## Jennifer Aniston
print("Courteney Cox")
## Courteney Cox
print("Lisa Kudrow")
## Lisa Kudrow
print("Matt LeBlanc")
## Matt LeBlanc
print("Matthew Perry")
## Matthew Perry
print("David Schwimmer")
## David Schwimmer

或者我們可以先將這六位主要演員儲存在一個 list 中,稱為 starrings,再利用選擇 list 中元素的方式一一輸出:

starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
print(starrings[0])
## Jennifer Aniston
print(starrings[1])
## Courteney Cox
print(starrings[2])
## Lisa Kudrow
print(starrings[3])
## Matt LeBlanc
print(starrings[4])
## Matthew Perry
print(starrings[5])
## David Schwimmer

在不撰寫迴圈的情況下,我們還是能夠慢慢地複製貼上結構類似的程式,修改一些小地方,進而完成我們想要做的事情。但這確實不是一個好方法,試想如果我們要輸出的不再只有 6 個元素,而是 66、666 個這麼多元素呢?這時我們可以求助迴圈來協助!

7.1 for 迴圈結構

一個 for 迴圈結構如下:

for i in x:
    # 每次迭代執行的程式

Python 使用縮排(indent)來載明每次迭代要處理的事情,假如 x 是一個 list 或是 tuple,i 會由 x[0] 起始;當一次迭代結束,i 會更動為 x[1],以此類推;而在每一次迭代中,Python 都會執行縮排部分的程式。

starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
for starring in starrings:
    print starring
## Jennifer Aniston
## Courteney Cox
## Lisa Kudrow
## Matt LeBlanc
## Matthew Perry
## David Schwimmer

在這個 for 迴圈中,迭代子(iterator)我們取名作 starring,它是以文字的資料類型存在;我們也可以讓迭代子以整數的資料類型存在:

starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
for i in range(len(starrings)):
    print starrings[i]
## Jennifer Aniston
## Courteney Cox
## Lisa Kudrow
## Matt LeBlanc
## Matthew Perry
## David Schwimmer

在這個迴圈中,迭代子(iterator)我們取名作 i,它是整數由 0 起始到 5 終止,我們藉助 range() 函數產生 0 到 5。

7.1.1 不只是 print

在迴圈之中,除了單純將迭代子印出來,我們還可以做其他的事情,例如:將每個演員的 First name 改為大寫:

starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
upper_firstnames = []
for starring in starrings:
    upper_name = starring.upper()
    upper_firstnames.append(upper_name)
print(upper_firstnames)
## ['JENNIFER ANISTON', 'COURTENEY COX', 'LISA KUDROW', 'MATT LEBLANC', 'MATTHEW PERRY', 'DAVID SCHWIMMER']

7.2 List Comprehension

將事情變得更簡單一些:

starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
upper_firstnames = [x.upper() for x in starring]
print(upper_firstnames)
## ['D', 'A', 'V', 'I', 'D', ' ', 'S', 'C', 'H', 'W', 'I', 'M', 'M', 'E', 'R']

7.3 enumerate 函數

enumerate 函數能夠同時取用索引與元素。

starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
for i, starring in enumerate(starrings):
  print("{}: {}".format(i, starring))
## 0: Jennifer Aniston
## 1: Courteney Cox
## 2: Lisa Kudrow
## 3: Matt LeBlanc
## 4: Matthew Perry
## 5: David Schwimmer

7.4 zip 函數

zip 函數能夠讓兩個迴圈平行運作。

starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
characters = ["Racheal Green", "Monica Geller", "Phoebe Buffay", "Joey Tribbiani", "Chandler Bing", "Ross Geller"]
for char, starring in zip(characters, starrings):
  print("{}: {}".format(char, starring))
## Racheal Green: Jennifer Aniston
## Monica Geller: Courteney Cox
## Phoebe Buffay: Lisa Kudrow
## Joey Tribbiani: Matt LeBlanc
## Chandler Bing: Matthew Perry
## Ross Geller: David Schwimmer