Python - 高階函式



Python 中的高階函式允許你操作函式,以提高程式碼的靈活性和可重用性。你可以使用巢狀作用域或可呼叫物件來建立高階函式。

此外,functools 模組提供了用於處理高階函式的實用程式,使建立裝飾器和其他函式操作結構更加容易。本教程將探討 Python 中高階函式的概念,並演示如何建立它們。

什麼是高階函式?

高階函式是一個函式,它要麼接受一個或多個函式作為引數,要麼返回一個函式作為結果。下面你可以觀察 Python 中高階函式的一些特性:

  • 函式可以儲存在變數中。
  • 函式可以作為引數傳遞給另一個函式。
  • 高階函式可以以列表、雜湊表等形式儲存。
  • 函式可以從函式中返回。

要在 Python 中建立高階函式,可以使用巢狀作用域或可呼叫物件。下面我們將簡要討論它們。

使用巢狀作用域建立高階函式

在 Python 中定義高階函式的一種方法是使用巢狀作用域。這涉及在另一個函式中定義一個函式並返回內部函式。

示例

讓我們觀察以下在 Python 中建立高階函式的示例。在這個例子中,`multiplier` 函式接受一個引數 a,並返回另一個函式 `multiply`,它計算 a * b 的值。

def multiplier(a):  
   # Nested function with second number   
   def multiply(b):
      # Multiplication of two numbers  
      return a * b 
   return multiply   

# Assigning nested multiply function to a variable  
multiply_second_number = multiplier(5)  
# Using variable as high order function  
Result = multiply_second_number(10)  
# Printing result  
print("Multiplication of Two numbers is: ", Result) 

輸出

執行上述程式後,你將得到以下結果:

Multiplication of Two numbers is:  50

使用可呼叫物件建立高階函式

建立高階函式的另一種方法是使用可呼叫物件。這涉及定義一個具有 `__call__` 方法的類。

示例

這是另一種使用可呼叫物件建立高階函式的方法。

class Multiplier:
   def __init__(self, factor):
      self.factor = factor

   def __call__(self, x):
      return self.factor * x
 
# Create an instance of the Multiplier class
multiply_second_number = Multiplier(2) 

# Call the  Multiplier object to computes factor * x
Result = multiply_second_number(100)  

# Printing result  
print("Multiplication of Two numbers is: ", Result) 

輸出

執行上述程式後,你將得到以下結果:

Multiplication of Two numbers is:  200

使用 'functools' 模組的高階函式

functools 模組提供作用於或返回其他函式的高階函式。任何可呼叫物件都可以被視為此模組中的函式。

使用 wraps() 處理高階函式

在這個例子中,`my_decorator` 是一個高階函式,它使用 `functools.wraps()` 函式修改 `invite` 函式的行為。

import functools

def my_decorator(f):
   @functools.wraps(f)
   def wrapper(*args, **kwargs):
      print("Calling", f.__name__)
      return f(*args, **kwargs)
   return wrapper

@my_decorator
def invite(name):
   print(f"Welcome to, {name}!")

invite("Tutorialspoint")

輸出

執行上述程式後,你將得到以下結果:

Calling invite
Welcome to, Tutorialspoint!

使用 partial() 處理高階函式

functools 模組的 `partial()` 函式用於建立一個可呼叫的“部分”物件。該物件本身的行為類似於函式。`partial()` 函式接收另一個函式作為引數,並凍結函式引數的一部分,從而產生一個具有簡化簽名的新的物件。

示例

在下面的例子中,一個使用者自定義函式myfunction()作為引數傳遞給一個偏函式,透過設定原始函式的一個引數的預設值來實現。

import functools
def myfunction(a,b):
   return a*b

partfunction = functools.partial(myfunction,b = 10)
print(partfunction(10))

輸出

執行上述程式後,你將得到以下結果:

100

使用reduce()函式操作高階函式

與上述方法類似,functools模組提供了reduce()函式,它接收兩個引數:一個函式和一個可迭代物件。它返回一個單一的值。該函式引數會累積地應用於列表中的兩個引數,從左到右。函式第一次呼叫的結果成為第一個引數,列表中的第三個項成為第二個引數。這個過程會重複,直到列表被遍歷完。

示例

import functools
def mult(x,y):
   return x*y

# Define a number to calculate factorial
n = 4
num = functools.reduce(mult, range(1, n+1))
print (f'Factorial of {n}: ',num)

輸出

執行上述程式後,你將得到以下結果:

Factorial of 4:  24
廣告