---
# System prepended metadata

title: 賓大AI-Python

---

# 賓大AI-Python
[toc]

###### 內文撰寫 @Ethan1407 
###### copyright @Ethan1407 
---

## 是非題

### Module 2 - 基本觀念

1. :x: 在互動模式下執行 Python 程式會一次執行所有行。
:::info

#### :bulb: 修正
在互動模式下，Python 程式會逐行執行輸入的指令。
:::
2. :heavy_check_mark: 在 Python 中，3 // 2 的結果是 1。
:::warning
#### :bulb: 補充
`/` 會得到浮點數結果
`//` 是整數除法，結果會無條件捨去
`%` 用來計算除法的餘數。
`**` 用來做次方運算
:::
3. :x: Python 中的 input 函數預設會返回整數類型的值。
:::info
#### :bulb: 修正
Python 中的 input() 函數預設會回傳字串型別的值，需要取得整數，必須額外用 int() 做型別轉換。
:::
4. :x: Python 程式中的邏輯錯誤會自動被直譯器檢測到。
:::info
#### :bulb: 修正
Python 的直譯器無法自動檢測程式中的邏輯錯誤，只能偵測語法錯誤或執行時錯誤。邏輯錯誤必須由開發者手動發現與修正。
:::
5. :heavy_check_mark: Python 被認為是高階程式語言。
6. :x: Python 使用編譯器而不是直譯器。
:::info
#### :bulb: 修正
Python 是使用直譯器執行的程式語言
:::
7. :heavy_check_mark:可以透過自訂執行配置直接在 Notepad++ 中執行 Python 腳本。

### Module 3 - 判斷式(1)

1. :x: Python 的 int() 函數可以在沒有任何錯誤的情況下成功將字串 '52.6' 轉換為整數。
:::info
#### :bulb: 修正
`int()`函數不能直接將含有小數點的字串轉換為整數，需先轉為浮點數後，再轉成整數
:::
2. :heavy_check_mark:在 Python 中，使用 print 函數時，用逗號分隔的輸出項之間會自動插入一個空格。
:::warning
#### :bulb: 補充
用加號`+`串接的輸出項之間不會自動加空格
```python=
print("Hello" + "World")
```

:::
3. :x: 使用 int(str(123.45)) 會在 Python 中產生整數 123。
:::info
#### :bulb: 修正
`str`會將數字轉為字串，而且要轉成整數前，應先轉為浮點數
:::
4. :heavy_check_mark: 在 Python 中，可以在單行中使用連續賦值為多個變數指派相同的值，如：a = b = 10
5. :heavy_check_mark: 在 Python 中，input() 函數始終以字串形式返回值。
6. :heavy_check_mark: 在 Python 中使用單個等號進行比較會導致語法錯誤。
7. :x: 在 Python 中，使用 int() 函數將字串 '52' 轉換為整數會導致錯誤。
:::info
#### :bulb: 修正
在 Python 中，int('52') 可以正確地轉換為整數 52，不會產生錯誤。
:::
8. :x: 在 Python 中，將整數轉換為浮點數會導致執行時出現錯誤。
:::info
#### :bulb: 修正
不會錯誤
:::
9. :heavy_check_mark: 若其中一個操作數為數字，則在 Python 中使用 + 運算符串聯兩個字串將導致syntax error。
:::warning
#### :bulb: 正確寫法
必須先將`25`轉換成字串
```python=
print("Age: " + str(25))
```
:::

### Module 4 - 判斷式(2)

1. :x: print 語句自動刪除其輸出的字串中的任何前導或尾隨空格。
:::info
#### :bulb: 修正
`print()`會輸出字串的所有字符，包括前導和尾隨空格，不會自動去除。
:::
2. :heavy_check_mark:將浮點數轉換為整數會導致無條件捨去，而不是四捨五入。
3. :heavy_check_mark: 在 Python 中，True 等同於 1，而 False 等同於 0，當使用在算術運算時。
4. :x: print(bool(-4.8)) 的輸出將為 False。
:::info
#### :bulb: 修正
只有數字`0`、空字串`''`、`None`、空容器（如空列表）等為 `False`，非零數字都是 `True`。
:::
5. :x: 在 Python 中，語句 a = b = 10 無效並將引發錯誤。
:::info
#### :bulb: 修正
在 Python 中，`a = b = 10` 是有效的連續賦值語句。
:::
6. :x: Python中的 input() 函數默認將使用者輸入讀取為整數。
:::info
#### :bulb: 修正
`input()` 函數預設返回字串型態。
:::
7. :heavy_check_mark: 將字串 '52 is great' 轉換為浮點數會導致 ValueError。
8. :heavy_check_mark: 使用 `print('The sum is', 5)`，Python 會自動在 `'The sum is' `和 `5` 之間插入一個空格。
9. :heavy_check_mark: 將只包含數字的字串轉換為整數會產生一個整數值。

### Modual 5 - 迴圈(1)

1. :x: 在 Python 中，所有整數預設為無符號（unsigned，只能儲存正數）。
:::info
#### :bulb: 修正
- Python 中的整數是有符號的，這代表它們可以表示正數、負數和零。
- Python 沒有內建的「無符號整數」型別。
:::
2. :heavy_check_mark: Python 中的 'for' 迴圈可以將字串作為可迭代對象來遍歷每個字元。
:::warning
### :bulb: 補充
在 Python 中，字串`str`是一種可迭代對象，這表示你可以使用 `for` 迴圈逐個取出其中的每個字元。
範例：
```python=
text = "hello"
for char in text:
    print(char)
```
輸出:
`h`
`e`
`l`
`l`
`o`
:::
3. :x: Python 變數的類型需要明確宣告。
:::info
#### :bulb: 修正
Python 是動態型別語言，變數的型別是根據賦值自動推斷的，無需事先宣告
::: 
4. :x: Python 使用 ASCII 編碼來表示中文字元。
:::info
#### :bulb: 修正
Python 3 預設使用 `UTF-8` 編碼，`UTF-8` 能夠表示全世界的多種語言，包括中文字元。ASCII 編碼只能表示英文和少數符號（0~127 的字元），無法表示中文。
:::
5. :x: 在 Python 中，值為 None 的變數等同於零。
:::info
#### :bulb: 修正
`None` 不是數字，也不等於 `0`。它是 Python 中代表「空值」或「無值」的特殊型別
:::
6. :x: 當程式執行時，變數被儲存在 CPU 中。
:::info
#### :bulb: 修正
變數在程式執行時被儲存在 **記憶體（RAM）** 中，而非 `CPU`。`CPU` 負責執行指令，但資料的儲存與管理是記憶體的工作。
:::
7. :x: 在 Python 中，`range()` 函數總是從 1 開始，除非另有規定。
:::info
#### :bulb: 修正
`range()` 預設是從`0` 開始，除非你特別指定起始值。
:::

### Module 6 - 迴圈(2)

1. :x: 在 Python 中，使用 `=` 運算符將浮點值分配給整數變數會自動將浮點數轉換為整數。
:::info
#### :bulb: 修正
Python 不會自動將浮點數轉成整數，除非明確使用 `int()`。
:::
3. :x: 在迴圈中使用 'break' 陳述式可以提供多個退出點。
:::info
#### :bulb: 修正
`break` 只能中止目前所在的那一層迴圈。
:::
4. :x: 給定程式碼片段 `i = 52.0; print(type(i))`，輸出將顯示 `<class 'int'>`。
:::info
#### :bulb: 修正
`type(i)`代表`i`的類型，因為`i`是浮點數，所以會輸出`<class 'float'>`
:::

### Module 7 - List

1. :heavy_check_mark: 一個列表對另一個列表使用 += 操作可以將第二個列表中的元素添加到第一個列表的末尾。
:::warning
#### :bulb: 補充
`+=` 是列表的擴展操作，相當於用 `extend()` 把第二個列表的所有元素逐一加入第一個列表中。
`a += b` = `a.extend(b)`
:exclamation:a和b都必須是陣列才可以這樣寫
:::
2. :x: Python 中，列表的第一個元素索引為 `1`。
:::info
#### :bulb: 修正
Python 的索引是從` 0 `開始的，所以第一個元素索引是 `0`
:::
3. :x: Python 中，`split()` 方法會產生一個字典。
:::info
#### :bulb: 修正
`split()` 是字串的方法，切割字串後會回傳列表(list)，而不是字典。
:::

4. :x: Python 中，`append()` 方法可以一次性將多個元素添加到列表中。
:::info
#### :bulb: 修正
`append()` 每次只能添加一個元素。如果想一次加多個元素，應該使用 `extend()`
:::
5. :heavy_check_mark: Python 中，對列表使用 `len()` 將返回列表中的元素數量。
6. :x: Python 中，透過一個引用修改列表不會影響另一個指向相同列表的引用。
:::info
#### :bulb: 修正
Python 中變數是指向物件的引用。如果兩個變數指向同一個列表，透過任一變數修改列表內容，另一個也會看到修改結果。
```python=
a = [1, 2]
b = a
b.append(3)
print(a)  # [1, 2, 3]
```
:::
7. :x: Python 中，`list.remove(x)` 將移除列表 list 中的所有 x。
:::info
#### :bulb: 修正
`remove() `只會刪除第一個遇到的元素 x，不會移除所有出現的 x。
:::
8. :heavy_check_mark: Python 中，`index()` 方法會在找到元素時返回其索引，否則會引發異常。
9. :x: Python 中，將一個列表賦值給另一個變量會創建一個新的獨立列表。
:::info
#### :bulb: 修正
直接賦值只是讓兩個變量指向同一個列表物件，不會複製。
:::

### Module 8 - 演算法


1. :x: 若 `a_list = [1, 2, 3] `且` b_list = a_list`，指定 `b_list[0] = 10 `不會改變 `a_list` 的內容。
:::info
#### :bulb: 修正
在 Python 中，`b_list = a_list` 並不是複製列表，而是讓 `b_list` 也指向 `a_list`。因此，兩者都指向同一個內存位置。
所以當你改變 `b_list` 中的內容時，`a_list` 也會受到影響。
```python=
a_list = [1, 2, 3]
b_list = a_list
b_list[0] = 10
print(a_list)  # 輸出 [10, 2, 3]
```
:::
3. :x: 假設輸入為 `1 2 3 4 5`，執行 `grades = grade_str.split()` 後，grades 中的元素會自動成為整數。
:::info
#### :bulb: 修正
`split()` 會將字串按空格切分並返回一個字串列表，並不會自動將字串轉換為整數。
:::
4. :heavy_check_mark: 在 Python 的 list 中，可以同時儲存整數、字串和布林值等不同型態的資料。
5. :heavy_check_mark: 在不指定參數的情況下呼叫 `split()` 時，字串會依空白字元進行分割。
6. :x: 在旅行推銷員問題的貪婪演算法中，每一步都選擇最近的未拜訪位置，因此該演算法總能找到最佳路線。
:::info
#### :bulb: 修正
每一步都選擇最近的也不代表總路程最短
:::
7. :heavy_check_mark: 對字串 `1,2,3` 呼叫 `split(',')` 會回傳 `['1', '2', '3']`。
8. :heavy_check_mark: len() 函式可以用來計算 list 和字串的長度。
9. :heavy_check_mark: 若 `nums = [3, 5, 7]`，那麼執行 `nums[2] = nums[2] * 2` 會將清單的第三個元素改成 `14`。
10. :heavy_check_mark: 對 grades 執行 `grades.append([9, 7, 5])` 時，整個 `[9, 7, 5]` 會被視為一個元素加入清單中。
:::info
#### :bulb: 修正
`append()` 會將整個物件作為一個單一元素添加到列表中。在這個例子中，整個列表 `[9, 7, 5]` 會被當作一個元素加入到 grades 列表。
:exclamation:因為`append()`一次只能加入一個元素，若要將整個陣列加到後方，需使用`extend()`
```python=
grades = [1, 2, 3]
grades.append([9, 7, 5])
print(grades)  # [1, 2, 3, [9, 7, 5]]
```
:::

### Module 9 - 函數

1. :heavy_check_mark: 在 Python 函式中定義的區域變數無法在函式外部存取。
:::warning
#### :bulb: 補充
函式內部定義的變數是區域變數，它的作用範圍僅限於函式內部，無法在函式外部直接存取。
:::
2. :heavy_check_mark: 在 Python 中，可以定義沒有任何參數的函式。
3. :x: 如果函式沒有任何參數，在 Python 中呼叫它時可以選擇省略括號。
:::info
#### :bulb: 修正
在 Python 中，即使函式沒有參數，呼叫它時也必須加上括號。省略括號會導致語法錯誤。
:::
4. :heavy_check_mark: 如果 Python 函式沒有明確的 return 陳述式，它會自動回傳 `None`。
5. :x: 在 Python 的函式定義裡不可能使用預設參數。
:::info
#### :bulb: 修正
Python 中可以在函式定義時使用預設參數，這是很常見的做法。
:::
6. :x: 預設情況下，在函式中宣告與全域變數同名的區域變數會覆蓋該全域變數。
:::info
#### :bulb: 修正
預設情況下，當函式中使用與全域變數同名的變數時，會創建一個區域變數，而不會覆蓋全域變數。
```python=
x = 10
def func():
    x = 5  # 創建區域變數 x
    print(x)
func()  # 輸出 5
print(x)  # 輸出 10，因為全域變數 x 不變
```
:::
7. :heavy_check_mark: 在 Python 中，函式可以使用逗號分隔多個回傳值，並將這些值解包到不同的變數中。
:::warning
#### :bulb: 補充
Python 支援函式返回多個值，這些值會自動打包成一個元組，並可以在調用函式時解包到多個變數中。
```python=
def get_coordinates():
    return 10, 20  # 回傳兩個值
x, y = get_coordinates()  # 解包
print(x, y)  # 輸出: 10 20
```
:::
8. :x: 如果使用遞迴的 Python 函式沒有有效的基本情況，程式會一直執行且不會出錯。
:::info
#### :bulb: 修正
如果遞迴函式缺少有效的基本情況，會導致無窮遞迴，最終觸發 `RecursionError`（最大遞迴深度錯誤）。
:::
9. :heavy_check_mark: 以下遞迴函式呼叫 example(3) 的回傳值是 6。
``` python=
def example(x): 
    if x <= 0: 
        return -x 
    else: 
        result = example(x-1)
        return x + result
```
10. :x: 如果定義的函式 `add_one(num)` 回傳 `num+1`，但從未將結果指派回原始變數，呼叫函式後印出該變數時會顯示增加後的數值。
:::info
#### :bulb: 修正
函式回傳的結果需要顯式地賦值給變數才能保留更改。如果沒有賦值回原始變數，原始變數不會改變。
修改方式：
```python=
num = add_one(num)  # 將回傳值指派回原始變數
```
:::

## 實作題

### 變數
#### 資料型態
- int：整數。
- float：浮點數。
- string：字串。在 Python 中，即使一個單一字元也被視為長度為 1 的字串。
- bool：布林值，只有 `True` 和 `False` 兩個值。

### 條件判斷
使用`if` `elif` `else`關鍵字 
- ==一定要冒號 `:`==
- **縮排**非常重要

### 邏輯運算子
- 用於組合多個條件。
- 運算子包括：`and` `or` `not`。
#### and運算子
- 作用於兩個條件。
- ==當兩個條件都為 `True` 時返回 `True`，否則返回 `False`。==
- 可以使用 `and` 操作將多個條件合併成一條 `if` 語句
- Python 允許鏈式比較，如 `a < b < c`，等同於 `a < b and b < c`。但避免寫複雜且難以理解的鏈式表達式。
- 每個條件必須完整獨立：`b > a and < c` 是**錯誤的**。
#### or運算子
- ==當至少一個條件為 `True` 時返回 `True`，否則返回 `False`==
- 可以組合多個 `or` 條件或組合 `or` 和 `and` 條件，但要注意優先權或使用括號`()`
#### not運算子
- ==返回條件的相反值。`not (True)` 返回 `False`，`not (False)` 返回 `True`。==
- 當 `if` 塊中沒有什麼要執行，而 `else` 塊有特定動作時，可以使用 `not` 來反轉條件，將動作移至 `if` 塊以減少縮排或提高可讀性。

### 迴圈
#### while迴圈
- 只要判斷條件為`true`，就會重複執行
- 常用於迴圈計數器的更新，例如 `i = i + 1 `或 `i += 1`
#### break 和 continue
- `break`：立刻終止當前層級的迴圈。執行流程跳到迴圈後面的語句。在巢狀迴圈中，`break` 只跳出內層迴圈。
- `continue`：跳過 `continue` 後面在當前迭代中的語句，立即回到迴圈開頭檢查條件。如果條件滿足，開始下一個迭代。在巢狀迴圈中，`continue` 只跳到內層迴圈的條件檢查。
- 有意創建無窮迴圈並使用 `break` 退出，這種技巧廣泛用於消除重複程式碼。在一些語言中稱為 "do-while loop"。
- 使用 `break` 和 `continue` 會讓迴圈有多個出口點，但可讀性會降低
### List 列表
- 一個有序的容器，儲存項目 (items)。
- 項目可以是不同資料型態的值 (整數, 浮點數, 字串, 甚至其他列表)。
- 使用索引運算子 `[]` 存取項目。第一個項目的索引是 `0`。
- 使用 `len()` 函數獲取列表的長度 (項目數)。
- **List宣告**
    - 空列表：`a_list = []`。
    - 包含重複項目的列表：`a_list = [0] * 3` 創建包含三個` 0` 的列表。
    - 包含不同型態項目的列表：`a_list = [0, "hi", True]`。
- ==**List使用方式**==
    - `list.append(x)`：在列表末尾添加元素 `x`。
    - `list.sort()`：對列表由小到大排序
    - `list.reverse()`：反轉列表。
    - `list.index(x)`：返回元素 `x` 第一次出現的索引。
    - `list.insert(i, x)`：在索引 `i` 處插入元素 `x`。
    - `list.count(x)`：返回元素 `x` 在列表中出現的次數。
    - `list.remove(x)`：刪除列表中元素 `x` **第一次**出現的位置。
    - `list.pop(i)`：刪除列表中索引 `i` 處的元素並返回其值。