這是給想要學習 Python 的新手所寫的線上課程。
文字版教材:https://pythonbook.cc/
本課程以 Python 3 做為主要教學語言,第一單位(PY101)內容涵蓋 Python 環境安裝、程式語言基礎語法,包括各種常用資料型態介紹、邏輯及流程控制、函數、物件導向程式設計等,並透過網站爬蟲程式抓取並分析資料。
【會員專屬好禮🎁】即日起只要註冊五倍學院成為會員,馬上取得專屬 300 元折價券, 還可免費獲得會員獨家專屬課程 - Git小教室!
00 : 13 : 33
101 - 寫在最前面
Python 入門內容,教材已放上「為你自己學 Python」網站,採用 CC 授權免費取用。這本書的起源是因為我家小孩學校要教 Python,所以寫了一本讓新手也能看懂的書。Python 目前在 TIOBE 排行榜位居第一,可用於自動化程式、網頁爬蟲、網站開發及機器學習等領域。學習上我建議不要只是照著影片打字,而是先暫停影片自己嘗試撰寫,並透過「小黃鴨除錯法」講解給自己聽。最重要的是建立 SSOT(單一真相來源),以官方文件為準,使用 AI 工具時要小心求證。
01 : 50 : 17
201 - 安裝 Python
09 : 07
這個章節介紹如何安裝 Python 程式語言。首先到 Python 官網下載安裝檔,目前最新版本是 3.12.4。Mac 系統通常已內建 Python,但版本較舊,建議另外安裝新版。Python 2 和 3 不相容,現在普遍使用 Python 3。安裝過程很簡單,下載後一路按下一步即可完成。Mac 用戶可透過終端機輸入 python3 來執行,Windows 用戶則可用 PowerShell 輸入 python。若要離開 Python 環境,可輸入 exit() 或按 Ctrl+D。整體來說,Python 的安裝比其他程式語言簡單許多。
202 - REPL
介紹 Python 的 REPL 環境,REPL 是 Read、Evaluate、Print、Loop 四個字的縮寫。在這個環境中,系統會讀取你輸入的內容,評估執行後印出結果,然後等待下一個指令。例如在終端機輸入 python3 進入 REPL 環境後,輸入 1 就會印出 1,輸入 1 加 2 就會計算並印出 3。REPL 環境的提示符號是三個箭頭,輸入指令時不需要跟著打這三個箭頭。這個環境很適合用來執行簡單的程式或做測試,但不適合撰寫較長的程式碼。
203 - 安裝 pyenv
17 : 08
pyenv 這個 Python 版本管理工具。Python 有很多版本和分支,像是 Jython、IronPython、PyPy 等,光是 3 系列就有 3.10、3.11、3.12 等多個版本。pyenv 本身不是 Python,而是一個工具箱,可以在同一台電腦安裝並管理多個 Python 版本。Mac 用戶需先安裝 Homebrew,再用 brew install pyenv 安裝;Windows 用戶則透過 PowerShell 安裝。安裝後可用 pyenv install 安裝指定版本,用 pyenv shell 或 pyenv global 切換版本。設定 global 後,每次開啟終端機都會使用指定版本,且可直接打 python 而不用打 python3。
204 - 安裝 VSCode
01 : 18
介紹 Python 開發工具的選擇。其實只要有文字編輯器就能開始寫 Python 程式,不需要很厲害的工具。市面上有 PyCharm 這類功能完整的開發工具,雖然有免費的社群版本,但它是商業公司開發的,啟動速度稍慢。在這個課程中,我會使用 VS Code 這個文字編輯器,它簡單好用,在 Mac 和 Windows 都有對應版本,下載安裝後就能開始寫程式了。
205 - 第一個程式
13 : 17
示範如何用 Python 印出第一行程式。首先介紹用 python -c 指令直接執行一行程式碼,以及進入 REPL 環境互動執行,但這些方式不實用。接著說明正式開發流程:用 VS Code 開啟資料夾,建立 .py 檔案撰寫程式碼。推薦安裝 Python 和 Black Formatter 這兩個擴充套件,前者提供語法提示,後者自動排版。VS Code 內建終端機很方便,不用額外切換視窗就能執行腳本。雖然也能用 Google Colab 或 Jupyter Notebook,但建議在本機開發,把技能學進腦袋,不要被特定工具綁架。
206 - 註解
03 : 16
介紹程式碼中的註解功能。註解是用井字號開頭的說明文字,目的是解釋程式碼的用途,例如說明 9.8 代表重力加速度。適當加註解能幫助同事或未來的自己理解程式碼的意圖。註解不會被程式執行,所以也常用來暫時停用某段程式碼,方便測試不同情況。在 VS Code 中,可用快捷鍵 Ctrl 或 Command 加斜線快速切換註解,還能一次選取多行批次處理,非常實用。學會這些小技巧能讓開發過程更順暢,也展現你對工具的熟練度。
207 - Python 附檔名
03 : 00
檔案副檔名其實只是用來標記的,告訴作業系統這是什麼類型的檔案。Python 程式不一定要存成 .py,改成 .js、.php 甚至 .jpg 都能正常執行,因為本質上它就是個文字檔,Python 直譯器只在乎檔案內容,不在乎副檔名叫什麼。副檔名的主要用途是讓作業系統知道雙擊時該用什麼程式開啟,像 .doc 會開 Word、.xls 會開 Excel。不過實務上還是建議用 .py,因為 VS Code 等編輯器會根據副檔名提供正確的語法高亮顯示,改成其他副檔名反而會造成困擾。
208 - Python 之禪
01 : 55
在 Python 的 REPL 環境中輸入 import this,會顯示一段由核心開發者 Tim Peters 所寫的文字,稱為「Python 之禪」(Zen of Python)。這段文字列出了撰寫 Python 程式碼的原則,包括:優美優於醜陋、可讀性很重要、簡單優於複雜等。這些原則是寫 Python 時應該放在心裡的指引,遵循這些方向就能寫出更優美、簡潔、明瞭的程式碼。雖然初學階段可能還感受不到這些原則的好處,但寫個半年、一年之後,就會慢慢體會為什麼大家這麼喜歡 Python 這個程式語言。
209 - 安裝套件
08 : 31
介紹 Python 套件的安裝方式。Python 本身功能有限,大多需要依賴第三方套件。現在透過 PyPI 網站可以找到各種套件,類似 JavaScript 的 NPM 或 Ruby 的 RubyGems。安裝套件只需執行 pip install 加上套件名稱即可,pip 會自動處理相依套件的下載與安裝,比早期手動下載解壓縮方便許多。用 pip list 可查看已安裝的套件。不過 pip 有個問題:uninstall 時只會移除指定套件,不會連帶移除相依套件,導致殘留檔案。這雖然造成空間浪費,但更大的問題與接下來要談的虛擬環境有關。
210 - 虛擬環境 venv
17 : 28
介紹 Python 虛擬環境 venv 的用途與操作方式。pip 安裝套件時,同一環境只能存在一個版本,安裝新版會自動移除舊版,造成不同專案間的版本衝突。venv 是 Python 3.3 後內建的模組,可為每個專案建立獨立環境,透過 python -m venv 環境名稱 建立,再用 source 啟動。啟動後安裝的套件只存在該環境中,不影響其他專案。Mac 與 Windows 的啟動指令略有不同。另外說明 pyenv 管理 Python 版本,venv 管理套件版本,兩者層級不同。最後介紹 pip freeze 可輸出套件清單至 requirements.txt,方便部署時用 pip install -r 批次安裝。
211 - 套件管理工具 Poetry part 1
15 : 21
介紹 Poetry 這個 Python 套件管理工具。venv 的缺點是移除套件時,相依的延伸套件不會一併移除,雖然只是浪費空間,但用起來不太舒服。Poetry 的角色類似前端的 NPM,功能更完整。安裝時建議用 pipx 來安裝,讓 Poetry 成為全域工具,不會跟虛擬環境混在一起。使用 poetry new 或 poetry init 可以建立專案,會產生 pyproject.toml 設定檔。透過 poetry add 安裝套件、poetry remove 移除套件時,相依套件會一併處理。Poetry 還會產生 lock 檔確保版本一致,也支援用 --group 參數將開發用套件分組管理。
212 - 套件管理工具 Poetry part 2
18 : 00
介紹 Poetry 套件管理工具的虛擬環境設定。Poetry 預設會把虛擬環境放在系統目錄,不像 venv 放在專案資料夾內,想查看位置可用 poetry env info 指令。我習慣修改設定讓虛擬環境建在專案內,方便管理和刪除,只要執行 poetry config virtualenvs.in-project true 即可。另外說明語意化版本的概念:主版號代表大改版、次版號代表新功能、修訂版號代表小修正。pyproject.toml 中的版本符號也很重要,波浪符號只升級修訂版,插入符號會升級次版號,等於等於則鎖定版本。建議不要太保守,以免錯過安全性更新。
00 : 48 : 55
301 - 變數與常數
16 : 36
介紹 Python 變數的基本概念與使用方式。變數就像標籤或名牌,用來標記電腦記憶體中的資料,方便後續存取。在 Python 中宣告變數非常簡單,不需要像其他程式語言那樣先宣告型別,直接寫 a = 1450 即可。示範如何使用 print() 印出變數值,並說明變數名稱與字串的差異。Python 支援多重指定,可一次宣告多個變數如 x, y, z = 1, 2, 3,若有不需要的值可用底線 _ 代替。變數的值可隨時更改,但存取不存在的變數會出現 not defined 錯誤。最後提到 Python 沒有常數設計,慣例上用全大寫命名表示不應修改的值。
302 - 變數命名規則
07 : 13
303 - 命名慣例
04 : 53
304 - 程式碼可讀性
03 : 07
305 - 《練習》變數交換
04 : 04
306 - 刪除變數
01 : 54
307 - 使用者輸入
03 : 34
308 - 宣告型別?
07 : 34
02 : 42 : 35
401 - 整數與浮點數
03 : 13
402 - 數字四則運算
07 : 19
403 - 四捨五入
09 : 29
404 - 其它數學運算
06 : 28
405 - a = a + 1
05 : 12
406 - 科學記號表示法
08 : 47
407 - 位元運算
04 : 55
408 - 不是數字的 NaN
07 : 24
409 - 無限大
08 : 45
410 - 字串與跳脫符號
08 : 52
411 - 多行文字
04 : 11
412 - 字串型別轉換
04 : 50
413 - 字串與數字
07 : 59
414 - 好用的 F 字串
13 : 14
415 - 字串的索引值
04 : 20
416 - 字串是不可變更的
02 : 30
417 - 為什麼索引值從 0 開始算?
04 : 54
418 - 字串切片
03 : 27
419 - 切片省略部份欄位
12 : 14
420 - 常用的字串方法
15 : 24
421 - Unicode 與 UTF-8
05 : 43
422 - 字串與位元組
13 : 25
01 : 32 : 50
501 - 布林值
05 : 50
502 - 真的值、假的值
02 : 49
503 - 布林值是一種數字
03 : 27
504 - 邏輯運算 Not, And, Or
02 : 31
505 - 邏輯短路
03 : 56
506 - 位元運算
03 : 25
507 - if 流程控制
09 : 23
508 - 什麼也不做的 pass
01 : 40
509 - if 與 else
02 : 54
510 - 《練習》閏年判斷
07 : 55
511 - 剪刀、石頭、布!
11 : 14
512 - switch 語法?
01 : 45
513 - 三元運算子
03 : 53
514 - match
04 : 58
515 - pattern matching
11 : 04
516 - 虛無飄渺的 None
02 : 32
517 - == 與 is
03 : 54
518 - String Interning 機制
07 : 04
519 - 你是不是 None?
02 : 36
01 : 07 : 03
601 - for 迴圈
06 : 52
602 - 範圍 range
04 : 14
603 - 迭代 iteration
02 : 00
604 - for 迴圈的變數範圍
03 : 34
605 - 列舉 enumerate
07 : 28
606 -《練習》九九乘法表
04 : 45
607 -《練習》聖誕樹
08 : 52
608 - 迴圈也有 else?
07 : 14
609 - while 迴圈
06 : 01
610 -《練習》猜數字
07 : 00
611 - 迴圈的流程控制
07 : 12
612 - for 迴圈還是 while 迴圈
01 : 51
01 : 30 : 53
701 - 關於串列
04 : 43
702 - 串列常見操作
06 : 49
703 - 元素是否存在?
05 : 54
704 - 新增、移除元素
09 : 45
705 - 排序、反轉、合併
13 : 47
706 - 可迭代物件
06 : 15
707 - 同一個串列?
05 : 34
708 - 切片
02 : 22
709 - 串列推導式
07 : 06
710 - 小心!巢狀物件的坑
04 : 41
711 - 加上條件判斷
03 : 15
712 - 多層串列推導式
03 : 16
713 - 串列開箱!
08 : 32
714 - 開箱運算子
04 : 05
715 - 《冷知識》Python 的陣列
04 : 49
01 : 02 : 26
801 - 建立字典
07 : 04
802 - 取用字典
06 : 12
803 - 字典沒有順序?
02 : 19
804 - 新增、更新字典
02 : 40
805 - 有這個 Key 嗎?
02 : 33
806 - Key 的限制?
02 : 56
807 - 為什麼叫字典?
02 : 57
808 - 字典常見操作
07 : 07
809 - 合併字典
04 : 28
810 - 複製字典
03 : 18
811 - 印出所有 Key 跟 Value
06 : 47
812 - 字典推導式
04 : 49
813 - 什麼是「雜湊」?
09 : 16
00 : 56 : 43
901 - 建立 Tuple
07 : 54
902 - Tuple 常見操作
05 : 36
903 - 複製 Tuple
04 : 12
904 - 空的 Tuple?
04 : 45
905 - Tuple 的效能
03 : 56
906 - Tuple 推導式?
04 : 42
907 - 集合
05 : 43
908 - 集合常見操作
06 : 58
909 - 交集、聯集、差集
04 : 21
910 - 嚴格子集
03 : 25
911 - 集合推導式
03 : 04
912 - 冷凍集合
02 : 07
02 : 22 : 04
1001 - 什麼是函數?
06 : 30
1002 - 定義函數
05 : 50
1003 - pass
03 : 29
1004 - 參數
07 : 15
1005 - 執行還是呼叫?
01 : 24
1006 - 關鍵字引數
07 : 37
1007 - 位置引數與關鍵字引數
08 : 05
1008 - 參數預設值
04 : 43
1009 - 參數預設值的坑!
08 : 00
1010 - 不定數量參數之位置引數
08 : 10
1011 - 不定數量參數之關鍵字引數
03 : 41
1012 - 引數開箱
04 : 40
1013 - Docstring
05 : 36
1014 - 回傳值
07 : 41
1015 - Early Return
06 : 39
1016 - 所有函數都有回傳值?
02 : 55
1017 - 函數是一等公民
07 : 12
1018 - 作用域 LEGB 之 LEG
09 : 49
1019 - 作用域 LEGB 之 B
06 : 50
1020 - a = a + 1
10 : 42
1021 - global 與 nonlocal
10 : 55
1022 - 函數 vs 方法
04 : 21
01 : 53 : 11
1101 - 表達式 vs 陣述句
09 : 34
1102 - Lambda 表達式
06 : 09
1103 - Lambda 表達式的限制與使用
10 : 23
1104 - Closure 之自由變數
07 : 14
1105 - Closure 之變數帶著走
04 : 54
1106 - Closure 之運作原理
07 : 54
1107 - Closure 之應用
03 : 56
1108 - 函數裝飾器
08 : 34
1109 - 函數裝飾器的語法糖
02 : 01
1110 - 函數裝飾器之原本的參數?
05 : 56
1111 - 帶有參數的裝飾器
10 : 52
1112 - 遞迴
05 : 01
1113 - 遞迴之費氏數列
08 : 40
1114 - 遞迴的效能?
03 : 37
1115 - 產生器
11 : 29
1116 - 偏函數與柯里化
06 : 57
00 : 24 : 35
1201 - 錯誤的種類
05 : 40
1202 - 錯誤 vs 例外
04 : 37
1203 - 製作自己的錯誤類別
02 : 51
1204 - 錯誤處理
06 : 52
1205 - 錯誤處理之 finally 與 else
04 : 35
01 : 20 : 29
1302 - 虛擬環境之模組搜尋路徑
02 : 15
1301 - 模組與套件
05 : 35
1303 - 建立、匯入模組
10 : 13
1304 - 只匯入部份功能
04 : 58
1305 - 重複匯入模組?
06 : 05
1306 - 匯入模組的位置
02 : 17
1307 - 匯入同名函數
05 : 33
1308 - 同名模組
05 : 34
1309 - 能有點隱私嗎?
03 : 14
1310 - 被匯入 vs 直接執行
05 : 52
1311 - 套件與模組的差異
08 : 45
1312 - __init__.py 的用途
05 : 26
1313 - 《冷知識》不同的套件
09 : 13
1314 - 《冷知識》壓縮檔也可以
05 : 29
02 : 45 : 18
1401 - 什麼是物件?
04 : 00
1402 - 建立物件
10 : 08
1403 - 初始化
11 : 47
1404 - 建構子?
04 : 37
1405 - 實體變數
03 : 40
1406 - 實體方法
06 : 54
1407 - 類別變數
06 : 03
1408 - 存取類別變數
13 : 48
1409 - Getter 與 Setter
08 : 56
1410 - 屬性裝飾器
10 : 35
1411 - 私有屬性?
05 : 11
1412 - 限定屬性存取之 Slots
10 : 57
1413 - 類別方法
10 : 04
1414 - 靜態方法
05 : 53
1415 - 繼承
12 : 11
1416 - 沒寫就沒有繼承嗎?
07 : 16
1417 - 方法覆寫與 super
11 : 19
1418 - 你是我的後代嗎?
09 : 39
1419 - 多重繼承
03 : 39
1420 - 多重繼承之鑽石問題
08 : 41
02 : 06 : 04
1501 - 描述器
10 : 27
1502 - 資料描述器
09 : 56
1503 - 資料描述器可以幹嘛
06 : 30
1504 - 所以,值要存在哪裡?part 1
10 : 01
1505 - 所以,值要存在哪裡?part 2
05 : 19
1506 - 刪除屬性
04 : 08
1507 - 函數與方法
14 : 48
1508 - slots 其實也是描述器
06 : 05
1509 - Meta Class
09 : 39
1510 - 建立 Classs 的原始碼
05 : 29
1511 - 建構子?
08 : 25
1512 - 魔術方法
03 : 33
1513 - 魔術方法之物件看起來的樣子
11 : 56
1514 - 迭代器
11 : 46
1515 - 可迭代物件
08 : 02
00 : 28 : 23
1601 - 讀取檔案
09 : 19
1602 - 游標的位置
02 : 34
1603 - 用完記得關!
02 : 57
1604 - with 關鍵字
04 : 40
1605 - 寫入檔案
08 : 53
00 : 50 : 27
1701 - 讀取 CSV 檔案
06 : 51
1702 - 設定方言(Dialect)
07 : 27
1703 - 寫入 CSV 檔案
05 : 07
1704 - 台積電股價 K 線圖 part 1
10 : 52
1705 - 台積電股價 K 線圖 part 2
09 : 44
1706 - 台積電股價 K 線圖 part 3
10 : 26
01 : 03 : 10
1801 - 什麼是 API?
05 : 08
1802 - 抓取書局銷售排行資料 part 1
06 : 35
1803 - 抓取書局銷售排行資料 part 2
11 : 48
1804 - 從 API 抓取地震資料 part 1
04 : 48
1805 - 從 API 抓取地震資料 part 2
09 : 23
1806 - 從 API 抓取地震資料 part 3
09 : 10
1807 - 從氣象署網頁抓資料 part 1
07 : 52
1808 - 從氣象署網頁抓資料 part 2
08 : 26
00 : 29 : 46
1901 - 使用 Pdb 偵錯器
07 : 34
1902 - 執行程式
09 : 03
1903 - 動態設定中斷點
05 : 37
1904 - 誰呼叫了這個函數?
02 : 58
1905 - Pdb 常用指令整理
04 : 34