[12] 函式 Function


Posted by bessyhuang on 2023-07-15

簡介

有些程式語言將函式稱為「 方法 」、「 程序 」或「 副程式 」。

函式的作用?

將一段『 具有某種功能 』或『 重複使用的敘述 』寫成獨立的程式單元,然後給予名稱,供後續呼叫使用,以『 簡化程式、提高可讀性 』。

為何需要學函式?

將程式碼包裝在一個區塊中,方便隨時呼叫使用!

函式的優缺點

  • 優點
    • 可重複使用,程式會變得比較精簡。
    • 可讀性提高,容易偵錯、修改與維護。
  • 缺點
    • 多了一道呼叫的手續,使程式的執行速度減慢。

Python 常見函式分為四種

  1. 內建函式
  2. 自訂函式
  3. 匿名函式 lambda
  4. 遞迴函式 (Recursive function)

全域變數 與 區域變數

💡 指的是 變數的有效生存範圍。

全域變數 (Global Variable)

定義於 函式區塊外 的變數,可作用於整份 Python Script 的範圍

#全域變數
i = 10
def f():
    print(i)

f()           #10
print(i)      #10

區域變數 (Local Variable)

定義於 函式區塊內 的變數,僅能作用於函式區塊內

def a1():
    #區域變數,無法傳到外面
    x = 1
    print(x)

print(x)       #NameError: name 'x' is not defined

內建函式

  • Python 針對常見的用途所提供,但不一定能夠滿足所有需求。
  • e.g. print()input()eval()type()int()join()

自訂函式

  • 若要客製化一些功能,就要自行定義函式。
  • 語法
    • 定義函式
        def functionName([parameters]):
            """
            通常函式的註解會寫在這裡!
            """
            statement
            [return value]
      
    • 呼叫函式
        functionName([parameters])
      

規範

  • 定義(建立)函式 必須置於呼叫(使用)函式之前
  • 函式的名稱「 不能重複 」!
  • 函式的 parameters,可以為 0 個、1 個或多個。
    • 若沒有 parameters, ( ) 仍須保留。
    • 若有多個 parameters,以 , 逗號隔開。parameters 個數及順序均不能弄錯
  • 函式 return 的 value,可以為 0 個、1 個或多個。
    • 沒有 return value,即 此函式 無回傳值 的意思,但其實 隱含了回傳一個 None, 可省略不寫。
    • 若有多個 return value,以 , 逗號隔開。return value 個數及順序均不能弄錯

補充

  • 如果想看到函式的註解,可以使用 print(functionName.__doc__)
  • 假如想暫時空著且不讓執行時出錯,可使用 pass (佔位語句,表示不做任何事,是為了保持程式碼結構的完整性)。

      def functionName([parameters]):
          pass
    
      functionName([parameters])
    

範例:基本版

#定義函式:定義一個印出 Hello 的程式
def sayhello():
    """
    通常函式的註解會寫在這裡!
    """
    print("Hello")

#呼叫函式:呼叫上方定義的函式
sayhello()

#印出函式內的註解
print(sayhello.__doc__)

範例:0 個、1 個或多個函式 parameters

  • parameter:用來傳遞資料給函式。
  • 沒有回傳值 = 沒有 return value,即 此函式 無回傳值 的意思,但其實 隱含了回傳一個 None, 可省略不寫。
  • 若沒有 parameters, ( ) 仍須保留。

      #定義函式 (沒有 parameters, 沒有回傳值)
      def sayhello():
          print("Hello")
    
      #呼叫函式
      sayhello()
    
  • 若有多個 parameters,以 , 逗號隔開。parameters 個數及順序均不能弄錯。

      #定義函式 (有 1 個 parameters, 沒有回傳值)
      def say(msg):
          print(msg)
    
      #呼叫函式
      say("Hello Python")
      say("Hi ~ ")
    
      #定義函式 (有 N 個 parameters, 沒有回傳值)
      def add(n1, n2):
          result = n1 + n2
          print(result)
    
      #呼叫函式
      add(3, 4)
      add(8, 9)
    

範例:0 個、1 個或多個函式 return value

  • return:離開函式,返回呼叫函式的地方。
  • 基本上,Python 的函式都有回傳值。當我們用一個變數來接無回傳值函式的結果時,從執行結果可以看到 Python 隱含回傳了一個 None。
  • 若有多個 return value,以 , 逗號隔開。return value 個數及順序均不能弄錯。

      #定義函式 (有 1 個 回傳值)
      def checkscore(score):
          if score < 0 or score > 100:
              return "分數超過範圍!"
          elif score >= 60:
              return "及格!"
          else:
              return "不及格!"
    
      s = eval(input("請輸入分數:"))
    
      #呼叫函式
      print(checkscore(s))
    
      #定義函式 (有 N 個 回傳值)
      def divmod(x, y):
          div = x // y
          mod = x % y
          return div, mod
    
      #呼叫函式
      a, b = divmod(100, 7)
      print("100除以7的商數為", a, "餘數為", b)
      c, d = divmod(200, 13)
      print("200除以13的商數為", c, "餘數為", d)
    

匿名函式 lambda

lambda arg1, arg2, … : *expression*
lambda 參數 : 運算式
  • 用來建立小的 匿名函式 (沒有名稱的函式)。
  • 注意!lambda 運算式 不能有區塊,所以只能處理簡單的工作
    • 對於 比較複雜的工作,還是要 使用 def 定義函式 才行。
  • lambda 運算式會產生一個 函式物件
    • arg1, arg2, … 相當於函式定義的參數。
    • expression 相當於函式定義的主體 (statements)。

範例

  1. 作為簡單的運算式

     add = lambda x, y : x + y
    
     print(add(1, 2))              #3
     print(add("abc", "de"))       #abcde
    
  2. 當作鍵值索引

     pairs = [(1, "one"), (2, "two"), (3, "three"), (4, "four")]
    
     # 根據 pair[1] 來排序:"one", "two", "three", "four"
     pairs.sort(key=lambda pair: pair[1])                    # 方法一
     new_pairs = sorted(pairs, key=lambda pair: pair[1])     # 方法二
    
     # Output: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
    

遞迴函式 (Recursive function)

  • 遞迴函式:可以不斷地自己呼叫自己本身的函式。
  • 優點:邏輯性、可讀性及彈性均比迴圈來得好。

      n = eval(input("n = "))
    
      def factorial(n):
          if n == 0:
              return 1
          elif n > 0:
              return n * factorial(n - 1)
          else:
              return "錯誤輸入!"
    
      print(n, "! = ", factorial(n))
    
      💡 遞迴函式通常可以被 for 或 while 迴圈取代。
    
      n = eval(input("n = "))
       
      result = 1
      for i in range(1, n + 1):
          result = result * i
    
      print(n, "! = ", result)
    

References

  1. Variable Scope in Python
  2. 函式 function
  3. 補充教材:模組(Module)& 套件/封包(Package)
  4. 補充教材:函式 Function

#Python #function







Related Posts

介紹 Git

介紹 Git

v-model 與.修飾符

v-model 與.修飾符

繞過 phpMyAdmin 建立資料庫與表格

繞過 phpMyAdmin 建立資料庫與表格


Comments