# 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()
```