Python 程式設計

第 8 章    迴圈

(1) For 迴圈

∗ For 迴圈用來重複執行一群指令,語法:

for <variable> in <sequence>:
    <body>

forloop.png

▸ 每次迴圈從 <sequence> 序列裡取出一個項目,將其指派給 variable 迴圈變數,然後執行 <body> 本體指令群

▸ 適用於已知迴圈圈數之應用

▸ 範例:從 1 到 10 累加

ch8/forSumTo.py (首先建立 python/ch8 目錄)
sum = 0
for i in range(1, 11):
    sum += i
print(sum)
55
sum 變數稱為累加器 (Accumulator),用來累積相加的結果,初始值設為 0
for 迴圈:每次從序列裡取出一個項目指派給迴圈變數 i,然後執行本體指令
# range(1, 11):產生 1 ~ 10 的數字序列 (請參考第五章說明)
# sum += 1:迴圈的本體指令,因此向右縮排一層

▸ 範例:印歡迎詞

ch8/party.py
persons = ['張三', '李四', '王五', '趙六', '劉七', '孫八', '錢九', '畢十']

for person in persons:
    print(f'Hi {person},歡迎參加我星期六舉辦的派對')
✶ 每次迴圈從串列裡取出一個項目並指派給 person 變數,然後執行本體指令 print()

▸ 範例:反印字串

ch8/reverse.py
aString = 'abcde'

for i in range(len(aString)-1, -1, -1):
    print(aString[i], end='')
print()
len() 函式:回覆字串的長度
range(n-1, -1, -1):迴圈變數由大到小,[n-1, n-2, ..., 0]
aString[i]:字串的第 i 個字元
print(..., end=''):列印時不斷行

∗ 利用 enumerate() 函式列舉索引值

▸ Python 迴圈的主要機制是輪流取用序列中的項目,如果需要取得迴圈計數,可以利用 enumerate() 函式,例如:

ch8/party2.py
persons = ['Joe', 'Amy', 'Brad', 'Angelina', 'Zuki', 'Thandi']
for i, person in enumerate(persons):
    print(f'嗨 {person},歡迎參加星期六的派對')
    print(f'您的編號是:{i+1}')
嗨 Joe,歡迎參加星期六的派對
您的編號是:1
嗨 Amy,歡迎參加星期六的派對
您的編號是:2
嗨 Brad,歡迎參加星期六的派對
您的編號是:3
嗨 Angelina,歡迎參加星期六的派對
您的編號是:4
嗨 Zuki,歡迎參加星期六的派對
您的編號是:5
嗨 Thandi,歡迎參加星期六的派對
您的編號是:6
✶ 列舉函式 enumerate() 回覆兩個值:迴圈的計數和序列項目

(2) 以巢狀迴圈處理多維串列

∗ 一維串列 (One dimensional list)

▸ 例如:aList = [1, 3, 5, 7, 9]

∗ 二維串列 (Two dimensional list)

▸ 例如:

anArray = [
    [1, 3, 5, 7, 9],
    [2, 4, 6, 8, 10],
    [1, 4, 7],
    [2, 5, 8],
]

∗ 三維串列 (Three dimensional list)

▸ 例如:

multiArray = [
    [
        [1, 3, 5],
        [2, 4, 6],
    ],
    [
        [1, 4, 7],
        [5, 5, 8],
    ],
]

∗ 註:Python 二維串列的寫法有以下幾種:

▸ 排成一列

anArray = [[1, 3, 5], [2, 4, 6]]

▸ 依項目對齊

anArray = [[1, 3, 5],
           [2, 4, 6]]

▸ 依縮排對齊,結束符號在最後

anArray = [
    [1, 3, 5],
    [2, 4, 6]]

▸ 依縮排對齊,結束符號在新行最左,且最後一個項目保留逗點,以方便在下一行增加項目

anArray = [
    [1, 3, 5],
    [2, 4, 6],
]

▸ 練習 8-1

∗ 巢狀迴圈 (Nested loop)

▸ 巢狀迴圈:兩個以上層層包疊的迴圈

for <sequence1> in <sequence2>:
    for <variable> in <sequence1>:
        <body>

▸ 範例:利用巢狀迴圈列印家庭成員,外層迴圈列印家庭,內層迴圈列印成員,如果是第一個成員,加印「成員:」字樣, 如果不是最後一個成員,加印逗點

ch8/families.py
families = [
    ['陳家', '陳先生', '陳太太', '陳小弟'],
    ['李家', '李先生', '李太太', '李小妹'],
    ['劉家', '劉先生', '劉太太'],
]

for family in families:
    for i, member in enumerate(family):
        print(member, end='')
        if i == 0:
            print('成員:', end='')
        elif i < len(family)-1:
            print(', ', end='')
    print()
陳家成員:陳先生, 陳太太, 陳小弟
李家成員:李先生, 李太太, 李小妹
劉家成員:劉先生, 劉太太

∗ 變更迴圈流程

break:結束迴圈

for i in range(10):
    number = input('請輸入數值:')
    if number.isdigit():         # 輸入並非數值,結束迴圈
        break
    ...

continue:放棄本次迴圈,立即執行下一迴圈

✶ 例如:
for student in students:
    if not student.is_active:    # 學生已休學,跳到下一位學生
        continue
    ...

▸ 練習 8-2

(3) While 迴圈

∗ While 迴圈用來重複執行一群指令,語法:

while <condition>:
    <body>

while.png

▸ 每次判斷條件,如果為真,就繼續執行本體指令群,否則結束迴圈

▸ 適用於迴圈圈數未知

▸ 範例 1:從 1 到 10 累加

ch9/whileSumTo.py
sum = 0
i = 1
while i <= 10:
    sum += i
    i += 1
print(sum)
55
sum:累加器,初始值設為 0
i:迴圈變數,初始值設為 1 (從 1 開始加總)
while 迴圈:每次判斷 i 是否小於或等於 10, 如果是則繼續迴圈,否則結束迴圈
# 本體:利用 sum 累加數值,變數 i 加 1

▸ 範例 2:要求使用者輸入數值,如果不是數值,就再輸入一次

ch9/isNumber.py
while True: 
    number = input('請輸入數值:')
    if number.isdigit():
        print(f'你輸入了 {number}')
        break
while True:判斷條件為 True,因此迴圈永不停止
✶ 利用字串類別內建的 .isdigit() 方法判斷輸入的資料是否是數值字串
✶ 如果是數值字串,印出輸入值,然後利用 break 跳出迴圈

▸ 範例 3:小烏龜漫步

✶ 小屋龜隨機轉彎前進,直到走出螢幕。演算法如下:
1. 產生螢幕與小烏龜
2. 當小烏龜 還在螢幕範圍內
* 產生 0 或 1 的隨機數字
* 如果數字是 0 則左轉,否則右轉
* 向前走 50 步
ch9/randomWalk.py
import turtle
import random

# Define width and height of the screen
width = 600
height = 400
width2 = width/2
height2 = height/2

# Create screen and turtle objects
screen = turtle.Screen()
screen.setup(width, height)
myTurtle = turtle.Turtle()
myTurtle.shape('turtle')

# Random walk
x, y = myTurtle.position()
while -width2<x<width2 and -height2<y<height2:    # Still in screen
    if random.randint(0, 1):
        myTurtle.left(90)
    else:
        myTurtle.right(90)
    myTurtle.forward(50)
    x, y = myTurtle.position()

screen.exitonclick()
randomWalk.png

▸ 練習 8-3

上一章       下一章