哥布林學 Python 物件導向 (OOP)

物件導向 (OOP) 是一種程式設計的規範 (paradigm),遵循之後有助於寫出更容易管理、容易維護,且容易閱讀的程式碼。而 Python 本身借鏡了許多 OOP 的概念,雖然沒有像 Java 那樣嚴格,但諸如 flask、Pygame 等等熱門框架也以 OOP 為主旋律,多去了解絕對不吃虧。 一切都由物件組成 OOP 的核心概念其實很簡單,那就是將我們日常生活中的人事物「建模」成一個一個又一個的物件,而每個物件當中會包含: 屬性 (attribute):類似於字典 (dictionary) 的 key-value 資料 方法 (method):函式,沒錯,就是函式 舉個例子,假設我們用一個物件來代表「人」這個概念,那該物件裡面可能會有以下屬性: 姓名 年齡 住址 興趣 職業 除此之外,該物件也會包含人的行為,這些行為便是所謂的方法,所以物件將包含以下函式: 走路 跑步 吃飯 嗚啦 先有藍圖,才有物件 想像你是全知全能的天神,某日心血來潮想為世界增添趣味,於是決定創造名為哥布林的生物,讓他們自生自滅繁衍生息。你給自己泡了杯咖啡,創造了一隻、兩隻、三隻哥布林,漸漸發現如此單調重複的工作 超 . 級 . 無 . 聊,於是靈機一動,先打造了一套哥布林模型,注入神力讓模型依照既定規則自動生成哥布林…… 這基本上就是我們建立物件的方式。Python 透過 class 關鍵字讓我們先產出物件的藍圖,後續依循藍圖去建立單一物件。所以物件的屬性、方法都要在 class 當中先定義好。 class Goblin: health = 5 damage = 3 Xavier = Goblin() print(Xavier.health) # 5 可以注意到若要從物件中提取屬性值,語法為 <object_name>.<attribute>。 相較於 class 是物件的藍圖,我們依據藍圖所生成的物件則是 instance,實體。真實的資料會包裹在實體中。 為物件增添函式 - method 前面提過綁定在 class 當中的函式被稱之為方法。方法和一般函式最大的差異,在於它能夠直接存取該物件的屬性。 ...

二月 16, 2025

迴圈 - 以 Python 為例

為什麼要有迴圈? 原因只有一個,那就是人類很懶,假設今天要輸出 100 萬筆資料,我們需要一筆一筆手刻出來嗎?在被主管開除之前,我們應該會先無聊到開始裸奔吧。 這個時候善用迴圈,用一組程式碼就能搞定大量的重複工作: for i in range(0, 1_000_000): print(i) 拆解 for 迴圈運作流程 上面以 for 關鍵字起頭的迴圈被稱為 for 迴圈,除了 Python 之外,Golang、JavaScript 等等眾多程式語言也都有類似的語法。本篇文章就以 Python 為例,拆解 for 迴圈的運作流程。 迴圈從 i 等於 0 啟動 -> i in range(0) 檢查若 i 不少於 1,000,000 就跳出迴圈運作 -> range(0, 1_000_000),否則繼續執行以下動作: 列印出 i 變數 -> print(i) i 變數值加一 (range 預設會加一) 回到第二步驟檢查 i 是否不少於 1,000,000 最後我們會看到 0 ~ 999,999 列印出來。 在 Python 中,range(a, b) 會包含 a 但不包含 b。所以 range(0, 1_000_000) 才不會列印出 1,000,000。 ...

一月 18, 2025

作用域 - 以 Python 為例

什麼是作用域? 作用域 (Scope) 是指變數或函示名稱可以被使用的範圍。我自己是想像成結界,外面的世界無法接觸、取用到結界內的萬事萬物。 舉例來說,當我們在函式中建立一個變數,包含給函示參數,那這些資料就無法在函示的作用域範圍之外使用,會跑出該變數沒有定義的錯誤。 def add(x, y): return x + y result = add(2, 6) print(x) # ERROR! "name 'x' is not defined" 上述範例中,x 和 y 都是 add 函式的參數,因此只能在 add 函式作用域範圍內被使用。我們在作用域之外嘗試列印 x,Python 的編譯器會跳出 x 沒有被定義的錯誤警告。 全域作用域 我們知道函式中所定義的變數和參數,是無法在函式作用域以外被使用的。但如果今天有多個函式都要用同一組變數該怎麼辦呢?我們可以在全域環境中定義變數,這樣每個函式都能夠取用該變數了。 以結界來比喻,我覺得就像結界內的人可以把外面世界的物品拉進去,但外部世界的人無法看透結界內發生什麼事情,自然也就無法取用結界內的物品了。 outside_stuff = "pull me in baby!" def pull_outside_stuff_into_function_scope(target): return outside_stuff + " - success" print(pull_outside_stuff(outside_stuff)) 上述範例中,pull_outside_stuff_into_function_scope 最終會成功回傳 pull me in baby! - success。因為 outside_stuff 變數是在權域作用域 (global scope) 定義的,所以能夠被函式拉到函式作用域當中使用。

一月 15, 2025