Python程式設計

Lesson 6 - 迴圈

108期中考檢討第一題

# 請寫一個程式,讓使用者輸入兩張撲克牌,計算並輸出總和
card1 = input('輸入第一張牌')
card2 = input('輸入第二張牌')
if card1 == 'A':
    card1 = 1
if card2 == 'A':
    card2 = 1
print(int(card1) + int(card2))

108期中考檢討第二題

# 輸入一個正整數,判斷是5或7的倍數
number = int(input('輸入正整數'))
mod5 = number % 5
mod7 = number % 7
if number<=0:
    print('不是正整數')
else:
    if mod5==0 and mod7==0:
        print('5 和 7的倍數')
    elif mod5==0:
        print('5的倍數')
    elif mod7==0:
        print('7的倍數')
    else:
        print('不是5 或 7的倍數')

程式基本概念程式與演算法

Algorithm

發音: Al-go-ri-thm

演算法: 完成一件工作的一系列步驟

Program

發音: Pro-gram

程式: 編程完成的演算法(可執行)

演算法(步驟)

向右移動一格

塗滿空格

向右移動一格

向下移動一格

塗滿空格

有5個程式指令:

上 下 左 右

填滿

程式

填滿

填滿

由星號出發

程式基本概念資料

Variable

發音: Va-ri-able

變數: 資料內容(可改變) 的存放空間

Data Type

發音: Da-ta Type

資料型別: 資料存放空間的類型

x = 5
y = input('請輸入數值')

指定

半徑 = int(input('輸入:')) // 字串轉整數
面積 = 3.14 * 半徑**2; // 平方, 乘法

運算

半徑字串 = input('輸入:') // 字串
半徑數值 = int(半徑字串)  // 字串轉整數
面積 = 3.14 * 半徑數值**2; // 平方, 乘法
# 轉換函式: int(), float(), str(), chr()

型別轉換

程式基本概念流程控制

Loop

發音: loop

迴圈: 重複做的動作

Conditionals

發音: Con-di-shun-uls

條件判斷: 在某些情況才會執行的動作

for i in range(1,10,2):
    print(i, end=',')
# 印出 2,4,6,8
total = n = 0
while(n < 10):       # 條件式: n < 10
    n += 1           # 自行改變 n值
    total += n     
# 加總1~10

for迴圈

while迴圈

if score<60:
    print('不及格')
elif score<=80:
    print('甲等')
else:
    print('超出範圍')

選擇結構

電腦最擅長...

重複的工作

累加

費式數列

矩陣乘法

迴圈(Loop)語法

搜尋

電腦有多快(1/3)

MIPS: 百萬指令/秒

8位元CPU: 8086

Core i7-8086K

CPU cycle: cpu循環

電腦有多快(2/3)

執行: 不同類型指令

讀取

解碼

儲存

不同類型指令:算術運算、邏輯運算...

面積 = 半徑 ** 2 * 3.14
if 面積>100:
    print('....')
elif:
    print('....')

電腦有多快(3/3)

加法指令

浮點數加法指令

乘法指令

浮點數除法指令

CPU循環

小於1個循環

1~3個循環

1~7個循環

10~40個循環

迴圈loop (1/18)

問題:如何產生1000 個「Hello」?

print('Hello')
print('Hello')
print('Hello')
# ....省略...
print('Hello')

總共1000個print:共1000行

for i in range(1000):
    print('Hello ')

迴圈版:2行

for迴圈語法?

range(1000)?

串列串列與For迴圈(2/18)

for 迴圈變數 in 數列:
    程式區塊

基本語法回顧

For迴圈使用串列

數列: 可用range()建立

數列: 也可用串列建立

for 迴圈變數 in 串列:
    程式區塊

使用串列建立數列

範例

fruits = ['香蕉', '鳳梨', '蘋果', '橘子']
for item in fruits:
    print('水果名:%s' % item) # 印出迴圈變數值
水果名:香蕉
水果名:鳳梨
水果名:蘋果
水果名:橘子

執行結果

串列串列與For迴圈(3/18)

# ch7_3.py
players = ['Curry', 'Jordan', 'James', 'Durant', 'Obama']
for player in players:
    print(player)

串列串列與For迴圈(4/18)

範例

# ch7_5.py
players = ['curry', 'jordan', 'james', 'durant', 'obama']
for player in players:
    print(player.title( ) + ", it was a great game.")
    print("I can not wait to see your next game, " + player.title( ))
Curry, it was a great game.
I can not wait to see your next game, Curry
Jordan, it was a great game.
I can not wait to see your next game, Jordan
James, it was a great game.
I can not wait to see your next game, James
Durant, it was a great game.
I can not wait to see your next game, Durant
Obama, it was a great game.
I can not wait to see your next game, Obama

執行結果

for迴圈內的程式區塊可以有多行

串列串列與For迴圈(5/18)

範例

# ch7_6.py
players = ['Curry', 'Jordan', 'James', 'Durant', 'Obama']
print("列印前3位球員")
for player in players[:3]:
    print(player)
print("列印後3位球員")
for player in players[-3:]:
    print(player)
列印前3位球員
Curry
Jordan
James
列印後3位球員
James
Durant
Obama

執行結果

for迴圈搭配擷取部份串列內容

迴圈函式:range() (6/18)

函式:range()

  • 作用: 建立整數循序數列
  • 循序數列:1,2,3,....依序改變的數列(例: 等差級數)
  • 可用於迴圈(例如設定迴圈執行1000次)
數列變數 = range(整數值)    # 單一參數
list1 = range(5)    # 注意不能用list當變數名稱
print(list(list1))  # 因為list()是內建函式
print(list1)        # 印出'range(0, 5)'
print(type(list1))  # 印出 list1型別

基本語法

產生 0  到 (整數值 - 1) 的數列

範例

range(0, 5)
[0, 1, 2, 3, 4]
<class 'range'>

執行結果

從0開始, 共5個

注意方括弧: 代表「串列」(最重要的資料型別)

list(range物件): 可將range物件轉為「串列」

迴圈函式:range() (7/18)

範例

# ch7_7.py
n = 5
number1 = list(range(n))
print("當n值是%d時的range( )串列 = " % n, number1)
n = 8
number2 = list(range(n))
print("當n值是%d時的range( )串列 = " % n, number2)
當n值是5時的range( )串列 =  [0, 1, 2, 3, 4]
當n值是8時的range( )串列 =  [0, 1, 2, 3, 4, 5, 6, 7]

執行結果

使用range()函數,產生串列的應用

範例

# ch7_8.py
n = 5
print("當n值是%d時的range( )串列元素:" % n)
for number in range(n):
    print(number)
n = 8
print("當n值是%d時的range( )串列元素:" % n)
for number in range(n):
    print(number)
當n值是5時的range( )串列元素:
0
1
2
3
4
當n值是8時的range( )串列元素:
0
1
2
3
4
5
6
7

迴圈函式:range() (8/18)

數列變數 = range(起始值, 終止值)    # 二個參數
list2 = range(5, 10) # 數列5,6,7,8,9
list3 = range(-3, 3) # 數列-3,-2,-1,0,1,2
list4 = range(5, 3)  # 空數列, 因為起始值較大

基本語法

產生 「起始值」  到 (終止值 - 1) 的數列

範例

迴圈函式:range() (9/18)

# ch7_9.py
start = 2
end = 6
number1 = list(range(start, end))
print("當start值是%2d, end值是%2d時的range( )串列 = " % (start, end), number1)
start = -2
end = 3
number2 = list(range(start, end))
print("當start值是%2d, end值是%2d時的range( )串列 = " % (start, end), number2)
start = -5
end = -1
number3 = list(range(start, end))
print("當start值是%2d, end值是%2d時的range( )串列 = " % (start, end), number3)
當start值是 2, end值是 6時的range( )串列 =  [2, 3, 4, 5]
當start值是-2, end值是 3時的range( )串列 =  [-2, -1, 0, 1, 2]
當start值是-5, end值是-1時的range( )串列 =  [-5, -4, -3, -2]

執行結果

使用range()函數,產生串列的應用

迴圈函式:range() (10/18)

# ch7_10.py
start = 2
end = 6
print("當start值是%d, end值是%d時的range( )串列元素:" % (start, end))
for number in range(start,end):
    print(number)
start = -2
end = 3
print("當start值是%d, end值是%d時的range( )串列元素:" % (start, end))
for number in range(start,end):
    print(number)
start = -5
end = -1
print("當start值是%d, end值是%d時的range( )串列元素:" % (start, end))
for number in range(start,end):
    print(number)

使用range()函數,產生串列的應用

迴圈函式:range() (11/18)

基本語法

數列變數 = range(起始值, 終止值, 間隔值)    # 三個參數
list5 = range(2, 10, 2) # 數列2,4,6,8
list6 = range(100, 90, -3) # 數列100, 97, 94, 91

範例

產生從「起始值」開始,遞增「間隔值」,直到 (終止值 - 1) 的數列

迴圈函式:range() (12/18)

# ch7_11.py
start = 2
end = 9
step = 2
number1 = list(range(start, end, step))
print("當start值是%2d, end值是%2d, step值是%2d時的range( )串列 = " % (start, end, step), number1)
start = -2
end = 9
step = 3
number2 = list(range(start, end, step))
print("當start值是%2d, end值是%2d, step值是%2d時的range( )串列 = " % (start, end, step), number2)
start = 5
end = -5
step = -3
number3 = list(range(start, end, step))
print("當start值是%2d, end值是%2d, step值是%2d時的range( )串列 = " % (start, end, step), number3)

使用range()函數,產生串列的應用

當start值是 2, end值是 9, step值是 2時的range( )串列 =  [2, 4, 6, 8]
當start值是-2, end值是 9, step值是 3時的range( )串列 =  [-2, 1, 4, 7]
當start值是 5, end值是-5, step值是-3時的range( )串列 =  [5, 2, -1, -4]

執行結果

迴圈函式:range() (13/18)

# ch7_12.py
start = 2
end = 9
step = 2
number1 = list(range(start, end, step))
print("當start值是%2d, end值是%2d, step值是%2d時的range( )串列元素:" % (start, end, step))
for number in range(start,end,step):
    print(number)
start = -2
end = 9
step = 3
number2 = list(range(start, end, step))
print("當start值是%2d, end值是%2d, step值是%2d時的range( )串列元素:" % (start, end, step))
for number in range(start,end,step):
    print(number)
start = 5
end = -5
step = -3
number3 = list(range(start, end, step))
print("當start值是%2d, end值是%2d, step值是%2d時的range( )串列元素:" % (start, end, step))
for number in range(start,end,step):
    print(number)

使用range()函數,產生串列的應用

迴圈for迴圈更多應用 (14/18)

# ch7_14.py
n = int(input("請輸入整數:"))
number = list(range(n + 1))       # 建立串列
total = 0                         # 總計
for i in number:
    total += i
print("從1到%d的總和是 = " % n, total)

範例:輸入整數n,算出1+2+3+...+n的總和

...
sum = 0
for i in range(3, 13, 3):
    sum += i
...

total += i的運作方式?

迴圈for迴圈更多應用 (15/18)

# ch7_15.py
n = int(input("請輸入整數:"))
total = 0                         # 總計
for i in range(1, n+1):
    total += i
print("從1到%d的總和是 = " % n, total)

範例:輸入整數n,算出1+2+3+...+n的總和(另一種寫法)

迴圈for迴圈更多應用 (16/18)

# ch7_16.py
squares = []                     # 建立空串列
n = int(input("請輸入整數:"))
if n > 10 : n = 10               # 最大值是10
for num in range(1, n+1):        
    value = num * num            # 元素平方
    squares.append(value)        # 加入串列
print(squares)

範例:輸入n值,求1到n的平方合 1²+2²+...+n²=?

# ch7_17.py
squares = []                     # 建立空串列
n = int(input("請輸入整數:"))
if n > 10 : n = 10               # 最大值是10
for num in range(1, n+1):        
    squares.append(num ** 2)     # 加入串列
print(squares)

範例3

students = ['張三', '李四', '趙大', '王五']
for i in range(len(students)):
    print('編號 %d: 姓名:%s' % (i+1, students[i]))
編號 1: 姓名:張三
編號 2: 姓名:李四
編號 3: 姓名:趙大
編號 4: 姓名:王五

執行結果

students[i]: 串列第i個元素。從0起算

len()函式: 串列長度

迴圈for迴圈更多應用 (17/18)

練習:科目名稱串列與分數串列如下:

subjects = ['國文', '英文', '數學']
scores = [100, 80, 90]
國文科:100分
英文科:80分
數學科:90分

執行結果

請運用range(), len()等函式,將串列內容輸出如下:

迴圈for迴圈更多應用 (18/18)

Python迴圈語法

  • for迴圈: 通常用於「迴圈次數固定」的清況
  • while迴圈: 通常用於「迴圈次數不固定」的清況
  • 巢狀迴圈: 迴圈內含另一層(或含多層)迴圈
  • 跳出迴圈: break指令
  • 跳過當輪迴圈: continue指令

for迴圈回顧(1/4)

用於固定次數的迴圈

for 迴圈變數 in 數列:
    程式區塊

基本語法

for, in都是保留字

迴圈變數自行取名

數列: 可用range()建立

程式區塊: 需縮排,可多行

for 迴圈變數 in range(起始值, 終止值, 間隔值):
    程式區塊

終止值, 間隔值 可省略

使用range()建立數列

範例

for i in range(1000):
    print('Hello')
    print('這是第幾輪 %d' % i) # 印出迴圈變數值

for迴圈回顧(2/4)

for迴圈開始

程式區塊

條件式

for迴圈結束

True

False

for n in range(5):
    print(n, end=",")
0,1,2,3,4,

印出

條件式?

n < 5

for迴圈​回顧(3/4)

for迴圈開始

顯示 i

i < n + 1

for迴圈結束

True

False

輸入正整數n

範例1 : 顯示正整數數列

  • 輸入正整數n後,依序印出1到n
n = int(input('輸入正整數:'))
for i in range(1, n+1):
    print(i, end=",")
輸入正整數:5
1,2,3,4,5,

執行結果

for迴圈回顧(4/4)

範例2 : 產生ASCII碼

  • 輸入起始值,終止值後,依序印出對應的ASCII字元
s=int(input('輸入起始值:'))
e=int(input('輸入終止值:'))

for i in range(s, e+1):    # 終止值也要列印, 所以e+1
    print('ascii碼: %d, 字元:%s' % (i,chr(i)))
輸入起始值:65
輸入終止值:90
ascii碼: 65, 字元:A
ascii碼: 66, 字元:B
... 省略 ...
ascii碼: 90, 字元:Z

執行結果

chr(i): 整數轉字元

二進位

16進位

國際標準: 鍵盤上所有字元(也含控制字元)

ASCII編碼(二進位編碼)

控制字元

十進位

16進位

while迴圈(1/7)

用於沒有固定次數的迴圈

while(條件式):
    程式區塊

基本語法

沒有迴圈變數

注意[條件式]是否會一直[成立]

程式區塊: 需縮排,可多行

條件式的括弧 可省略

範例

total = n = 0            
while(n < 10):       # 條件式: n < 10
    n += 1           # n 不會自動增加
    total += n       # 數值加總
print('加總:%d' % total)

無窮迴圈

while迴圈(2/7)

while迴圈開始

程式區塊

條件式

while迴圈結束

True

False

迴圈每輪都必須再輸入

才能改變條件式的結果

輸入值是否為'q'

# ch7_26.py
msg1 = '人機對話專欄,告訴我心事吧...'
msg2 = '輸入 q 可以結束對話'
msg = msg1 + '\n' + msg2 + '\n' + '= '
input_msg = ''                # 預設為空字串
while input_msg != 'q':
    input_msg = input(msg)
    print(input_msg)

條件式?

while迴圈(3/7)

# ch7_27.py
msg1 = '人機對話專欄,告訴我心事吧,我會重複你告訴我的心事!'
msg2 = '輸入 q 可以結束對話'
msg = msg1 + '\n' + msg2 + '\n' + '= '
input_msg = ''                  # 預設為空字串
while input_msg != 'q':
    input_msg = input(msg)
    if input_msg != 'q':        # 如果輸入不是q才輸出訊息
        print(input_msg)

改良ch7-26.py,'q'不會重複印出

# ch7_29.py
answer = 30                 # 正確數字
guess = 0                   # 設定所猜數字的初始值
while guess != answer:
    guess = int(input("請猜1-100間的數字 = "))
    if guess > answer:
        print("請猜小一點")
    elif guess < answer:
        print("請猜大一點")
    else:
        print("恭喜答對了")

猜數字遊戲

while迴圈​(4/7)

while迴圈開始

i += 1
total *= i

i < n

while迴圈結束

True

False

輸入正整數n

total = i = 1

範例 : 計算n階層n! = 1✕2✕...✕n

  • 輸入正整數n後,算出n!
n = int(input('輸入正整數:'))
total = i = 1
while(i<n):
    i += 1
    total *= i
print('%d階層 = %d' % (n, total))
輸入正整數:5
5階層 = 120

執行結果

while迴圈​(5/7)

範例 : 輸入m值,找出大於m值最小n! 

  • 例如m=1000, 因6!=720, 7!=5040,故最小n值為7
m = int(input('輸入正整數:'))
total = i = 1
while(total < m):
    i += 1
    total *= i
print('%d階層 = %d' % (i, total))
輸入正整數:6000
8階層 = 40320

執行結果

while迴圈​(6/7)

練習:輸入正整數n之後,印出介於1~n之間所有偶數

輸入正整數:6
2,4,6,

執行結果

輸入正整數:17
2,4,6,8,10,12,14,16,

執行結果

while迴圈​隨堂測驗(7/7)

題目:求大於1000的最小平方和

  • 求最小的n值,滿足1²+2²+...+n²>1000

1加到1平方=1
1加到2平方=5
1加到3平方=14
1加到4平方=30
1加到5平方=55
1加到6平方=91
1加到7平方=140
1加到8平方=204
1加到9平方=285
1加到10平方=385
1加到11平方=506
1加到12平方=650
1加到13平方=819

1加到14平方=1015
最小的n值是: 14

執行結果

巢狀迴圈巢狀for迴圈(1/5)

基本語法

內、外:各有自己的迴圈變數

內程式區塊: 再往內縮排

範例

# 5張牌可重複抽, 所有可能的組合
for card1 in range(1, 6):
    for card2 in range(1,6):
        print('%d %d' % (card1, card2))

迴圈範圍內又有迴圈,可以好幾層

for 外迴圈變數 in 數列1:
    for 內迴圈變數 in 數列2:
        內程式區塊

巢狀迴圈​巢狀for迴圈(2/5)

基本語法

範例

# 5張牌可重複抽, 所有可能的組合
for card1 in range(1, 6):
    print('第%d張牌' % card1, end=":")
    for card2 in range(1,6):
        print('%d' % card2, end=",")
    print('')    # 換行

內層迴圈屬於「外程式區塊」的一部分

for 外迴圈變數 in 數列1:
    程式碼-外程式區塊
    for 內迴圈變數 in 數列2:
        內程式區塊
    程式碼-外程式區塊

縮排決定屬於哪個程式區塊

第1張牌:1,2,3,4,5,
第2張牌:1,2,3,4,5,
第3張牌:1,2,3,4,5,
第4張牌:1,2,3,4,5,
第5張牌:1,2,3,4,5,

執行結果

巢狀迴圈巢狀for迴圈​​(3/5)

範例:99乘法表

# 九九乘法表
for i in range(1,10):
    for j in range(1,10):
        print('%d*%d = %2d' % (i, j, i*j))
# 九九乘法表
for i in range(1,10):
    for j in range(1,10):
        print('%d*%d=%2d\t' % (i, j, i*j), sep='', 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	

基本寫法

考量輸出格式

巢狀迴圈巢狀for迴圈​​(4/5)

範例

height = int(input('三角形的高:'))
for i in range(1, height+1):
    for j in range(1, i+1):
        print('#', end = '')
    print()    # 換行, 外層迴圈

三角形的高:5
#
##
###
####
#####

執行結果

範例:以#字號畫出直角三角形

外圈變數i 用於改變內圈回合數

巢狀迴圈巢狀while迴圈​​(5/5)

範例:巢狀while迴圈輸出99乘法表

# ch7_31.py
i = 1                   # 設定i初始值
while i <= 9:           # 當i大於9跳出外層迴圈
    j = 1               # 設定j初始值
    while j <= 9:       # 當j大於9跳出內層迴圈
        result = i * j
        print("%d*%d=%-3d" % (i, j, result), end=" ")
        j += 1          # 內層迴圈加1
    print()             # 換行輸出
    i += 1              # 外層迴圈加1

巢狀迴圈練習

三角形的高:5
#####
####
###
##
#

執行結果

練習:以#字號畫出直角三角形

提示: 迴圈變數改為「遞減」,#數量逐回合變少

迴圈特殊指令break(1/7)

基本語法

條件式若成立: 跳出迴圈

while迴圈也適用

break: 中途跳出迴圈(後續回合不再執行)

for 迴圈變數 in 數列1:
    程式碼1...
    if 條件式:
        break
    程式碼2...
迴圈後程式碼

for迴圈開始

程式區塊2

break

for迴圈結束

True

False

還有元素?

程式區塊1

True

False

break:不管有無元素,都跳出

# ch7_21.py
print("測試1")
for digit in range(1, 11):
    if digit == 5:
        break
    print(digit, end=', ')
print( )
print("測試2")
for digit in range(0, 11, 2):
    if digit == 5:
        break
    print(digit, end=', ')

迴圈特殊指令break(2/7)

基本語法

條件式2若成立: 跳出迴圈

範例

break: 中途跳出迴圈(後續回合不再執行)

while 條件式1:
    程式碼1...
    if 條件式2:
        break
    程式碼2...
迴圈後程式碼
# ch7_32.py
msg1 = '人機對話專欄,請告訴我妳喜歡吃的水果!'
msg2 = '輸入 q 可以結束對話'
msg = msg1 + '\n' + msg2 + '\n' + '= '
while True:                     # 這是while無限迴圈
    input_msg = input(msg)
    if input_msg == 'q':        # 輸入q可用break跳出迴圈
        break
    else:
        print("我也喜歡吃 %s " % input_msg.title( ))

迴圈特殊指令break(3/7)

a = int(input('輸入正整數a:'))
b = int(input('輸入正整數b:'))
if (a<=0 or b<=0):           # 輸入不是正整數, 結束程式
    print('請輸入2個正整數')
else:
    for i in range(1, a*b+1):
        if(i%a==0 and i%b==0):
            break
    print("%d和%d的最小公倍數是:%d" % (a, b, i) )

範例1:找尋最小公倍數

  • 輸入正整數a, b; 找出兩者的最小公倍數

迴圈特殊指令break(4/7)

num = int(input('輸入大於1的正整數:'))
prime = True   # 預設是質數
j = 2
while j<num:
    if(num%j==0):   # 找到任一個可整除的數
        print('%d可被%d整除' % (j, num))
        prime = False  # 非質數
        break
    j=j+1    # j往上遞增
if(prime):
    print('%d是質數' % num)
else:
    print('%d不是質數' % num)

範例2:找尋質數

  • 輸入正整數num, 確認num是不是質數

迴圈特殊指令break(5/7)

while True:
    username = input('帳號:')
    pwd = input('密碼')
    if username == pwd:
        break
    else:
        print('帳密錯誤,請重新輸入')
print('帳號密碼正確')

範例3:登入系統(範例5-4-1)

  • 輸入帳號與密碼:帳號密碼一致,輸出「帳號與密碼正確」,否則輸出「帳密錯誤,請重新輸入」。

注意: 此為無窮迴圈寫法

迴圈特殊指令break(6/7)

for i in range(2, 1001):
    prime = True
    j=2
    while j<i:
        if i%j==0:
            prime = False
            break
        j += 1    # j=j+1
    if prime:
        print('%d是質數' % i)

範例4:找尋2~1000所有質數

  • 運用巢狀迴圈

迴圈特殊指令break隨堂測驗(7/7)

題目:當骰子擲出點數6時,程式停止,否則繼續執行

  • 印出第幾輪,擲出幾點

迴圈特殊指令continue(1/3)

基本語法

條件式若成立: 跳出迴圈

while迴圈也適用

continue: 跳過該回合迴圈(後續回合繼續執行)

for 迴圈變數 in 數列1:
    程式碼1...
    if 條件式:
        continue
    程式碼2...
迴圈後程式碼
for i in range(1,11):
    if i%2==0:   # 跳過偶數
        continue
    print(i, end=",")

for迴圈開始

區塊3

continue

for迴圈結束

True

False

還有元素?

程式區塊1

True

False

continue: 部份元素跳過 或 特殊處理

區塊2

迴圈特殊指令continue(2/3)

練習:列出大於30分的得分場次

有6場得分超過30分

執行結果

# ch7_23.py
scores = [33, 22, 41, 25, 39, 43, 27, 38, 40]
games = 0
for score in scores:
    if score < 30:                  # 小於30則不往下執行
        continue
    games += 1                      # 場次加1              
print("有%d場得分超過30分" % games)

迴圈特殊指令continue(3/3)

while迴圈範例:列出1~10之間的偶數

2
4
6
8
10

執行結果

# ch7_34.py
index = 0
while index <= 10:
    index += 1
    if ( index % 2 != 0 ):  # 測試是否奇數
        continue            # 不往下執行
    print(index)            # 輸出偶數

迴圈特殊指令pass

pass指令:什麼都不做

# ch7_37.py
schools = ['明志科大', '台灣科大', '台北科大']
for school in schools:
    pass

範例:程式尚未完成,先以pass取代迴圈區塊內容

迴圈其他補充串列.remove()用於測試條件(1/2)

while迴圈範例

刪除前的fruits ['apple', 'orange', 'apple', 'banana', 'apple']
刪除後的fruits ['orange', 'banana']

執行結果

# ch7_35.py
fruits = ['apple', 'orange', 'apple', 'banana', 'apple']
fruit = 'apple'
print("刪除前的fruits", fruits)
while fruit in fruits:      # 只要串列內有apple迴圈就繼續
    fruits.remove(fruit)  # 務必要刪除,否則會形成無窮迴圈
print("刪除後的fruits", fruits)

迴圈其他補充串列.pop()用於測試條件(2/2)

範例:根據購買金額為顧客分類

VIP 買家資料 [['David', 2110], ['Durant', 2050], ['James', 1030]]
Gold買家資料 [['Jordan', 990], ['Curry', 893]]

執行結果

# ch7_36.py
buyers = [['James', 1030],              # 建立買家購買紀錄
           ['Curry', 893],
           ['Durant', 2050],
           ['Jordan', 990],
           ['David', 2110]]
goldbuyers = []                         # Gold買家串列
vipbuyers =[]                           # VIP買家串列
while buyers:                           # 執行買家分類迴圈分類完成迴圈才會結束
    index_buyer = buyers.pop()
    if index_buyer[1] >= 1000:          # 用1000圓執行買家分類條件
        vipbuyers.append(index_buyer)   # 加入VIP買家串列
    else:
        goldbuyers.append(index_buyer)  # 加入Gold買家串列
print("VIP 買家資料", vipbuyers)
print("Gold買家資料", goldbuyers)

enumerate物件

enumerate(串列) : 為串列產生「計數值」

(0, 'coffee')
(1, 'tea')
(2, 'wine')
0 coffee
1 tea
2 wine
****************
(10, 'coffee')
(11, 'tea')
(12, 'wine')
10 coffee
11 tea
12 wine

執行結果

# ch7_38.py
drinks = ["coffee", "tea", "wine"]
# 解析enumerate物件
for drink in enumerate(drinks):             # 數值初始是0
    print(drink)
for count, drink in enumerate(drinks):
    print(count, drink)
print("****************")   
# 解析enumerate物件
for drink in enumerate(drinks, 10):         # 數值初始是10
    print(drink)
for count, drink in enumerate(drinks, 10):
    print(count, drink)