I. 迴圈的用途
想想看,日常生活中有那些不斷重複做的事情呢?
在Python程式語言當中,迴圈有兩種表示方法:while
和 for
II. while
迴圈
A. while
迴圈的基本架構
Copy count = 0 # step1. while迴圈前需要一個計圈變數用於計算迴圈執行了幾圈
while count < 10 : # step2. while後方須接上判斷條件,判斷正確即可進入迴圈
print (count) # step3. 須要重複做的事
count += 1 # step4. 迴圈將結束前,將計圈變數做點變化(否則會成為無窮迴圈)
執行步驟:step1 → step2 → step3 → step4 → (step2 → step3 → step4)×n次
注意! 縮排 也別忘了唷!
注意! step1 (計圈變數) 通常有各式型態,接下來我們就會陸續見到
while
迴圈撰寫時可能會遇到的錯誤情況
Copy # 沒有於迴圈前有個計圈變數的情況
while count < 10 : # NameError: name 'i' is not defined
print (count)
count += 1
Copy # 計圈變數放置於迴圈內的情況
while count < 10 : # NameError: name 'i' is not defined
count = 0
print (count)
count += 1
Copy # 沒有在迴圈將結束前,將計圈變數做變化
count = 0
while count < 10 : # 永遠滿足判斷條件(無法跳出迴圈)
print (count)
Copy # 判斷條件永遠錯誤,無法進入迴圈
count = 11
while count < 10 : # 永遠無法滿足判斷條件(無法進入迴圈)
print (count)
count += 1
【下方為正確撰寫方式】
Copy # 嘗試執行下方的程式碼並觀察結果
count = 0
while 0 :
print (count)
count += 1
Copy # 嘗試執行下方的程式碼並觀察結果
count = 0
while 2 and count < 15 or False :
print (count)
count += 1
Copy # 嘗試執行下方的程式碼並觀察結果
count = 8
while count < 16 :
print (count)
count += 2
【例題1】
小蚯很喜歡~
符號
請寫一個程式能夠讀入一個整數
再印出該整數個~
符號
Copy count = int ( input ( "請輸入次數:" )) # 先利用一個變數儲存所輸入的整數
i = 0 # 計圈用變數
while i < count : # 圈數還沒達到目標時
print ( '~' , end = '' )
i += 1 # 改變計圈用變數的值
【例題2】
家裡最近領養了一頭神牛超會算數學,只要給他一個數字,他就能加總出從1到該數字的總和
輸入說明
讓使用者能夠輸入一個正整數
輸出說明
若輸入值為10,則輸出55
Copy n = int ( input ( "請輸入次數:" ))
i = 1 # 計圈用變數
sum = 0 # 創造一個變數用來儲存每一輪迴圈計算出的值
while i <= n : # 圈數還沒達到n時繼續
sum += i # 將每輪計算出的結果儲存在sum變數中
i += 1 # 改變計圈用變數的值
print ( sum )
B. 多變的迴圈
有時候,我們不必使用計圈變數來控制迴圈次數,而是直接改變while
的判斷條件來讓迴圈停止
通常這種寫法用於不確定迴圈需要進行幾圈的情況下
【例題1】
小奇有一個很特殊的個性,就是非常討厭偶數,只要看到偶數,就會反覆把它除以二,直到這個數字變成奇數為止。若現在給一個正整數,請問這個數字經過小奇的處理之後,會變成多少呢?
Copy i = int ( input ( '請輸入一個正整數:' ))
while i % 2 == 0 : # 如果 i 為偶數,就進入迴圈
i /= 2 # 每一輪將i值除以2
print (i) # 印出最終已成為奇數的 i 值
【例題2】
嘗試輸入各種血型來觀看今年的運勢(輸入00
可結束此程式)
Copy i = '' # 先將i初始為一個非00的值(為了能進入迴圈)
while i != '00' : # 當輸入值為00時結束迴圈
i = input ( '請輸入一個血型:' )
if i == 'A' or i == 'a' :
print ( '今年桃花運很旺' )
elif i == 'B' or i == 'b' :
print ( '今年金錢運很旺' )
elif i == 'AB' or i == 'ab' :
print ( '今年工作運很旺' )
elif i == 'O' or i == 'o' :
print ( '今年驚喜運很旺' )
print ( '程式已結束' ) # 印出 程式已結束 字樣
偶爾,我們會期待迴圈能永遠執行下去,永不停止
【例題3】
請撰寫一個能讓使用者輸入成績進而判斷:及格、可補考、死當
Copy # 結合了迴圈,就能夠實現重複不斷輸入的效果
while 1 :
num = int ( input ( "請輸入一個分數:" ))
if num >= 60 :
print ( "及格" )
elif 40 <= num < 60 :
print ( "可補考" )
else :
print ( "死當" )
【例題4】
請撰寫一個能夠不斷印出小印地安人的程式
Copy # 結合了迴圈,就能夠實現重複不斷輸入的效果
i = 1 # 計圈變數一開始設為1
while True :
print (i, 'little Indian' )
i += 1 # 每輪結束前將計圈變數做變化
C. 讓迴圈中途停止或跳過迴圈中的某圈
break
從上方【例題2】中我們可以發現,需要讓迴圈在i
值為 '00'
時結束,須於 while
外頭先宣告 i
變數,讓程式碼看起來似乎有那麼一點不完美,這時,若我們能使用break
即能夠避免這樣的情形
break
:當電腦執行到break
時會立即 終止該層 迴圈
【例題】
上方【例題2】的改寫
Copy # 嘗試執行下方的程式碼並觀察結果
while True :
i = input ( '請輸入一個血型:' )
if i == '00' :
break # 當輸入值為00時結束迴圈
elif i == 'A' or i == 'a' :
print ( '今年桃花運很旺' )
elif i == 'B' or i == 'b' :
print ( '今年金錢運很旺' )
elif i == 'AB' or i == 'ab' :
print ( '今年工作運很旺' )
elif i == 'O' or i == 'o' :
print ( '今年驚喜運很旺' )
print ( '程式已結束' ) # 印出 程式已結束 字樣
continue
偶爾,我們會希望當某個條件成立時,不做某件事而直接進行下一輪迴圈,這時,我們就可以使用continue
continue
:當電腦執行到continue
時會立即 跳過該輪迴圈,直接進行下一輪
【例題】
請製作一個倒數器,讓使用者輸入一個正整數後,即從該正整數開始不斷 -1 直至數到 1 為止,但中間過程若數到 5 的倍數,請跳過
Copy i = int ( input ( '請輸入一個正整數:' ))
while i :
if i % 5 == 0 :
i -= 1 # 這裡也必須要 -1 否則會形成無窮迴圈(為什麼?)
continue # 立刻進行下一輪迴圈
else :
print (i, end = ' ' )
i -= 1
想想看,上方的 i -= 1
與 continue
可以互換位置嗎?
由於continue
的特性,我們其實能省略else
,因此可將上方程式碼改寫如下:
Copy i = int ( input ( '請輸入一個正整數:' ))
while i :
if i % 5 == 0 :
i -= 1
continue
print (i, end = ' ' )
i -= 1
III. for
迴圈
for
迴圈跟while
迴圈用法相似,最主要區別是在while
迴圈通常會用於不知道要執行多少圈的情況下,而for
迴圈通常用在已經知道要執行多少次的情況
例如:
1. 印出100個Hello
2. 算出某個數字的某次方
3. 算出某個數字的階乘
注意! 若不希望計圈變數在每一圈的變化值都相同,使用while
會優於用for
A. for
迴圈的基本架構
for
迴圈中也必須有一個計圈變數用來計算目前執行了幾圈,只是計圈變數放在for
迴圈結構中。 【每輪迴圈完畢後,計算圈數的變數會產生變動】
以下三種為for
迴圈常見的架構
Copy # range內只放一個數的情況
for i in range ( 6 ): # i會從0-5(不包含6),每輪i都會+1
print (i)
Copy # range內放兩個數的情況
for c in range ( 2 , 6 ): # c會從2-5(不包含6),每輪c都會+1
print (c)
for c in range ( - 6 , 2 ): # c會從-6~1(不包含2),每輪c都會+1
print (c)
Copy # range內放三個數的情況
for x in range ( 21 , 6 , - 3 ): # x會從21-6(不包含6),每輪x都會-3
print (x)
B. for
與 while
間的轉換
兩者功能相同,也都需要一個計圈變數來記錄總共跑了幾圈。(唯while
較簡便使用於無窮迴圈的情況下)
【例題】
Copy for i in range ( 6 ):
print (i)
# 可改寫為:
i = 0
while i < 6 :
print (i)
i += 1
Copy for c in range ( 2 , 6 ):
print (c)
# 可改寫為:
c = 2
while c < 6 :
print (c)
c += 1
Copy for x in range ( 21 , 6 , - 3 ):
print (x)
# 可改寫為:
x = 21
while x > 6 :
print (x)
x -= 3
C. for
迴圈的計圈變數
for
迴圈中的計圈變數i
沒辦法於range
範圍中做更動,舉個範例如下
Copy for i in range ( 2 , 5 ):
i = 1 # 將計圈變數改為1
print (i, end = ' ' ) # 印出計圈變數
# 執行結果為:1 1 1
即使想將過程中的i
改為1,但在range
中實際上它仍是2 3 4 ,因為在執行range
時,它就已經將i
值存在一個陣列中,無法更動
補充:迴圈搭配 else
python
的迴圈有個很特殊的用法,即是能夠搭配else
使用,若迴圈沒有在中途結束執行,就會執行else
,舉個範例如下
Copy for i in range ( 3 ):
print ( 3 , end = '' )
else :
print ( "前面迴圈沒有中斷" )
# 執行結果為:&&&前面迴圈沒有中斷
Copy for i in range ( 3 ):
print ( 3 , end = '' )
if i == 2 :
break
else :
print ( "前面迴圈沒有中斷" )
# 執行結果為:&&&
IV. 巢狀迴圈
A. 巢狀迴圈的意義
巢狀迴圈顧名思義就是迴圈中還有迴圈的概念囉~~
B. 巢狀迴圈的範例
【例題1】
據說變態的人都喜歡打A
設計一個能讓使用者輸入列 和行 的程式
例如:列為3,行為5時,輸出:
AAAAA
AAAAA
AAAAA
Copy row , col = map ( int , input ( "請輸入列與行:" ). split ())
# 跑row圈(印出row個橫列)
for i in range ( 0 , row):
# 跑col圈(在第i圈印出col個A)
for j in range ( 0 , col):
print ( "A" , end = "" )
print ()
用while
改寫
Copy row , col = map ( int , input ( "請輸入列與行:" ). split ())
# 跑row圈(印出row個橫列)
i = 0
while i < row :
# 跑col圈(在第i圈印出col個A)
j = 0 # 思考看看,如果此行與上一行程式碼位置互換結果會如何?
while j < col :
print ( 'A' , end = '' )
j += 1
print ()
i += 1 # 想想看,這行程式碼位什麼要往前移動
【例題2】
輸入n,輸出n行星號,第一行有一個
每往下一行,就多一個星號
例如:n為4時,輸出如下
*
**
***
****
Copy n = int ( input ( "請輸入一個正整數:" ))
# 跑n圈(印出n個橫列)
for i in range ( 0 , n):
# 每一輪j值的上限隨i變化而變化(即:在第i圈印出i個*)
for j in range ( 0 , i + 1 ):
print ( "*" , end = "" )
print ()
思考看看,第二個for
迴圈為何上限寫i+1
而非i
你也可以這樣改寫
Copy n = int ( input ( "請輸入一個正整數:" ))
# 跑n圈(印出n個橫列)
for i in range ( 1 , n + 1 ):
# 每一輪j值的上限隨i變化而變化(即:在第i圈印出i個*)
for j in range ( 0 , i):
print ( "*" , end = "" )
print ()
用while
改寫
Copy n = int ( input ( "請輸入一個正整數:" ))
# 跑n圈(印出n個橫列)
i = 1
while i < n + 1 :
# 每一輪j值的上限隨i變化而變化(即:在第i圈印出i個*)
j = 0
while j < i :
print ( '*' , end = '' )
j += 1
print ()
i += 1
C. 巢狀迴圈中的 continue
與 break
break
與continue
都僅作用於本身所存在的該層迴圈而已
Copy for i in range ( 5 ):
for j in range ( 5 ):
if j == 3 :
continue
elif j == 4 :
break
print (j, end = ' ' )
print ()
上方程式碼執行後的結果如下:
Copy 0 1 2
0 1 2
0 1 2
0 1 2
0 1 2
III. 學習單