甲居工作室

8. Python 函式 (Function)

日期:2024/04/07

8.Python 函式 (Function)

寫程式碼時有一個非常重要的觀念是 DRY (Don’t repeat yourself),避免重複撰寫程式碼,除了可讀性低,也不容易維護。

8.1 Function

基本語法

  1. def functionName(parameters):
  2. # 函式內的程式碼
  3. # 可以包含任意數量的程式碼行
  4. return value
  • def: 用於定義函式的關鍵字。
  • functionName: 函式的名稱。
  • parameters:接收的參數。
  • return:回傳的內容,不一定要有。
  1. def bmi(height, weight):
  2. return round(weight / (height ** 2))
  3. print(bmi(1.75, 69)) # 23
  4. print(bmi(1.8, 70)) # 22

上例我們撰寫了 BMI 的函式,只需呼叫即可運算無需要再次撰寫想同的內容。

8.2 參數

位置參數

按照位置順序定義的參數,呼叫函式時以位置來相互對應。

  1. def bmi(height, weight):
  2. pass
  • 以位置對應呼叫:bmi(1.8, 70)
  • height = 1.8
  • weight = 70

關鍵字參數

呼叫函式時以名稱指定的參數。

  1. def bmi(height, weight):
  2. pass
  • 以名稱呼叫:bmi(weight=65, height=1.7 )
  • height = 1.7
  • weight = 65

默認參數

已經為參數指定一個默認值。可以選擇是否要傳入。

  1. def bmi(height, weight=80):
  2. pass
  • 呼叫:bmi(1.8)
  • height = 1.8
  • weight = 80
  • 無預設值之參數必須放在有預設值之參數之前

*args 與 **kwargs

  • *args:接收任意數量的位置參數,這些參數將被收集到args元組中並進行處理。
  • **kwargs:接收任意數量的關鍵字參數,這些參數將被收集到kwargs字典中並進行處理。
  1. def exampleFunc(a, b, c=0, *args, **kwargs):
  2. print('位置參數 a:', a)
  3. print('位置參數 b:', b)
  4. print('默認參數 c:', c)
  5. print('*args 參數:', args)
  6. print('**kwargs 參數:', kwargs)
  7. # 測試函式
  8. exampleFunc(1, 2, 3, 4, 5, name='Alice', age=30)
  • 位置參數 a: 1
  • 位置參數 b: 2
  • 默認參數 c: 3
  • *args 參數: (4, 5)
  • **kwargs 參數: {‘name’: ‘Alice’, ‘age’: 30}

總結一下參數傳遞順序:

  1. 位置參數
  2. 關鍵字參數
  3. 默認參數
  4. *args
  5. **kwargs

特殊參數

Python 函式的參數可以通過位置或明確的關鍵字傳遞。為了提高程式的可讀性和效能,我們可以限制參數的傳遞方式。這樣一來,開發者只需查看函式定義,就能夠確定各個參數是按位置、按位置或關鍵字、還是按關鍵字傳遞。這樣可以讓代碼更加清晰易懂,同時也能提高程式的執行效率。

  • /:在/之前的參數只能以位置方式傳遞,而在/之後的參數可以以位置或關鍵字方式傳遞。用於區分位置參數和關鍵字參數。
    1. def func(a, b, /, c, d):
    2. pass
  • *:在*之後的參數只能以關鍵字方式傳遞。這種方式通常用於接收不定數量的參數。
    1. def func(a, b, *, c, d):
    2. pass

8.3 全域變數 區域變數

我們現在有了函式的概念,要來補充說明全域變數 (Global Variables) 和區域變數 (Local Variables) 是在程式中使用的兩種不同範圍的變數。

  • 全域變數:

    • 在程式的整個範圍內都可以使用。
    • 通常在程式的最外層定義,或者使用 global 關鍵字在函數內聲明為全域變數。
    • 可以在程式的任何地方使用,包括函數內部。
  • 區域變數:

    • 只能在其定義的區域 (如函數) 內使用。
    • 在函數內部定義的變數通常是區域變數,它們的作用範圍僅限於該函數內部。
    • 當函數執行完成後,區域變數的內存空間通常會被釋放,因此無法在函數外部訪問。

global

今有下程式:

  1. text = ''
  2. def a(value=None):
  3. if value:
  4. print(value)
  5. text = value
  6. else:
  7. print(text)
  8. a()

是不是會認為 text 是全域變數,然而實際上在這個程式中,text 變數被賦值為空字符串 '',但在函數 a() 中,你嘗試在條件語句中給 text 重新賦值。然而,當你在函數內部給 text 賦值時,Python 將它視為區域變數而不是全域變數。

  1. text = ''
  2. def a(value=None):
  3. global text # 使用 global 關鍵字聲明 text 為全域變數
  4. if value:
  5. print(value)
  6. text = value
  7. else:
  8. print(text) # 正確輸出全域變數的值
  9. a()

相關函式

函式
globals()以字典形式回傳全域變數
locals()以字典形式回傳區域變數

延伸閱讀

9.Python 模組 (Module)

經過前幾章的教學想必你對基礎語法有觀念了吧? 第一章節曾提及『豐富且完整的套件,不必製造輪子及可以快速組裝你所需要的功能。』所說的就是模組 (Module)

Read more

10.Python 例外 (Exception)

想必到目前為止應該看過許多的錯誤 (Error)訊息。然後就 88 了。此章節主要說明如何處理錯誤狀況,以防程式出錯而導致無法運行甚至發生其他狀況,如檔案毀損。

Read more