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