---
# System prepended metadata

title: Python 課堂筆記

---

# Python 課堂筆記
「Python程式設計入門」9/12-10/3課程內容筆記整理
## 9/12

### 變數和賦值的基本概念
在Python中，變數是用來存儲數據的名稱，賦值是將數據分配給變數的過程。

-  變數名稱：
    1. 變數名稱可以包含字母、數字和底線，但必須以字母或底線開始。
    2. 變數名稱區分大小寫，例如，"my_variable"和"My_Variable"被視為不同的變數。
    3. Python有一些保留字（例如"if"、"while"等），不能用作變數名稱。
```python=
# 創建一個整數變數age並賦值為30
age = 21

# 使用變數age打印出年齡信息
print("我的年齡是： ", age)
```

- 變數的類型：
Python是一種動態類型語言，變數的類型是根據賦給它們的值自動確定的。
不需要事先聲明變數的類型。
```python=
my_variable = 10  # my_variable是一個整數
my_variable = "Hello"  # 現在my_variable是一個字符串
```

- 多重賦值：
Python支持多重賦值，可以同時為多個變數賦值。
```python=
x, y, z = 1, 2, 3  # 將1賦值給x，2賦值給y，3賦值給z
```

- 變數的重新賦值：
可以在程序運行中多次為變數賦值，變數的值會隨著每次賦值的改變而更新。
```python=
count = 0
count = count + 1  # 將count的值增加1，現在count為1
count = count + 1  # 再次增加1，現在count為2
```

### 資料型態：

1. 整數（int）：
用於表示整數數值，例如：1、2、-3、100。
```python=
x = 5
```

2. 浮點數（float）：
用於表示帶有小數部分的數值，例如：3.14、2.71828。
```python=
pi = 3.14159
```

3. 字符串（str）：
用於表示文本數據，必須用單引號（'）或雙引號（"）括起來，例如："Hello, World!"。
```python=
name = "Roger"
```

4. 布林值（bool）：
用於表示 True 或 False 的布林值，通常用於條件判斷。
```python=
is_student = True
```

5. 列表（list）：
用於儲存一組有序的元素，可以包含不同類型的元素。
```python=
fruits = ["pineapple", "guava", "passion fruit"]
```

6. 元組（tuple）：
類似於列表，但是不可變（immutable），一旦創建就不能更改。
```python=
coordinates = (3, 4)
```

7. 字典（dictionary）：
用於儲存鍵值對（key-value pairs），每個鍵關聯一個值。
```python=
person = {"name": "Roger", "age": 21}
```

8. 集合（set）：
用於儲存無序且不重複的元素集合。
```python=
unique_numbers = {1, 2, 3, 4, 5}
```

9. NoneType：
表示一個特殊的空值，通常用於初始化變數或表示缺少值。
```python=
value = None
```

### 運算符

- 數學運算符
    - 加法運算符：+
    - 減法運算符：-
    - 乘法運算符：*
    - 除法運算符：/
    - 整數除法運算符：//
    - 餘數運算符：%
    - 指數運算符：**
```python=
a = 10
b = 5

sum = a + b
difference = a - b
product = a * b
division = a / b
integer_division = a // b
remainder = a % b
exponentiation = a ** b
```

- 比較運算符
    - 等於：==
    - 不等於：!=
    - 大於：>
    - 小於：<
    - 大於等於：>=
    - 小於等於：<=
```python=
x = 5
y = 10

result1 = x == y
result2 = x < y
result3 = x >= y
```

- 邏輯運算符
    - 且：and
    - 或：or
    - 非：not
```python=
is_student = True
is_registered = True

can_access_content = is_student and is_registered
should_show_ad = not is_registered
```

- 賦值運算符
    - 賦值：=
    - 加法賦值：+=
    - 減法賦值：-=
    - 乘法賦值：*=
    - 除法賦值：/=
    - 位運算賦值：&=、|=、^=、<<=、>>=
```python=
x = 10
x += 5  # x = x + 5
x -= 3  # x = x - 3
x *= 2  # x = x * 2
x /= 4  # x = x / 4
```

### 基本輸出

1. 使用print函數：
print函數用於將文本或其他數據輸出到控制台。
```python=
print("Hello, World!")
```

2. 格式化字符串輸出：
您可以使用字符串格式化來將變數的值插入到字符串中。
```python=
name = "Roger"
age = 21
print(f"My name is {name} and I am {age} years old.")
```

## 9/19

### 條件語句

在Python中，使用if和else條件語句來實現條件控制。以下是if和else語句的基本結構：
```python=
if 條件:
    # 如果條件為True，執行這裡的程式碼塊
else:
    # 如果條件為False，執行這裡的程式碼塊
```
是一個簡單的示例，說明如何使用if和else來控制程式的執行：
```python=
age = 18

if age >= 18:
    print("您已成年。")
else:
    print("您尚未成年。")
```
也可以擴展這個概念，使用elif（else if的縮寫）來處理多個條件：
```python=
score = 85

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "D"

print(f"您的成績等級是{grade}。")
```

### 迴圈

在Python中，迴圈是用來重複執行程式碼塊的控制結構。
Python支持兩種主要的迴圈類型：for迴圈和while迴圈。

- 使用 for 迴圈：
for迴圈通常用於遍歷可迭代對象（例如列表、元組、字典等），將其中的元素逐個提取出來處理。
```python=
# 使用 for 迴圈遍歷列表
fruits = ["apple", "pear", "pomelo"]
for fruit in fruits:
    print(fruit)

# 使用 for 迴圈遍歷範圍
for i in range(5):
    print(i)
```

- 使用 while 迴圈：
while迴圈用於根據條件重複執行程式碼，只要條件為真，迴圈就會繼續執行。
```python=
# 使用 while 迴圈計數
count = 0
while count < 5:
    print(count)
    count += 1

# 使用 while 迴圈進行條件判斷
user_input = ""
while user_input != "quit":
    user_input = input("輸入 'quit' 以退出：")
    print("您輸入了：" + user_input)
```

### 函數

在Python中，函數是一段可重複使用的程式碼塊
它接受一些輸入（稱為參數或引數），執行特定的任務，並返回結果。
函數的使用可以提高程式碼的可讀性、模組化和可維護性。

1. 函數的定義：
在Python中，使用def關鍵字來定義函數。函數定義的基本結構如下：
```python=
def function_name(parameters):
    # 函數內部的程式碼
    # 可能包括計算、操作、條件語句、迴圈等
    return result  # 可選，用於返回值
```

2. 函數的呼叫：
要呼叫函數並使用它，只需使用函數名稱並提供必要的參數。
```python=
message = greet("Roger")
print(message)  # 輸出：Hello, Roger!
```

3. 函數的參數：
函數可以有零個或多個參數，參數是函數接受的輸入值。您可以在函數定義中指定參數的名稱，然後在函數呼叫時提供相應的值。
```python=
def add(x, y):
    return x + y

result = add(3, 5)  # 傳遞參數3和5，返回結果8
```

4. 函數的返回值：
函數可以使用return語句返回一個或多個值。如果未指定return語句，則函數默認返回None。

```python=
def multiply(x, y):
    result = x * y
    return result

product = multiply(4, 6)  # 傳遞參數4和6，返回結果24
```

## 9/26

### 物件導向（Object-Oriented Programming，OOP）

1. 類別和物件：
類別（Class）是物件的範本或藍圖，它定義了物件的屬性和方法。
物件（Object）是類別的實例，它包含了類別定義的屬性和方法的具體值。

2. 封裝：
封裝是將資料（屬性）和操作（方法）捆綁在一起的概念。類別將屬性和方法封裝在物件內部，隱藏了實現細節，只暴露了公共介面。

3. 繼承：
繼承是一種機制，允許一個類別繼承另一個類別的屬性和方法。子類別繼承了父類別的特性，並可以添加自己的特性或覆蓋父類別的方法。

4. 多型：
多型是一種概念，它允許不同類別的物件對同一方法作出不同的回應。多型提高了程式碼的靈活性和可擴展性。

下面是一個簡單的 Python 類別的範例：
```python=
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return f"{self.name} 汪!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} 喵!"

# 創建物件
dog = Dog("Buddy")
cat = Cat("Rex")

# 呼叫方法
print(dog.speak())  # 輸出：Buddy 汪!
print(cat.speak())  # 輸出：Rex 喵!
```
我們定義了一個 Animal 類別，它具有一個 speak 方法。然後，我們創建了 Dog 和 Cat 類別作為 Animal 類別的子類別，每個子類別都覆蓋了 speak 方法以提供不同的實現。

### 模組（Module）

模組是用來組織相關功能的程式碼檔案。
模組可以包含函數、變數、類別等，並允許您在不同的Python腳本中重複使用程式碼。

1. 創建和匯入模組：

- 創建模組：創建一個Python檔案，其中包含函數、變數或類別等程式碼。
```python=
# mymodule.py
def greet(name):
    return f"Hello, {name}!"
```

- 匯入模組：在另一個Python腳本中，您可以使用import語句來匯入模組。
```python=
import mymodule

message = mymodule.greet("Roger")
print(message)  # 輸出：Hello, Roger!
```

2. 使用別名匯入模組：
可以為匯入的模組指定別名以方便使用。
```python=
import mymodule as mm

message = mm.greet("Roger")
print(message)  # 輸出：Hello, Roger!
```

3. 匯入模組中的特定內容：
如果只需要模組中的特定函數、變數或類別，可以使用from關鍵字。
```python=
from mymodule import greet

message = greet("Roger")
print(message)  # 輸出：Hello, Roger!
```

4. Python標準庫：
Python自帶了許多內建模組，可以直接使用它們，無需額外安裝。
例如，math模組提供了數學函數，random模組用於生成隨機數，
datetime模組用於處理日期和時間等等。
```python=
import math

result = math.sqrt(25)
print(result)  # 輸出：5.0
```
5. 自訂模組：
可以創建自己的模組來組織和重複使用程式碼。
將相關功能封裝到模組中有助於保持程式碼的清晰性和可維護性，
並使其在不同的專案中共享和重複使用。









## 10/3

### 讀取檔案
在Python中，可以使用內建的open函數來讀取文件。使用with語句可以確保在讀取後正確關閉檔案
```python=
# 開啟檔案
with open('檔案路徑', 'r') as file:
    # 讀取檔案內容
    file_contents = file.read()
    # 處理檔案內容，例如列印它
    print(file_contents)
```
根據需求可以使用不同的檔案開啟模式，例如'r'（只讀，預設值）、'w'（寫入）、'a'（追加）等。

### 讀取.xlsx檔
1. 使用 pandas 

pandas 是一個強大的資料處理庫，它可以輕鬆讀取和操作Excel文件。
如果沒有安裝，可以使用以下命令安裝它：
```python=
pip install pandas
```
然後，可以使用以下程式碼來讀取Excel文件：
```python=
import pandas as pd

# 讀取Excel文件
df = pd.read_excel('檔案路徑.xlsx')

# 印出資料框（DataFrame）
print(df)
```
2. 使用 openpyxl 

openpyxl 是一個專門用於操作Excel文件的庫
如果只需要讀取Excel文件的內容而不涉及數據分析，這是一個好的選項。
如果沒有安裝，可以使用以下命令安裝它：
```python=
pip install openpyxl
```
然後可以使用以下程式碼來讀取Excel文件：
```python=
import openpyxl

# 開啟Excel文件
workbook = openpyxl.load_workbook('檔案路徑.xlsx')

# 選擇一個工作表
sheet = workbook.active

# 讀取數據
for row in sheet.iter_rows(values_only=True):
    print(row)
```
如果需要進行數據分析和處理，pandas通常更方便。
如果只需要簡單地讀取數據，openpyxl可能更適合。

### 匯出.csv檔
在Python中使用csv模組是一個常見的方法來輸出CSV檔
```python=
import csv

# 定義要寫入CSV檔案的數據
data = [
    ['姓名', '年齡', '城市'],
    ['123', 25, '台北'],
    ['456', 30, '新北'],
    ['789', 28, '桃園']
]

# 指定要寫入的CSV檔案的路徑
csv_file_path = '檔案路徑.csv'

# 使用with語句打開CSV檔案並寫入數據
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
    # 創建CSV寫入器
    csv_writer = csv.writer(csv_file)
    
    # 寫入數據行
    for row in data:
        csv_writer.writerow(row)

print(f'已成功將數據寫入到 {csv_file_path}')
```
在上面的示例中，首先定義要寫入CSV檔案的數據，然後指定要寫入的CSV檔案的路徑（csv_file_path）。
接下來，使用with語句打開CSV檔案，並創建了一個CSV寫入器（csv_writer）。
最後，使用writerow()方法一行一行地將數據寫入CSV檔案。

### 除錯與例外處理

1. 除錯（Debugging）：

- 使用print語句：
最簡單的除錯方法是在程式碼中插入print語句，輸出變數的值以及程式的執行流程。
通過觀察輸出，可以識別問題所在，找出錯誤。

- 使用調試器：
Python提供了pdb，可以使用它來逐步執行程式碼並檢查變數的值。
在需要調試的地方，插入import pdb; pdb.set_trace()，然後運行程式，它將在那個點啟動。

- 使用整合開發環境（IDE）：
許多Python IDE（例如PyCharm、Visual Studio Code等）提供強大的調試工具，可以逐步執行程式碼、查看變數、設定斷點等。

2. 例外處理（Exception Handling）：

- try...except區塊：
使用try...except語句區塊來處理潛在的例外情況。
在try區塊中編寫可能引發例外情況的程式碼，然後在except區塊中處理例外。
```python=
try:
    # 可能引發例外情況的程式碼
    result = 10 / 0
except ZeroDivisionError:
    # 處理除以零錯誤的程式碼
    print("除以零錯誤發生")
```

- 多個except區塊：
可以使用多個except區塊來處理不同類型的例外情況。
這允許依不同的例外類型採取不同的處理方式。
```python=
try:
    # 可能引發例外情況的程式碼
    result = 10 / 0
except ZeroDivisionError:
    # 處理除以零錯誤的程式碼
    print("除以零錯誤發生")
except ValueError:
    # 處理值錯誤的程式碼
    print("值錯誤發生")
```
- finally區塊：
可以使用finally區塊將try...except包裝起來，無論是否發生例外情況，都會在最後執行。
這對於需要在例外情況發生後進行清理操作（例如關閉檔案）非常有用。
```python=
try:
    # 可能引發例外情況的程式碼
    file = open('file.txt', 'r')
    # ...
except FileNotFoundError:
    # 處理檔案未找到例外情況的程式碼
    print("檔案未找到")
finally:
    # 在最後執行的程式碼，無論是否發生例外情況
    file.close()
```
- 自訂例外情況：
可以建立自訂例外情況類別，以便更好處理應用程式特定例外情況。
```python=
class MyCustomError(Exception):
    def __init__(self, message):
        super().__init__(message)

try:
    if some_condition:
        raise MyCustomError("自訂錯誤訊息")
except MyCustomError as e:
    print(f"捕獲自訂例外情況：{e}")
```

參考資料來源：
ChatGPT
精通Python：運用簡單的套件進行現代運算（第二版） ISBN：9789865024864