`取自《初學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也必須要是獨特的,如果重名最後面出現的會蓋掉前面的