<style>
.small {
  font-size: 32px;
}
.verysmall {
  font-size: 28px;
}
.example {
  text-align: left;
  border: solid;
}
</style>
# For 迴圈
----
{%gist HowardHsuuu/de4fd7ec29e460d40bc8577034bb7070 %} 
---
## Why For Loop?
### 不是已經有while了嗎?
----
#### while是有明確結束條件的迴圈
#### 那麼想一想:
如果我想執行程式10000次看看結果呢?
如果我想要針對某個集合的每個元素進行操作呢?
----
## While vs For
* While
    * 有明確終止條件
    * 不確定執行次數
* For
    * 確定執行次數
    * 可用於遍歷可迭代物件
---
# For 迴圈
## 語法初見
----
## 先來小試身手!
```python=1
for i in range(5):
    print(i, end=' ')
    
#output: 0 1 2 3 4 
```
```python=1
for i in [0, 1, 2, 3, 4]:
    print(i, end=' ')
    
#output: 0 1 2 3 4 
```
可以想像變數 i 像游標
依次選擇下一個整數
---
# How?...
<br>
### 來點名詞解釋吧!
----
## 迭代&可迭代物件
<br>
#### 根據Google:
電腦科學中,迭代是程式中對一組指令的重複,也可用來描述一種特定形式的具有可變狀態的重複。
<br>
#### 那可迭代物件呢?
就是可以被迭代的物件(?
----
## 還是不懂?
#### 沒事,剛剛我也沒聽懂
----
### 可迭代物件(iterable)簡單來說...
* 能被分成一個一個元素的物件
* 能一個一個回傳本身元素的物件
→ 也就是可以一個一個輪流取出其中元素的物件
<br>
iterable 的例子:list, string, dictionary...
<br>
----
流程圖(flow chart)
<!-- .slide: data-background="#ffffff" -->
```flow
st=>start: Loop start
e=>end: For end
op=>operation: variable = first element
op1=>operation: do something
op2=>operation: variable = next element
cond=>condition: next?
st->op->op1->cond(yes)->op2->op1
cond(no)->e
```
在for迴圈中,不停依序將variable更新為下個元素並進行處理的動作就是迭代。
---
# For 迴圈
## 完整語法
----
# For 迴圈
```python = 1
for [variable] in [iterable]: 
[縮排] do something 
[縮排] do something 
[縮排] do something 
```
ex:
```python = 1
for i in [1, 2 ,3]: 
    print(i, end = ' ')
# 1 2 3
```
```python = 1
string = "sprout"
for i in string: 
    print(i, end = ' ')
# s p r o u t
```
----
# range( )
range( )可以建立一個包含整數的iterable
* <span class="small"> `range(start, stop, step)`</span>
* <span class="small">由start至stop(不含),每次遞增step</span>
* <span class="small">start預設是0,step預設是1</span>
```python=1
for i in range(5, 15, 5):
    print(i, end = ' ')
# 5 10     注意區間是[start, stop),stop是不包含在內的
for i in range(5, 15):
    print(i, end = ' ')
# 5 6 7 8 9 10 11 12 13 14
for i in range(5):
    print(i, end = ' ')
# 0 1 2 3 4
```
----
## 小練習_1
輸出1到100(不含)中符合「除以7餘5」條件的整數
Output: 5 12 19 26 33 40 47 54 61 68 75 82 89 96 
----
### solution1
```python=1
for i in range(1,100):
    if (i%7)==5:
        print(i,end=" ")
```
### solution2
```python=1
for i in range(5,100,7):
    print(i,end=" ")
```
----
## 小練習_2
[neoj 3088](https://neoj.sprout.tw/problem/3088/)
[neoj 3032](https://neoj.sprout.tw/problem/3032/)
3032請注意Hint(還看不懂沒關係)
把record當成一個iterable使用即可
ex:輸入 -1 2 -3
record = [-1, 2, -3]
---
# 巢狀迴圈
## Nested For
----
## Nested For
```python=1
for [variable1] in [iterable]:
[縮排]for [variable2] in [iterable]:
[縮排][縮排] do something
[縮排][縮排] do something
[縮排][縮排] do something
```
如果外層執行n次,內層m次,則總共會執行m*n次
```python=1
for i in range(3):
    for j in range(2):
        print(i,j)
'''
0 0
0 1
1 0
1 1
2 0
2 1
'''
```
----
# break & continue
### 和在while時的作用一樣
* break: 中斷迴圈,跳出至迴圈外
* continue:  跳過此次迴圈剩下的指令,variable更新並開始下次迴圈執行
----
## 小練習_3
輸入x跟y
輸出一個長x寬y,以“*”組成的長方形
ex: input (3,4)
output:
```
****
****
****
```
----
## solution
```python=1
x = input()
y = input()
for i in range(int(x)):
  for j in range(int(y)):
      print("*",end="")
  print()
```
----
## 小練習_4
[neoj 3089](https://neoj.sprout.tw/problem/3089/)
[neoj 3020](https://neoj.sprout.tw/problem/3020/)
這次請用for迴圈寫喔~
----
## 酷東西
```python=1
for i in range(3):
  if i == 2:
    print("hi")
    break
else: 
  print("hello")
```
猜猜看會輸出什麼? 
試試看把 break 拿掉呢?
把 if 的條件改成不會成立的呢?
---
## 回家作業
[neoj 3031](https://neoj.sprout.tw/problem/3031/)
[neoj 3034](https://neoj.sprout.tw/problem/3034/)
###### tags: `sprout`
             
            {"metaMigratedAt":"2023-06-17T22:18:43.366Z","metaMigratedFrom":"YAML","title":"For 迴圈","breaks":true,"contributors":"[{\"id\":\"7e503499-7e66-45cf-bd30-4493f761a30b\",\"add\":4946,\"del\":1232}]"}