狠狠撸

狠狠撸Share a Scribd company logo
Python 迴圈作業
Revised on August 18, 2021
? 迴圈作業模式
? for迴圈
? 使用range函式
? 使用break與continue命令
? for…else迴圈
? while迴圈
? while…else迴圈
? 巢狀迴圏
? 在日常生活中,有時候會重複執行相同工作:
? 課程線上測驗開放到 23:59,可不限次數練習
? 宮廟辦理新春擲筊比賽
? 計算班上 43 位學生之學期成績
? 上述前 2 項工作的執行次數無法事先確定,因為到 23:59 前不知道會
重複練習幾次,而擲筊比賽會連續擲出多少聖杯也無法預知。第三項
工作已知班上學生人數,很明顯學期成績要計算 43 次
迴圈作業模式 1/2
2
? 當迴圈工作是否繼續執行是由特定條件來決定,稱為條件迴圈。線上
測驗視是否已超過開放時間而定,擲筊比賽每位參賽者在擲出不是聖
杯時終止,Python 語言可使用 while 迴圈來處理
? 學期成績則是每位學生都要計算?次,班級學生人數就是重複執行次
數,這種已經明確知道執行次數的工作,稱為計數迴圈,我們會直接
使用 Python 語言的 for 迴圈來處理重複執行程式碼
? 迴圈的目的是簡化程式碼,將重複的工作簡化成迴圈敘述,就不用再
寫出冗?的重複程式碼或運算式,即可以完成所需的工作
迴圈作業模式 2/2
3
? for 迴圈通常配合可疊代列舉物件 (如串列) 來運作,迴圈執行時會依
序取出元素,指定給迴圈變數,?直到全部元素都處理完為止
? 語法
for 廻圈變數 in 串列:
廻圈區塊
? 迴圈區塊要向右縮排4個空白字元
? 如果迴圈區塊只有?行程式碼時,迴圈區塊可以接續在冒號後?
for 迴圈 1/2
True
還有元素未處理?
False
迴圏變數=串列
第1個元素
迴圏變數=串列
下1個元素
迴圏區塊
4
? for 迴圈範例1
fruits = ['apple', 'banana', 'cherry', 'orange']
for x in fruits:
print(x, end = ", ")
執行結果:
apple, banana, cherry, orange
? for 迴圈範例2
price = [60, 33.4, 500, 125]
for x in price:
print(x, end = ", ")
執行結果:
60, 33.4, 500, 125
for 迴圈 1/2
5
? range()函式用來產生整數串列,語法:
? range (end)
產生?個從 0 到 end - 1 遞增的整數串列
range(5)結果為[0, 1, 2, 3, 4]
? range (start, end [,step])
產生?個從 start 開始 到 end (不含),間隔 step 的遞增或遞減整數串列
? start:整數串列的起始值,如果省略初值時,則預設從0開始
range(0, 5)與range(5)相同,結果都是[0, 1, 2, 3, 4]
? end:整數串列的終止值 (串列不含終止值)
? step:整數串列元素的間隔值,預設值為 1
range(0, 5, 1)與range(0, 5)相同,結果都是[0, 1, 2, 3, 4]
range()函式 1/2
6
? step 是正值時,產生串列為遞增串列, start 必須小於 end。產生的
串列為由 start 開始,每次遞增 step 值,到 end - 1 為止
range(1, 10, 2)結果為[1, 3, 5, 7, 9]
range(5, 0, 1)結果為[]
? step 為負值時,產生串列為遞減串列,start 必須大於 end。產生的
串列為由 start 開始,每次遞減 step 值, 到 end + 1 為止
range(5, -5, -2)結果為[5, 3, 1, -1, -3]
range(1, 10, -2)結果為[]
range()函式 2/2
7
? ㄧ個數如果恰巧等於他的因數之和,稱為完美數 (Perfect number)
? 6 = 1 + 2 + 3,所以 6 為完美數
? 8 ≠ 1 + 2 + 4,所以 8 不是完美數
? 28 = 1 + 2 + 4 + 7 + 14,所以 28 為完美數
? 設計程式,列出介於指定區間的完美數
Lab 尋找完美數 1/2
8
? 參考程式
mn = int(input('輸入起始值:'))
mx = int(input('輸入結束值:'))
print('從%d到%d之間的完美數有:' %(mn, mx))
for n in range(mn, mx + 1):
sum = 0
for i in range(1, n // 2 + 1):
if(n % i == 0):
sum = sum + i
if(sum == n):
print('%d' %(n))
測試:
輸入起始值:1
輸入結束值:10000
從1到10000之間的完美數有:
6
28
496
8128
Lab 尋找完美數 2/2
9
? 在數論中,水仙花數 (Narcissistic number) 也稱為自戀數、自冪數,
用來描述?個 N 位正整數,該整數值等於其各位數字的N次方和
? 153 是?個「水仙花數」,因為 153 1 5 3
? 1634 是?個「水仙花數」,因為 1634 1 6 3 4
? 設計程式,列出4位數 (1000~9999) 的自戀數
Lab 尋找自戀數 1/2
10
? 參考程式
print('Narcissistic numbers between 1000 and 10000:')
for n in range(1000, 10000):
i = n // 1000 #分解出千位數
j = n // 100 % 10 #分解出百位數
k = n // 10 % 10 #分解出十位數
l = n % 10 #分解出個位數
if(n == i ** 4 + j ** 4 + k ** 4 + l ** 4):
print('%5d' %(n))
測試:
Narcissistic numbers between 1000 and 10000:
1634
8208
9474
Lab 尋找自戀數 2/2
11
? 費氏數列 (Fibonacci number) 頭兩個數為 0 與 1,之後值為其前兩個
數總和
? 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610
? 設計程式,計算任?項的費氏數列值
Lab 費氏級數 1/2
12
? 參考程式
num = int(input('計算第幾項費氏級數值?'))
a = 0
b = 1
for i in range(1, num + 1):
a, b = b, a + b
print(a, end = ',')
print()
print('費氏級數第%d項的值為%d' %(num, a))
測試:
計算第幾項費氏級數值?10
1,1,2,3,5,8,13,21,34,55,
費氏級數第10項的值為55
Lab 費氏級數 2/2
13
? 迴圈執行時,break 命令可強制脫離迴圈
? 須搭配條件敘述
? break 命令也適用 while 迴圈
break命令
14
1
2
3
4
5
6
7
for var in range(start, end):
statement
if(boolean-expression):
break
statement
...
statement
強制脫離for迴圈
? 迴圈執行時,continue 命令可略過本次循環,回到迴圈起始處執行下
?循環
? 須搭配條件敘述
? continue 命令也適用 while 迴圈
continue命令
15
1
2
3
4
5
6
7
for var in range(start, end):
statement
if(boolean-expression):
continue
statement
...
statement
繼續處理下一個元素資料
? for 迴圏可以加上else程式區塊,語法如下:
for 迴圈變數 in 串列:
迴圈區塊
else:
程式區塊
? 當 for 迴圈正常結束後,程式流程才會執行else程式區塊?次
for…else
True
還有元素未處理?
False
迴圏變數=串列
第1個元素
迴圏變數=串列
下1個元素
迴圏區塊
else程式區塊
16
? 質數 (Prime number),又稱素數,指在大於 1 的自然數中,除了 1 和
該數自身外,無法被其他自然數整除的數 (也可定義為只有 1 與該數本
身兩個正因數的數)
? 設計程式,判斷輸入之整數值是否為質數
Lab 判斷質數 1/2
17
? 參考程式
import math
num = int(input('輸入整數:'))
for i in range(2, int(math.sqrt(num)) + 1):
if(num % i == 0):
print('%d不是質數' %num)
break
else:
print('%d為質數' %num)
測試:
輸入整數:47
47是質數
Lab 判斷質數 2/2
18
? while迴圈在迴圈開始前,會先檢查條件式是否成立,如果不成立,程
式流程會略過迴圈區塊,向下繼續執行。反之,程式流程會在迴圈內
循環,直到條件式的結果不成立,才會脫離迴圈。
? 語法
while (條件式):
迴圈區塊
? 通常用於沒有固定次數的情況
while迴圈 1/2
True
迴圏條件? 迴圏區塊
False
19
? 設計程式計算飯店之平均星等評分
sum = count = rating = 0
average = 0.0
while (rating != -1):
rating = float(input('輸入評等第(1-5), 完成請輸入-1: '))
if (rating != -1):
sum += rating
count += 1
average = float(sum/count)
print('飯店平均星級評等是: %.2f' %average)
測試:
輸入評等第(1-5), 完成請輸入-1: 3
輸入評等第(1-5), 完成請輸入-1: 4
輸入評等第(1-5), 完成請輸入-1: 5
輸入評等第(1-5), 完成請輸入-1: 4
輸入評等第(1-5), 完成請輸入-1: 5
輸入評等第(1-5), 完成請輸入-1: -1
飯店平均星級評等是: 4.20
while迴圈 2/2
20
? while 迴圏也可以加上else程式區塊,語法如下:
while (條件式):
迴圈區塊
else:
程式區塊
? while迴圈正常執行結束 (非使用break中止迴圏) 後,才會執行else程式區塊
? 設計倒數5秒計時程式,計時終了顯示time out訊息
while…else 1/2
21
? 參考程式
import time
n = 5
while n != 0:
print (n)
n -= 1
time.sleep(1)
else:
print("time out...")
測試:
5
4
3
2
1
time out...
while…else 2/2
22
? 若迴圈內還有迴圈,?層?層由內而外即構成「巢狀迴圈」(Nested
loop),也可以稱為「多重迴圈」
? 無論是for或while迴圈,或是相互套用都可以構成巢狀迴圈
? 撰寫巢狀迴圈程式時,要特別注意縮排程式才能正確執行
? 設計程式,列出小於指定數的所有質數
巢狀迴圈 1/3
23
? 參考程式
import math
prime = []
num = int(input('輸入整數:'))
for i in range(2, num):
for j in range(2, int(math.sqrt(i)) + 1):
if(i % j == 0):
break
else:
prime.append(i)
print('%d以下的質數為:n' %num, prime)
測試:
輸入整數:50
50以下的質數為:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
巢狀迴圈 2/3
24
? 設計程式,列出九九乘法表
for i in range(1, 10):
for j in range(1, 10):
product = i * j
print('%d*%d=%-2d ' % (i, j, product), end = '')
print()
測試:
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
巢狀迴圈 3/3
25
? range(1, 5, 2)所得到之串列為何?
A. [1, 2, 3, 4 ,5]
B. [1, 3, 5]
C. [1, 2, 3, 4]
D. [1, 3]
? range(1, 5, -2)所得到之串列為何?
A. [1, 2, 3, 4]
B. [1, 3, 5]
C. [1, 3]
D. []
自我評量 1/7
26
? 下列程式碼執行後,輸出結果為何?
sum = 0
for x in range(10):
sum += x
print(x, sum, sep = ',')
A. 9,45
B. 10,45
C. 10,55
D. 11,55
自我評量 2/7
27
? 下列迴圏區塊,執行的次數為何?
for x in range(1, 10):
print (x)
A. 無限次
B. 0次
C. 9次
D. 10次
自我評量 3/7
28
? 下列程式,最後?次輸出的結果為何?
x = -10
while (x):
print (x)
x += 1
A. -1
B. 0
C. 1
D. 語法錯誤,無法執行
自我評量 4/7
29
? 下列程式,最後?次輸出的結果為何?
x = 10
while (x):
print (x)
x -= 1
A. -1
B. 0
C. 1
D. 語法錯誤,無法執行
自我評量 5/7
30
? 下列迴圏區塊,執行的次數為何?
for x in range(1, 10):
if x % 2:
continue
print(x, end = ',')
A. 1,2,3,4,5,6,7,8,9,10,
B. 1,2,3,4,5,6,7,8,9,
C. 1,3,5,7,9,
D. 2,4,6,8,
自我評量 6/7
31
? 下列迴圏區塊,執行的次數為何?
for x in range(1, 10):
if not x % 2:
continue
print(x, end = ',')
A. 1,2,3,4,5,6,7,8,9,10,
B. 1,2,3,4,5,6,7,8,9,
C. 1,3,5,7,9,
D. 2,4,6,8,
自我評量 7/7
32
? 有?隻蝸?爬 20 公尺的旗桿,白天可向上爬 3.5 公尺,晚上會下滑
1.2 公尺。寫?程式顯示蝸?爬到桿頂的過程
實作練習 1/3
33
? 參考程式
climb = 3.5
slip = 1.2
height = 20.0
day = 0
while (height > climb):
day += 1
height = height - climb + slip
print('第%d天:白天爬%3.1f公尺,晚上下滑%3.1f公尺,還有%3.1f公尺' %(day,
climb, slip, height))
if (height > 0):
day += 1
print('第%d天:爬%4.1f公尺' %(day, height))
print('蝸?爬到樹頂共需%d天' %(day))
實作練習 2/3
34
測試:
第1天:白天爬3.5公尺,晚上下滑1.2公尺,還有17.7公尺
第2天:白天爬3.5公尺,晚上下滑1.2公尺,還有15.4公尺
第3天:白天爬3.5公尺,晚上下滑1.2公尺,還有13.1公尺
第4天:白天爬3.5公尺,晚上下滑1.2公尺,還有10.8公尺
第5天:白天爬3.5公尺,晚上下滑1.2公尺,還有8.5公尺
第6天:白天爬3.5公尺,晚上下滑1.2公尺,還有6.2公尺
第7天:白天爬3.5公尺,晚上下滑1.2公尺,還有3.9公尺
第8天:白天爬3.5公尺,晚上下滑1.2公尺,還有1.6公尺
第9天:爬1.6公尺
蝸?爬到樹頂共需9天
實作練習 3/3
35

More Related Content

Python 迴圈作業