Python 程式設計

第 8 章    迴圈

(1) For 迴圈

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

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

forloop.png

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

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

▸ 例如:

for num in [1, 2, 3, 4]:
    print(num)
1
2
3
4

▸ 範例:印歡迎詞

ch8/party.py (首先建立 python/ch8 目錄))
persons = ['張三', '李四', '王五', '趙六', '劉七', '孫八', '錢九', '畢十']

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

∗ 利用 for 迴圈產生串列或字典

▸ Python 提供一種簡易的串列產生方法,稱為「串列解析法」(List comprehension),語法為:

[expression for item in list]
[expression for item in list if condition]
✶ 例如表示式為 i,迴圈為 range(10)
myFor.py
# Numbers
nums = [i for i in range(10)]
print(nums)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
✶ 平方串列 (表示式為 i*i)
myFor.py
...
print(nums)

# Squares
squares = [i*i for i in range(10)]
print(squares)
...
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
✶ 取較小的數字
myFor.py
...
print(squares)

# Smaller numbers
nums = [10, 20, 30, 40, 50, 60]
smaller = [num for num in nums if num<40]
print(smaller)
[10, 20, 30]

▸ 利用兩個對應串列產生字典

myFor.py
...
print(smaller)

# Fruit inventory
fruits = ['apple', 'banana', 'orange']
nums = [430, 312, 525]
inventory = {fruit:num for fruit, num in zip(fruits, nums)}
print(inventory)
{'apple': 430, 'banana': 312, 'orange': 525}
zip() 函式將兩個串列打包,並在每次迴圈回覆一個 Tuple 物件,內含配對元素

▸ 練習 1

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

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

party.py
...
for person in persons:
    print(f'Hi {person},歡迎參加我星期六舉辦的派對')

# Add squence numbers
for i, person in enumerate(persons):
    print(f'嗨 {person},歡迎參加星期六的派對,', end='')
    print(f'您的編號是 {i+1}')
嗨 張三,歡迎參加星期六的派對,您的編號是 1
嗨 李四,歡迎參加星期六的派對,您的編號是 2
...

▸ 列舉函式 enumerate() 回覆一個 Tuple:迴圈的計數和序列項目

∗ 變更迴圈流程

break:結束迴圈

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

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

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

(2) While 迴圈

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

while <condition>:
    <body>

while.png

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

▸ 適用於迴圈圈數未知

▸ 範例 1:從 1 到 10 累加

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

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

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

▸ 範例 3:海龜漫步

✶ 小屋龜隨機轉彎前進,直到走出螢幕。演算法如下:
1. 產生螢幕與海龜
2. 當海龜 還在螢幕範圍內
* 產生 0 或 1 的隨機數字
* 如果數字是 0 則左轉,否則右轉
* 向前走 50 步
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

▸ 註:Python 沒有 do { ... } while <condition>; 指令

▸ 練習 2