`取自《初學Python的第一本書 從基本語法到模組應用》` **錯誤處理機制** ``` try: 有可能發生例外的程式碼 except: 發生例外時,執行這個區塊的程式碼處理 ``` ``` try: 有可能發生例外的程式碼 except 例外1 as 命名1: 處理例外1種類所造成的的例外的程式碼 except 例外2 as 命名2: ... except 例外3 as 命名3: ``` raise Exception 傳入值 主動將例外丟出,帶著給定的訊息,有助判斷 --- **遞迴 Recursion** 當一個函式在使用時,中途不斷呼叫自己,藉以達到某些目的或完成某些問題 三元運算子,使用if跟else ``` def cal(end): return end + cal(end - 1) if end != 1 else 1 ``` 當 end!=1 時,會回傳 end+cal(end-1),否則就回傳1 (當end為1時,直接回傳1) 建立遞迴函式的條件: * 將要計算的東西拆小,拆成一部份已知一部分未知 or 拆成數塊比較小的部分 * 拆分越小時,至少要有一個狀態是可以直接得到結果的,最後能讓所有的區塊都變成已知,從而計算出結果 --- **import寫法:** 1. import module `直接將整個檔案納入(不用加.py)` 2. from module import function `只匯入function的部分` 3. import module as xx `'xx'為自己選的替代名` 4. from module import funtion as oo `oo相當於function` random中的random()可以**隨機生成**一個0~1之間的小數亂數(包含0但不包含1) 使用套件形式匯入,將資料夾命名為utils(工具箱),裝入所有檔案,還需裝入一個空白檔案,命名為__init__.py ``` |--fromzero.py |--utils |--__init__.py |--check.py |--schedule.py ``` 存放key出現的次數,可使用get(),第一個參數放入要找的key,第二個位置放入預設的value值,若key不存在於字典,就使用value作為結果;若存在的話就用對應到的value ``` dic.get('XD',0) 0 ``` 在defaultdict中,當key沒有被指定value時,就會採用初始化時預設給進去的東西 Counter()計算什麼東西出現幾次,也屬於collections的一部份 most_common()會按由大到小的出現次數來排序,如果有代入值的話代表要取前幾個數 OrderedDict() 按照原先順序排列進行迭代 stack(堆疊)使用list queue(佇列)使用deque deque是雙向序列,也屬於collections的一部份 當字串代入到deque()時,會直接按字元拆分 popleft()表示從左邊**取出**一個元素 pop()表示從右邊**取出**一個元素 ``` deque(['a', 'b', 'c', 'd', 'e']) print(d.popleft()) # 從左邊取出 'a' print(d.pop()) # 從右邊取出 'e' ``` appendleft()表示從左邊**置入**一個新的元素 append()表示從右邊**置入**一個新的元素 ``` d.append('XDFES') print(d) # deque(['c', 'd', 'XDFES']) d.appendleft('YES') print(d) # deque(['YES', 'c', 'd', 'XDFES']) ``` * from collections import defaultdict * from collections import Counter * from collections import OrderedDict * from collections import deque --- 物件 object 類別 class ``` class student(): def __init__(self, name): self.name = name ``` **self指物件本體**,透過self.xxx來取得or修改物件屬性或方法 self.name = name 代表要開始時,將從外面傳入進來的name值,存放進這個物件本體的name值 --- 類別的繼承: * 基礎類別 base class / 父類別 parent、超類別 super * 衍生類別 derived calss / 子類別 subclass ⚠️ 定義子類別要在括號內加入父類別的名稱 --- **Override 覆寫/覆載** 將父類別有的函式,重新給予定義 想要覆寫父類別,又想用到原先的內容,可以使用 **super()** 來取得父類別的東西 --- 模組比物件/類別還要精簡,不會牽扯太多額外的東西;但模組在一個程式中import時,只會產生同一個東西,而類別可以產生多個不同物件。 (不需要產生多個物件可以以**模組**形式處理) (相同性質但屬性質不同的適合用類別與物件處理) ⚠️ 模組不行繼承,若有繼承需求,只能選擇類別與物件。 --- 類別方法:會影響整個類別的方法,會在前面加上「@classmethod」 類別屬性:整個類別所共有的屬性 靜態方法:使用「@staticmethod」開頭,不需要self or cls參數,通常用以處理可以固定不變,不受其他屬性影響的東西 ``` class Desolve(): @staticmethod def ads(): print('無情工商時間!') print('從LeetCode學演算法是一系列非常好的課程!') print('http://bit.ly/leetcodeall') Desolve.ads() ``` --- **多重繼承**:一個類別也可以繼承不只一個類別 ``` EX: 有A, B兩個類別,想用一個C類別同時繼承他們,C就會同時擁有A和B的屬性和方法 class C(A, B) ... ``` (若重名會呼叫前面的,**寫越前面的優先程度越大**) --- **運算子的覆寫 (Override)** nmod3() 會記錄數字並判斷餘數是否相等 ⚠️ 這些都是兩個物件相比,我們假定後面的物件叫b。 __ eq __ => self == b __ ne __ => self != b __ lt __ => self < b __ gt __ => self > b __ add __ => self + b __ mul __ => self * b __ len __ => len(self) # 可以定義什麼是你的物件的"長度" --- **檔案讀寫** - **文字檔案讀寫** 方法一: ``` file = open(name, mode) ... # 使用file來處理檔案 file.close() # 用完要關閉檔案 ``` 方法二: ``` with open(name, mode) as file: ... # 使用file來處理檔案 # 離開這個with的區塊以後,file自動關閉 ``` ⚠️ open會找尋name的檔案,並以mode的模式開啟 --- **mode代表涵義** | 第一個字元 | 作用 | |:----------:|:------------------------------------------------------:| | r | 讀取(read) | | w | 寫入(write) | | x | 新增檔案(exclusive creation),如果檔案已存在則回傳錯誤 | | a | 在結尾處寫入(append) | | 第二個字元 | 作用 | |:----------:|:----------------------------------------------:| | b | 用二進位的方式來處理(預設則是當成文字來處理) | | + |更新(updating)(可讀可寫),通常會用'r+'代表可讀可寫| --- 檔案讀寫時,使用「偵錯工具:偵錯Python檔案」來執行 讀取函式:read()、readline()、readlines() > read():有什麼讀什麼,使用前先確定檔案大小 > readline():以行(ㄏㄤˊ)為單位將檔案讀出 > readlines():按行將讀出來的每一行為單位組成list --- **CSV讀寫** row 橫向 / column 直向 **JSON讀寫**(JavaScript Object Notation) 1. 通常用於大量的層級 2. 做為資料交換用的格式 ⚠️ 字串一定要用雙引號" " **JSON常用格式** | 名稱 | 說明 | | ---- | ---- | |array(陣列)|跟Python的串列基本相似,除了前面有一個它的名字(可自行命名),後面使用中括號框住,以" , "逗號分隔| |boolean(布林值)|可以放在值的地方,使用true/false (注意是全小寫!)| |color(色彩)|使用文字來表示一些色彩的話,有些編輯器可以幫你解讀出來| |null(空)|相當於Python的None,表示沒有東西存在| |number(數字)|在JSON中數字可以是整數或小數| |object(物件)|使用大括號框起,裡面的每一段跟字典相似,使用key:value的型態放入,可以多層(但是key必須要是字串)| * Python資料結構 轉換成 JSON字串,可以import json,並使用dumps()來處理(如果是從檔案的話要用dump()的方法) * JSON字串 轉換成 Python資料結構,可以使用loads()方法,轉換出來的Python結構可當成字典,可能含有串列部分 ⚠️ json中的每個object必須要是獨一無二的,也就是不可以重名! Python字典的key也必須要是獨特的,如果重名最後面出現的會蓋掉前面的