---
# System prepended metadata

title: 0.考前筆記

---

# 0.考前筆記

(考前猜題)[https://koding.school/courses/programming/mta-python-cert/lessons/5/1]
考前猜題放在課程平台上最後一個章節(如果上次忘記使用邀請碼加入課程請點選筆記裡面有註冊步驟)

**注意！！注意！！注意！！
課本最後的模擬測驗，有 75 % 機率會出現在正式考題！**

哈囉各位同學！我們已經結束四天的課程，

這裏老師準備一份筆記幫助大家複習，筆記內容這兩天會新增一些範例以及內容，使其更加完整。
請大家一定要確確實實搞懂每一個範例、每一行程式、每一個步驟，並試著去執行看看。
相信大家好好看完後，一定對考試能有把握。

下週考試預祝各位能順利拿到證照！


每個章節的筆記會搭配課本重要筆記，務必要好好閱讀，另外
一定要搭配課本進行複習，記住課本中有出線表格就一定會考！
串列出題的頻率很高！

# 1.資料型態
## 1.為什麼資料要分型態？
因為程式要能分別資料的型態，才能給予對應的操作
例如使用「加號」電腦會根據兩邊的資料，去做出不同的運作和結果

[範例1-1](https://repl.it/@owpika/11)
```python=
print(10 + 10) #20 數學計算
print('你' + '好') #你好 字串相接

print(10 * 10) #100 數學計算
print('Hi' * 10) #HiHiHiHiHiHiHiHiHiHi 字串複製
```

## 2.資料分幾種型態？怎麼區分？
主要基本的資料型態可以分成 4 種
* 整數 int
    * 阿拉伯數字組成，沒有小數點就是整數
    * 例如：1、2、10、100、-10、-123、0
* 浮點數 float
    * 阿拉伯數字組成，帶有小數點就是浮點數
    * 例如：0.1、0.25、-0.01、1.0、2.0、-10.0
    * 注意 1.0 也是浮點數，既使小數點後面是 0。浮點數的資料程式會給予更多的記憶體空間，因為電腦預期你是要做小數運算，所以你寫 1.0 跟 1 電腦在執行時就會判定成不同類型的資料
* 字串 str
    * 一定是一對雙引號或單引號包住
    * 例如："你好"、'hello'、""
    * 三個 """ 包住的是多行字串
    * 例如："""我是多行字串可以折行"""
* 布林值 bool
    * 只有兩種值
    * 例如：True、False
    * 注意開頭一定是大寫
    * 比較運算結果是用布林值表示

## 3.使用 type 檢查資料型態
[範例1-2](https://repl.it/@owpika/12)
```python=
print(type(1)) #整數int
print(type(0)) #整數int
print(type(-1)) #整數int

print(type(0.1)) #浮點數float
print(type(-1.23)) #浮點數float
print(type(1.0)) #浮點數float

print(type("你好！")) #字串str
print(type('hi'))  #字串str
print(type("""
這是多行字串，
用三個「"」包住的字串，
就可以一直寫一直換行ㄛ
"""))  #字串str

print(type(True)) #布林值 bool
print(type(False)) #布林值 bool
print(type(20 > 10)) #布林值 bool
print(type(20 == 10)) #布林值 bool
```

# 2.變數
## 1.變數是什麼？
變數就像是一個盒子，可以用來儲存資料！
這個盒子要貼上一個標籤，這樣當我們有很多個盒子的時候，就可以透過標籤去知道這裡面裝了什麼

## 2.變數的命名限制
* 只能大小寫字母、數字、底線、中文字
* 變數名稱第一個字不能是數字
* 大小寫視為不同變數，例如 Apple 跟 apple 就是不一樣的變數名稱
* 不能跟程式語法一樣(課本 2-4)

## 3.等號賦值
程式中的等號跟數學的等號是完全不一樣的東西
等號有「賦值」的意思，程式中的等號會把等號右邊的內容，存進左邊的對象（通常是變數）
例如：a = 10 就是把資料數字 10 存進變數 a 裡面

執行以下範例看看最後會印出什麼？

[範例2-1](https://repl.it/@owpika/21)
```python=
a = 10
b = 10 
a = a + b
b = a + b

print(a, b)
```

# 3.運算符號
## 1.四則運算
* 先乘除、後加減、小括號先做
* 數字相互計算只要有任何一個是浮點數結果就一定是福點數
* 數字相除結果一定是浮點數
* 加號可以做數學相加、字串串接、陣列串接
* 乘號可以做數學相乘、字串複製串接、陣列複製串接

[範例3-1](https://repl.it/@owpika/31)
```python=
a = 10
b = 20
c = 30

z = ((a + b) / c + (b - a) * c) % 10

print(z)
```

## 2.「+」加號
不同的資料型態相加會有不同的作用
* 數字 + 數字，是數學運算
* 字串 + 字串，是字串串接
* 串列 + 串列，是串列串接

[範例3-2](https://repl.it/@owpika/32)
```python=
print(10 + 20 + 30) # 60
print('你好' + '大中天' + '!') # 你好大中天！
print(['a', 'b', 'c'] + ['d', 'e']) # ['a', 'b', 'c', 'd', 'e']
```

## 3.「\*」乘號
不同的資料型態相乘會有不同的作用
* 數字 * 數字，是數學運算
* 字串 * 數字，是字串複製並串接
* 串列 * 數字，是串列複製並串接

[範例3-3](https://repl.it/@owpika/33)
```python=
print(5 * 10) # 50
print('Hi' * 10) # HiHiHiHiHiHiHiHiHiHi
print(['a', 'b', 'c'] * 3) # ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
```


## 4.浮點數
[範例3-4](https://repl.it/@owpika/34)
注意！
* 只要做除法結果一定是浮點數
* 計算的兩邊只要任何一個是浮點數，結果一定是浮點數
```python=
print(10 + 10) # 20
print(10 - 10) # 0
print(10 * 10) # 100
print(10 / 10) # 1.0 ---> 浮點數

print(10 + 5.0) # 15.0
print(10 - 5.0) # 5.0
print(10.0 * 5) # 50.0
print(10.0 / 5) # 2.0
```

## 5.「**」次方
[範例3-5](https://repl.it/@owpika/35)
```python=
a = 2
b = 3
c = 5

print(a ** b) # 8
print(a ** c) # 32

print(b ** a) # 9
print(b ** c) # 243

print(c ** a) # 25
print(c ** b) # 125
```

## 6.「//」整除法
整除法和使用 int 方式類似，都是將結果都是去除小數點
但是如果對象資料型態是浮點數結果還是浮點數

[範例3-6](https://repl.it/@owpika/36)
```python=
a = 10
b = 3

print(int(a / b)) # int 去除小數點
print(a // b) # 直接用 // 整除法
```

## 7.「%」取於數
[範例3-7](https://repl.it/@owpika/37)
```python=
print(100 % 3) # 33 餘 1
print(100 % 7) # 14 餘 2
print(100 % 10) # 10 餘 0
print(100 % 30) # 3 餘 10
print(100 % 70) # 1 餘 30
```

## 8.簡寫法
程式中經常要讓變數裡面的數值做變化，所以設計了一種簡寫法
例如想要讓變數 a 裡面的數值增加 10 我們會寫成
「a = a + 10」
但可以用簡寫改寫成
「a += 10」
這兩者做到的事情是一模一樣的！

[範例3-8](https://repl.it/@owpika/38)
```python=
a = 10

a += 10
print(a)

a -= 5
print(a)

a *= 2
print(a)

a /= 3
print(a)

a %= 2
print(a)
```


## 9.比較運算
* 比較運算也是一種運算符號，他的功能就是必較左邊跟右邊兩個對象
* 比較運算後會回傳一個「布林值」表示結果
* 比較是否相等是兩個等號「==」這是為了和變數賦值「=」做區隔


| 中文 | 符號 |
| -------- | -------- |
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
| == | 等於 |
| != | 不等於 |

[範例3-9](https://repl.it/@owpika/39)
```python=
print(10 > 20) #False
print(10 < 20) #True
print(50 >= 50) #True
print(40 <= 30) #False
print(50 == 50) #True

print('apple' == 'apple') #True
print('Apple' == 'apple') #False

print(True == True) #True
print(True == False) #False
print(True != False) #True
```

## == 和 is 的差異

在面對結構性資料例如串列、元祖、字典等
== 比較會去判斷內容物是否相等， is 則是判斷是否指到同樣的對象

不同的變數可能存放同樣的資料，就像是路牌一樣，兩個不一樣的路牌指向同樣的目的地
所以 is 比 == 更為嚴格

[範例3-19](https://repl.it/@owpika/310)
```python=
a = [1, 2, 3]
b = [1, 2, 3]
c = [1, 2, 4]

print(a == b) # True
print(a == c) # False

d = a
print(a is b) # False
print(a is d) # True
```

再舉一個例子，兩個變數指向同樣的資料，當修改任何一個時，兩邊都會變化
因為這兩個變數本質上儲存的是同樣東西
[範例3-10](https://repl.it/@owpika/310)
```python=
a = [1, 2, 3]

b = a
b[2] = 'XD'

print(a)
```

## 10.and、or 邏輯運算

邏輯運算符號可以將多個條件判斷串接器來，
and 就是「而且」or 就是「或者」

[範例3-11](https://repl.it/@owpika/311)
```python=
ch = int(input('國文'))
en = int(input('英文'))
ma = int(input('數文'))

if ch >= 60 and en >= 60 and ma >= 60:
    print('三科都及格！')
else:
    print('三科至少有一科不及格😠')


if ch >= 60 or en >= 60 or ma >= 60:
    print('三科至少有一科及格！')
else:
    print('都不及格😠')

```

# 4.輸入與輸出
## 1.什麼是輸入輸出？
輸入輸出就是一種跟電腦溝通的方式
輸出像是嘴巴，就是電腦講話給人類，要使用 print 指令
輸入像是耳朵，接收人類講的話，要使用 input 指令

一個簡單的聊天機器人程式
[範例4-1](https://repl.it/@owpika/41)
```python
print('你的名字？')
name = input()
print('你好' + name + '!')
```

## 2.讀取輸入的資料型態
要注意的事情是，input 取得使用者輸入的資料一定是「字串」，所以如果要做計算就要「轉換型態」

執行以下程式會造成錯誤！
[範例4-2](https://repl.it/@owpika/42)
```python
w = input('體重kg?')
h = input('身高m?')

bmi = w / (h * h) #這裏字串去做數學運算會出錯！

print('BMI 值：' + bmi)
```

用 float 方法將輸入的字串轉成數字！
記得印出計算結果是數值，要用 str 轉成字串才能相接
[範例4-3](https://repl.it/@owpika/43)
```python
w = float(input('體重kg?')) #將數入內容轉成浮點數
h = float(input('身高m?')) #將數入內容轉成浮點數

bmi = w / (h * h)

print('BMI 值：' + str(bmi)) #因為輸出時要做串接，所以要用 str 再將數字轉乘字串
```


# 5.條件判斷

條件判斷是 if 關鍵字加上一對小括號，小括號裡面的事情成立，就做後面的程式

[範例5-1](https://repl.it/@owpika/51)
```python
print('這部是成人電影喔')
age = int(input('你今年幾歲?'))

if age > 18:
    print('可以租借！')
else:
    print('不能租借！')
```

[範例5-2](https://repl.it/@owpika/52)
```python=
score = int(input('分數？'))

if score >= 90:
    print('A 級分')
elif score >= 80:
    print('B 級分')
elif score >= 70:
    print('C 級分')
elif score >= 60:
    print('D 級分')
else:
    print('E 級分')
```

# 6.串列
## 1.什麼是串列？
什麼是串列？
* 串列就像是一排置物櫃，這個置物櫃有很多個格子
* 每個格子上都有一個獨一無二的編號
* 編號從 0 開始！

為什麼需要串列？
假如你要寫一隻程式，程式裡要記錄數千筆資料時，就不可能在程式中宣告數千個變數，這時候就需要用到串列


## 2.創造
* 使用一對中括號裡面存放要讀取的資料編號
* 裡面的每一筆資料用逗號隔開

[範例6-1](https://repl.it/@owpika/61)
```python=
arr = ['香蕉', '鳳梨', '蘋果', '橘子', '西瓜', '草莓']
print(arr)
```

## 3.讀取、修改
* 操作起來跟一般的變數是非常相似的
* 串列的資料編號是從 0 開始
* 如果讀取的資料超出範圍就會造成程式錯誤

[範例6-2](https://repl.it/@owpika/62)
```python
arr = ['香蕉', '鳳梨', '蘋果', '橘子', '西瓜', '草莓']

print(arr[0]) #香蕉
print(arr[1]) #鳳梨
print(arr[5]) #草莓

arr[2] = '芭樂' #修改
print(arr[2]) #['香蕉', '鳳梨', '芭樂', '橘子', '西瓜', '草莓']
print(arr[2]) # 芭樂


print(arr[7]) #超出範圍，程式會出錯誤！
```

## 4.新增
* 使用 append 方法可以將指元素新增到串列最後

[範例6-3](https://repl.it/@owpika/63)
```python=
arr = ['A', 'B', 'C']
arr.append('D')
arr.append('E')
print(arr) #['A', 'B', 'C', 'D', 'E']
```

## 4.移除
* pop 移除
    * 移除指定「編號」的元素
    * 沒有指定編號，預設是咦橻最後的元素
    * 超出編號範圍程式會出錯
* remove 移除
    * 移除指定「內容」的元素
    * 找不到指定內容的元素程式會出錯

[範例6-4](https://repl.it/@owpika/64)
```python=
arr = ['A', 'B', 'C', 'D', 'E']

arr.pop(1) #移除編號 1
print(arr) #['A', 'C', 'D', 'E']

arr.pop(1) #移除編號 1
print(arr) #['A', 'D', 'E']

arr.pop() #移除最後元素
print(arr) #['A', 'D']

arr.pop(100) #不存在，程式會出錯
```
[範例6-5](https://repl.it/@owpika/65)
```python=
arr = ['A', 'B', 'C', 'D', 'E']

arr.remove('B') #移除內容 'B'
print(arr) #['A', 'C', 'D', 'E']

arr.remove('C') #移除內容 'C'
print(arr) #['A', 'D', 'E']

arr.remove('大中天') #不存在，程式會出錯
```

## 5.排序與翻轉

### 排序
* 數字排序，數字排序會由小排到大
* 字串排序，字串排序會按照字母大小 A-Z、a-z

[範例6-6](https://repl.it/@owpika/66)
```python=
arr1 = [3, 9, 6, 2, 1, 7, 5, 4, 8, 0]
arr1.sort()
print(arr1) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


arr2 = ['Cat', 'orange', 'Orange', 'apple', 'Apple', 'Dog']
arr2.sort()
print(arr2) #['Apple', 'Cat', 'Dog', 'Orange', 'apple', 'orange']
```

### 翻轉

[範例6-7](https://repl.it/@owpika/67)
```python=
arr = ['上', '海', '自', '來', '水']
print(arr)

arr.reverse()
print(arr)

arr.reverse()
print(arr)
```

### 挑戰一下
試著在大腦中去模擬以下程式，並想想看第七、八行會印出什麼？

[範例6-8](https://repl.it/@owpika/68)
```python=
arr = [80, 20, 60, 30, 90, 40, 50]
arr.sort()
arr.pop()
arr.reverse()
arr.pop()

print(max(arr))
print(min(arr))
```

## 6.串列的切割

串列[開始:結尾:間隔]
* 開始：沒有填預設是 0
* 結束：沒有填預設是 串列長度
* 間隔：沒有填預設是 1

**注意！切出來的東西是不包含結束的那個元素！**

```python
arr = ['香蕉', '鳳梨', '蘋果', '橘子', '西瓜', '草莓']

arr[::] #['香蕉', '鳳梨', '蘋果', '橘子', '西瓜', '草莓'] 
arr[2::] #['蘋果', '橘子', '西瓜', '草莓']
arr[:4:] #['香蕉', '鳳梨', '蘋果', '橘子'] 
arr[2:4:] #['香蕉', '鳳梨', '蘋果', '橘子'] 
arr[2:4] #['蘋果', '橘子']
arr[::2] #['香蕉', '蘋果', '西瓜']
arr[1:4:2] #['鳳梨', 橘子']
```

切割術能用在串列、元組、字串
```python=
name = 'OrangeApple'
tup = ('O', 'r', 'a', 'n', 'g', 'e')
arr = ['O', 'r', 'a', 'n', 'g', 'e']

print(name[3:6])
print(tup[3:6])
print(arr[3:6])
```

切割的三個參數跟 range 還有 random.randrange 非常相似
```python=
arr = list(range(10, 21, 2))
print(arr) # [10, 12, 14 16, 18, 20]

r = random.randrange(10, 21, 2)
print(r) # 隨機整數，可能是 10, 12, 14 16, 18 或 20 從中隨機挑選一個
```


# 7.for迴圈

## 語法理解
「for 變數 in 串列」就是會把串列的的元素，從頭逐一取出來並暫時存放在變數中
串列裡有多少筆資料迴圈就會執行幾次，每一次執行變數裡就會存放取出來的東西

以下的 for 迴圈會執行 5 次，每次執行會把串列裡的資料逐一取出，並暫存在 f 變數
試著複製以下程式並執行，觀察印出來的結果

```python=
fruits = ['橘子', '蘋果', '香蕉', '芭樂', '草莓']

for f in fruits:
    print(f)
```

以下程式會執行 10 次，並會印出數字 0 印到 9
```python=
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in arr:
    print(i)
```

因為寫程式太常要用到執行「指定次數」的事情，引此誕生出 range 方法

以下程式一樣會印出 0 到 9
```python=
arr = range(10)
for i in 10:
    print(i)
```

當然我們更常直接把 range 寫在迴圈裡
```python=
for i in range(10):
    print(i)
```

range 方法
range 是產生一種類似串列的東西，但本質上還是略微不同，但使用起來卻非常相似

range 有三種使用方式，可以產生出各種數列
方法二、方法三跟串列的切割是不是很相似呀
```python=
#方法一
arr1 = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

#方法二
arr2 = list(range(10, 20)) # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

#方法三
arr3 = list(range(10, 20, 3)) # [10, 13, 16, 19]
```

你一定要熟記的例
```python=
print('range(10)')
for i in range(10): # [0, 1, 2, 3 ... 9]
    print(i)

print('range(10, 20)')
for i in range(10, 30):  # [10, 11, 12, 13 ... 29]
    print(i)

print('range(30, 10)')
for i in range(30, 10): # []
    print(i)

print('range(10, 30, 4)')
for i in range(10, 30, 4): #[10, 14, 18, 22 ... 26]
    print(i)

print('range(10, 30, -4)')
for i in range(10, 30, -4): #[]
    print(i)

print('range(30, 10, -4)')
for i in range(30, 10, -4): #[30, 26, 22, 18 ... 14]
    print(i)
```



# 8.函式
## 什麼是函式？
函式就像是工廠裡的機器，可以給他一些原物列(參數)，它就會經過一番處理後返回一個成品(輸出)給你
程式中的函式可以不需要參數或輸出

## 內建函式

```python=

#abs 絕對值，把數字變成正數
print(abs(5)) #5
print(abs(-5)) #5

#divmod(x, y) x 除以 y 的(商, 餘數)
print(divmod(10, 4)) # (2, 2)
print(divmod(15, 2)) # (7, 1)


#max 可以傳入多個參數
print(max(10, 20, 30)) #30

#也可以傳入串列喔
arr = [2, 4, 3, 7, 9, 3, 1, 8]
max(arr)
min(arr)

#取長度
print(len('你好我是金城武！')) #8
print(len(['A', 'p', 'p', 'l', 'e'])) #5

#pow(x, y)
print(pow(2, 5)) #32
print(pow(3, 3)) #27

sort([1,2,3])

sum([1,2,3])


```
# 9.套件
套件就是別人寫好的程式，可以直接拿來使用

## 隨機數套件 random

```python=
import random #如果沒載入套件，程式就無法使用喔！
```

random.randrange 方法
此方法跟 range 函式非常相似，可以想像成就是 range 產生一個串列然後從裡面挑出一個數字
```python=
random.randrange(10) #產生 0 ~ 9 之間的隨機整數，但不會出現 10
random.randrange(10, 20) #產生 10 ~ 19 之間的隨機整數，但不會出現 20
random.randrange(10, 20, 3) #產生 10 ~ 19 之間的隨機整數，但不會出現 20
```

random.random 方法
用來產生 0 - 1 的隨機小數
```python=
random.random() # 0 ~ 1 之間的隨機小數

random.random()*100 # 0 ~ 100 之間的隨機小數

random.random()*100 + 50 # 50 ~ 150 之間的隨機小數

int(random.random()*100) + 50 # 50 ~ 150 之間的隨機整數
```

randrange vs randint
```python=
# 0 - 9 都有機會出現，但數字 10 不可能出現
for i in range(10):
    print(random.randrange(0, 10))

# 0 - 10 都有機會出現
for i in range(10):
    print(random.randint(0, 10))
```


## 時間套件 time

```python=
import time

start = time.time()
time.delay(5)
end = time.time()

print(end - start) #約 5

```

# 10.例外處理

重點注意：
* try except 語法一定要有一個以上的 except 敘述！

這樣的程式輸入什麼會導致錯誤？
[範例10-1](https://repl.it/@owpika/101#main.py)
```python=
h = float(input('身高m?'))
w = float(input('體重kg?'))
bmi = w/(h*h)
print('BMI:' + str(bmi))
```
使用例外處理把程式包起來！
[範例10-2](https://repl.it/@owpika/102#main.py)
```python=
try:
    h = float(input('身高m?')) #在這裡出錯，就進入例外處理程式
    w = float(input('體重kg?')) #在這裡出錯，就進入例外處理程式
    bmi = w/(h*h)
    print('BMI:' + str(bmi))
except:
    print('輸入的內容不合法！')
```

# 11.檔案讀寫

open(檔案, 模式, 編碼)
模式有三種
* r(read 讀取 預設)
* w(write 寫入)
* a(add 附加)

注意要點
* 使用 w 寫入模式所建立的檔案物件，是不能執行讀取的
* a 附加模式一樣是寫入資料，但跟 w 不一樣不會覆蓋原本內容，而是會從檔案新增進去
* 如果文本是多行內容，表示每一行最後都有個 \n 的換行符號，用 print 出來的時要注意加上 end="" 就可以移除 print 本身自帶的換行符號

## 寫入資料
[範例11-1](https://repl.it/@owpika/111#main.py)
```python=
f = open('names.txt', 'w')
f.write('大雄\n小叮噹\n靜香\n胖虎\n小夫')
f.close()
```

## 讀取資料
[範例11-2](https://repl.it/@owpika/112#main.py)
```python=
f = open('names.txt', 'r')
for l in f:
    print(l)
f.close()
```

## with 語法
[範例11-3](https://repl.it/@owpika/113#main.py)
```python=
with open('names.txt', 'r') as f:
    for l in f:
        print(l, end="")
```

## 方法
[範例11-4](https://repl.it/@owpika/114#main.py)
```python=
with open('names.txt', 'r') as f:
    lines = f.readlines()
    print(lines)
    
with open('names.txt', 'r') as f:
    s = f.read(10)
    print(s)

with open('names.txt', 'r') as f:
    print(f.readline())
    print(f.readline())
    print(f.readline())
```

用 a 模式的話，原本的文件內容不會被覆蓋，而是會從後面繼續新增內容
```python=
f = open('names.txt', 'a')
f.write('金城武\n蔡依林\n波多野\n周杰倫')
f.close()
```