# 賓大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` 處的元素並返回其值。