###### tags: `Python`
# While 與 For 迴圈
**<a href="https://hackmd.io/@Mes/python_note" class="redlink">點此回到 Python筆記 目錄</a>**
#
# 前言
在寫程式的時候,我們一定會遇到需要重複執行某條或某些指令的時候。這時候我們就需要利用循環結構。 Python中要建立循環結構有兩種方法,一種是 For 迴圈,另一種是 While 迴圈。
# For 迴圈
如果我們事先知道某件事情要做幾次,那我們可以使用 For 迴圈,舉個例子,我們現在要把 1~100 的數字全部加起來,因此「加法」這個動作就需要做100次:
```python=
sum = 0
for number in range(1,101,1):
sum += number
print(sum)
print(number)
```
我們可以利用上例來知道 For 迴圈的語法,首先會有一個關鍵字 `for` , `for` 的後方會接一個變數,我這邊取叫 number ,變數的後方要有關鍵字 `in` , `in` 的後方要接一個容器(後面會講什麼是容器),或者是一個範圍,上例中接的是範圍,會有關鍵字 `range()`, `range()` 括號內會有三個數字,它們代表的意義由左至右分別為 「前方的變數要從多少開始」、「前方的變數如果將等於多少時要終止程式」、「前方的變數每執行一次迴圈後要加多少」,以上例來講,我們要從一加到一百,所以數字要從一開始,到一百的時候就結束(所以要填101),每次數字會加一,因此括號內填的是(1,101,1)。
For 迴圈後方記得也要有冒號,而冒號後會接一塊代碼塊,代碼塊的內容代表每執行一次迴圈要做什麼事情,以上例來說就是 `sum += number`。
另外 `range()` 的前後兩項有預設值,分別是 0 和 1,也就是說,如果我們「每次結束迴圈,變數都加一」,那我們第三格就可以省略不寫,同理,如果變數是從 0 開始算起,那我們也可以省略不寫。 但要注意一下順序,如果第三項並不是預設值,那第一項就不能省略。
我們再來看一個例子,假設我們要把 1~100 的偶數都加起來,那我們可以這樣做:
```python=
sum = 0
for number in range(0,101,2):
sum += number
print(sum)
print(number)
```
當然我們也可以利用上一章學到的 If判斷句 來寫:
```python=
sum = 0
for number in range(1,101):
if(number%2 == 0):
sum += number
print(sum)
print(number)
```
那上下兩種寫法哪種比較好呢? 答案是上面那種,原因是因為下面的迴圈執行了 100 次,但上面的只有 50 次。
# While 迴圈
那如果我們不曉得需要循環幾次,我們可以使用 While迴圈,假設我們要寫一個猜數字的遊戲,電腦隨機出一個數字,而我們需要輸入數字,並且要根據我們輸入的值提供提示(太大了,太小了),如果玩家猜中了數字,電腦會告訴他猜中了,還有他猜了幾次:
```python=
import random
answer = random.randint ( 1 ,100 )
counter = 0
while (True) :
counter += 1
number = int ( input ( '請輸入: ' ))
if number < answer :
print ( '大一點' )
elif number > answer :
print ( '小一點')
else :
print ( '恭喜你猜對了!' )
break
print ( "你總共猜了",counter,"次" )
```
在這邊我們引入了函式庫 `random` ,這個函式庫包含了許多用來模擬隨機的函式,因為我們現在電腦要隨機出一個數字,所以會用到這個函式庫。 在第三行我們可以看到有個函式 `random.randint(1,100)` 可以看見括號內傳了兩個數字進去,前者代表我們最小值,後者代表了最大值,這個函式的功能就是隨機出一個位於最小值與最大值內的數字,因此這行程式碼就會隨機產生一個 1~100 的數字,然後賦值給 `answer` 。
下方就是這小節的重點, While迴圈。 它會有一個關鍵字 `while` ,後面會接一個布林值或者一個可以回傳布琳值的判斷式,括號是可加可不加的,如果回傳 `true` 那程式便會進到迴圈,否則會跳過這個迴圈。
而上例迴圈中的最後還出現了一個新東西叫做 `break` ,這個迴圈的另一個關鍵字,它也可以用在 `for迴圈` ,它的用途跳出迴圈,當程式讀到 `break` 時便會從迴圈出來,繼續讀迴圈後的程式
# 巢狀迴圈
和 If 一樣, While 與 For 迴圈也可以有巢狀迴圈,也就是說可以在迴圈裡面再寫一個迴圈,例如我們要寫一個九九乘法表:
```python=
for i in range(1,10):
for j in range(1,10):
print(f"{i*j:>4}",end="")
print()
```
註:上方的 end 代表這行印完後要再印什麼,因為 `python` 預設的 `print()` 包含了自動換行,為了讓它不要換行,我們需要在後方加上 `end=""` ,代表這行印完後什麼都不要做,然後再手動換行。
另外,不要忘記,無論是 `For` 還是 `While`,他們都是迴圈,因此是可以互通的,也就是說,用 `For`迴圈做得到的事,用 `While` 一定也可以做到,但差別就在好不好寫而已。
# 練習
### 練習1:蓋出輸入層數的星星塔
> 輸入一個層數,並且蓋出相對層數的星星塔, ex:
```python=
輸入:5
輸出:
*
***
*****
*******
*********
```
參考解答:
```pyhton=
n = int(input("> "))
for i in range(n):
print( " "*(n-1-i) + "*"*(1+2*i) )
```
### 練習2:印出 1~100內 的質數
> 提示:質數的特性就是它只能被自己和1整除
參考解答:
```python=
for number in range(1,101):
is_prime = False
for i in range(1,number):
if(number%i == 0 and i != 1):
break
if(i == number-1):
is_prime = True
if(is_prime):
print(number," 是質數")
```
### 練習3:輸入數字,判斷是不是質數,輸入 -1 時才結束程式,並告訴使用者共輸入了幾次
> 提示:結合 While 與 For 迴圈 來做
```python=
counter = 0
while (True):
n = int(input("> "))
counter += 1
is_prime = False
if(n == -1):
print("您總共輸入了", counter, "次")
print("謝謝使用!")
break
for i in range(1,n):
if(n%i == 0 and i != 1):
print(n,"不是質數")
break
elif(i == n-1):
is_prime = True
if(is_prime):
print(n,"是質數")
```
<style>
.green {
color:#29E5A9;
}
.brown {
color:#990000;
}
.pink {
color:#C18387;
}
.red {
color:#E71B18 ;
}
.blue {
color:#0b5394;
}
.purple {
color:#AC9FDD;
}
@-webkit-keyframes A
{
0% { color:#C10066;}
10% { color: #CC0000;}
20% { color: #E63F00; }
30% { color:#EE7700; }
40% { color: #DDAA00; }
50% { color:#EEEE00;}
60% { color: #99DD00;}
70% { color:#66DD00;}
80% { color: #00DDDD;}
90% { color: #0044BB;}
100% { color: #A500CC;}
}
#animation_title{
animation: A 3s ease 0s infinite alternate;
-webkit-animation: A 3s ease 0s infinite alternate;
}
</style>
<style>
a.redlink {
color:#DF2F6A;
}
a.redlink:link {
color:#DF2F6A;
text-decoration:none;
}
a.redlink:visiteid {
color:#DF2F6A;
text-decoration:none;
}
a.redlink:hover {
color:#19CABC;
text-decoration:none;
}
a.redlink:active {
color:#000000;
text-decoration:underline;
background:#FFFFFF;
}
</style>
<style type="text/css">
h1 {
font-size:;
color:#0b5394;
}
h2 {
font-size:;
color:#0b5394;
}
p {
font-size:;
color:;
}
h3 {
font-size: ;
color:#990000;
}
h4 {
font-size:;
color:#990000;
}
</style>