嗨,各位程式碼冒險家!前一天我們深入探討了 While Loop (迴圈),它讓程式碼能夠依據條件重複執行,為遊戲邏輯增添了更多彈性。今天,我們要學習一個讓程式碼變得更整潔、更有效率的工具:Function (函式)。想像函式是一個「工具箱」,它可以把我們的程式碼拆分成幾個容易管理的「群組」,等到需要用到的時候再把它們「叫出來」執行特定任務。這種模組化的方式,對於我們《奇幻卡牌競技場》這樣日益複雜的遊戲專案來說,是不可或缺的基石。
Python 零基礎新手入門 #07 Function (函式):
https://www.youtube.com/watch?v=74Qt9Qdl3Hs&list=TLGGCpsW2odTHKAxMDA5MjAyNQ
在 Python 中,建立函式非常簡單。我們使用 def (define 的縮寫) 關鍵字來定義函式,後面接著函式的名稱,例如「打招呼」,然後是一組圓括號和冒號。如果使用英文命名,函式名稱規則與變數相似,通常是小寫英文字母和底線的組合。
def 打招呼():
print("哈囉,大家好!")
函式定義好後,如果直接執行程式碼,你會發現 Python 不會回傳任何結果。這是因為函式就像電玩遊戲中的召喚獸,你必須「召喚」它,它才會出現。要在 Python 中呼叫函式,我們只要輸入它的名稱,後面再加上相同的圓括號即可。
打招呼() # 呼叫函式
# 輸出:哈囉,大家好!
函式名稱後面的圓括號,主要用途是讓我們可以傳遞資訊給函式,這些資訊被稱為 Arguments (引數)。函式在處理這些引數後,可以回傳一些有用的資訊,就像廚師將食材放進鍋子裡,然後鍋子把食材變成一道好吃的料理。我們可以自由決定函式要接收什麼樣的「材料」。例如,我們可以開放「姓名」這個引數:
def 打招呼(姓名): # 函式接收一個引數:姓名
print("哈囉," + 姓名 + "!")
打招呼("小明") # 呼叫函式時傳遞資訊
# 輸出:哈囉,小明!
函式可以擁有不只一個引數,只要用「逗號」將不同的引數隔開即可。呼叫函式時,我們也必須依據引數的數量提供相對應的資料,如果資料少輸入一筆,或是多了一筆,Python 都會回傳錯誤訊息。引數的前後順序也不能顛倒。此外,我們也可以改用關鍵字的方式來輸入引數,這樣即使順序不同,Python 還是能產生正確結果。這種方式也適用於需要計算的函式。
當函式進行計算時,如果我們需要函式回傳計算的結果給我們,就必須在公式前方加上一個 return (回傳) 語法。否則計算結果只會留在函式內部,外部無法取得。
def 計算商品總金額(商品金額, 折扣, 運費):
return (商品金額 * 折扣) + 運費 # 使用 return 回傳計算結果
# return 後的程式碼會被忽略
# print("這行不會被執行")
總金額 = 計算商品總金額(1000, 0.9, 50)
print(總金額) # 輸出:950.0
需要注意的是,return 這個關鍵字通常會放在函式的最後一行,因為函式在執行 return 後就會立即終止,後面的程式碼都會被 Python 忽略。函式引數也可以設定「預設值」,例如運費通常是 50 元,這樣呼叫時即使不填寫運費,函式也會自動計算。
在 Python 中,變數的作用範圍分為「全域」和「區域」。全域變數一旦建立,位於任何位置的程式碼都可以使用它。但如果一個變數是建立在函式之內,它就會被視為區域變數,只能在該函式內使用。函式外的語法在引用區域變數時會產生錯誤。不過,在區域變數名稱前加上 global 關鍵字,可以讓區域變數「升級」,產生「全域」的影響力。
讓我們將今天所學的函式應用到一個簡易計算機中。這個計算機可以讓使用者對兩個數字進行加減乘除的運算。
def add(num1, num2):
return num1 + num2
def subtract(num1, num2):
return num1 - num2
def multiply(num1, num2):
return num1 * num2
def divide(num1, num2):
# 除法可以回傳商數和餘數
if num2 == 0:
return "錯誤: 除數不能為零"
商數 = num1 // num2 # 整數除法
餘數 = num1 % num2 # 餘數
return (商數, 餘數) # 回傳 tuple
# 結合 While Loop 實現連續計算
while True:
print("\n請選擇運算類型:")
print("1. 加法")
print("2. 減法")
print("3. 乘法")
print("4. 除法")
print("5. 結束")
choice = input("輸入您的選擇 (1-5):")
if choice == '5':
print("計算機已關閉。")
break # 結束迴圈
if choice in ['1', '2', '3', '4']:
try:
num1 = float(input("輸入第一個數字:"))
num2 = float(input("輸入第二個數字:"))
if choice == '1':
result = add(num1, num2)
print(f"結果: {result}")
elif choice == '2':
result = subtract(num1, num2)
print(f"結果: {result}")
elif choice == '3':
result = multiply(num1, num2)
print(f"結果: {result}")
elif choice == '4':
result = divide(num1, num2)
if isinstance(result, tuple): # 檢查是否回傳 tuple
商數, 餘數 = result
if 餘數 == 0: # 可整除
print(f"結果: 商數 {商數}")
else: # 不可整除
print(f"結果: 商數 {商數}, 餘數 {餘數}")
else:
print(f"結果: {result}") # 處理除零錯誤訊息
except ValueError:
print("無效輸入,請輸入數字。")
else:
print("無效選擇,請重新輸入。")
這個計算機範例展示了函式如何讓我們將不同運算邏輯模組化,每個函式負責一項單一的任務,大大提高了程式碼的可讀性和可重用性。同時,它也巧妙地結合了 While Loop 實現連續計算,以及 If 條件判斷來處理不同的運算類型和特殊情況(如除零、整除/非整除)。
恭喜您!今天我們深入學習了 Python 的函式,理解了如何定義、呼叫函式,並透過引數傳遞資訊,使用 return 回傳結果。我們也區分了全域與區域變數的概念,並學會了如何應用 global 關鍵字。最後,透過一個實用的計算機專案,我們見證了函式在組織程式碼、實現複雜邏輯方面的強大能力。掌握函式是邁向更進階程式設計的關鍵一步,因為它讓我們的程式碼更具結構性。明天,我們將介紹另一種重要的資料結構:字典 (Dictionaries),敬請期待!