如何在 Python 中將函式作為引數傳遞?


在 Python 中,你可以將一個函式作為引數傳遞給另一個函式。這被稱為高階函式。

換句話說,如果一個函式包含其他函式作為引數或返回函式,則該函式被稱為高階函式。Python 作為一種非常通用的程式語言,支援使用高階函式。

Python 中高階函式的一些例子包括 map()、filter()、sorted() 和 reduce()。

例如,map() 函式將一個函式應用於輸入列表中的所有專案,並返回一個包含所有函式呼叫結果的新列表,類似地,其他高階函式具有特定的用例。

在下面給出的示例中,apply_function 函式有兩個引數:一個函式 func 和一個值 x。它將函式 func 應用於值 x 並返回結果。square 函式是單獨定義的,它接收一個數字並返回其平方。

示例

def apply_function(func, x):
   return func(x)
def square(x):
   return x ** 2
result = apply_function(square, 3)
print(result)

輸出

9

將函式作為引數傳遞對於編寫更靈活和可重用的程式碼非常有用。你可以傳入不同的函式以實現不同的行為,而無需為每個行為編寫單獨的函式。

讓我們考慮另一個示例,該示例演示如何在 Python 中將函式作為引數傳遞給另一個函式

在這個例子中,我們有三個函式:add、multiply 和 apply_operation。add 和 multiply 函式接受兩個數字作為引數並分別返回它們的和和積。apply_operation 函式接受一個函式 func 和兩個數字 x 和 y 作為引數。它將函式 func 應用於這兩個數字 x 和 y 並返回結果。

我們兩次呼叫 apply_operation 函式:一次使用 add 函式和數字 3 和 4,一次使用 multiply 函式和相同的數字。第一次呼叫將 add 函式應用於數字 3 和 4,返回 7。第二次呼叫將 multiply 函式應用於相同的數字,返回 12。

在這兩次呼叫中,我們都將 add 和 multiply 函式作為第一個引數傳遞給 apply_operation 函式。這允許我們對不同的操作使用相同的 apply_operation 函式,而無需為每個操作編寫單獨的函式。

示例

def add(x, y):
   return x + y
def multiply(x, y):
   return x * y
def apply_operation(func, x, y):
   return func(x, y)

result = apply_operation(add, 3, 4)
print(result)
result = apply_operation(multiply, 3, 4)
print(result)

輸出

7
12

將函式作為引數傳遞可以使你的程式碼更靈活和可重用。你可以定義一組執行不同操作的函式,並將它們作為引數傳遞給高階函式,該函式將它們應用於輸入資料。這允許你編寫更通用的程式碼,只需更改作為引數傳遞的函式即可適應不同的場景。

這是一個在 Python 中演示如何將函式作為引數傳遞給另一個函式的另一個示例

在這個例子中,我們有兩個函式:filter_list 和 is_even。filter_list 函式接受一個函式 func 和一個列表 lst 作為引數。它將函式 func 應用於列表 lst 中的每個專案,並返回一個新列表,該列表只包含函式返回 True 的專案。is_even 函式接受一個數字作為引數,如果數字是偶數則返回 True,否則返回 False。

我們定義一個數字列表,然後兩次呼叫 filter_list 函式:一次使用 is_even 函式和數字列表,一次使用一個新的函式 is_positive,如果數字為正則返回 True,否則返回 False。第一次呼叫返回一個新列表,其中只包含原始列表中的偶數,而第二次呼叫返回一個新列表,其中包含原始列表中的所有數字(因為它們都是正數)。

透過將函式作為引數傳遞給 filter_list 函式,我們可以使用相同的函式根據不同的條件過濾不同的列表。這允許我們編寫更通用和可重用的程式碼。

示例

def filter_list(func, lst):
   result = []
   for item in lst:
      if func(item):
         result.append(item)
   return result
def is_even(num):
   return num % 2 == 0
def is_positive(num):
   return num > 0
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = filter_list(is_even, numbers)
print(even_numbers)
positive_numbers = filter_list(is_positive, numbers)
print(positive_numbers)

輸出

[2, 4, 6, 8, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10

在 Python 中,函式是一等公民,這意味著你可以將它們作為引數傳遞給其他函式。此功能允許你編寫高階函式,這些函式將其他函式作為引數並使用它們來自定義其行為。

將函式作為引數傳遞給 map()

內建的 map() 函式將函式應用於可迭代物件的每個元素,並返回一個包含結果的新可迭代物件。你可以將任何函式作為 map() 的第一個引數傳遞,只要它接受一個引數。

在這個例子中,我們定義一個名為 square 的函式,它接受一個引數並返回其平方。然後,我們定義一個數字列表,並使用 map() 將 square 函式應用於每個數字。生成的 squares 列表包含原始數字的平方。

示例

def square(x):
   return x * x
numbers = [1, 2, 3, 4, 5]
squares = list(map(square, numbers))
print(squares)

輸出

[1, 4, 9, 16, 25]

將 lambda 函式作為引數傳遞給 filter()

內建的 filter() 函式將函式應用於可迭代物件的每個元素,並返回一個包含透過特定條件的元素的新可迭代物件。你可以將任何函式作為 filter() 的第一個引數傳遞,只要它返回布林值。

在這個例子中,我們定義一個數字列表,並使用 filter() 應用一個 lambda 函式來檢查每個數字是否為偶數。生成的 evens 列表只包含原始列表中的偶數。

示例

numbers = [1, 2, 3, 4, 5]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)

輸出

[2, 4]

將函式作為引數傳遞給 sorted()

內建的 sorted() 函式使用比較函式對元素列表進行排序。你可以將任何函式作為 sorted() 的 key 引數傳遞,只要它接受一個引數並返回可比較的值。

在這個例子中,我們定義一個名為 get_length 的函式,它接受一個單詞並返回其長度。然後,我們定義一個單詞列表,並使用 sorted() 按長度對其進行排序。生成的 sorted_words 列表包含按長度升序排序的單詞。

示例

def get_length(word):
   return len(word)
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']
sorted_words = sorted(words, key=get_length)
print(sorted_words)

輸出

['date', 'apple', 'banana', 'cherry', 'elderberry']

將函式作為引數傳遞是 Python 的一個強大功能,它允許你編寫可以由不同函式自定義的高階函式。這可以使你的程式碼更靈活和可重用,並且可以節省你大量的時間和精力。透過使用高階函式和函數語言程式設計技術,你可以編寫更清晰、更簡潔和更易於維護的程式碼。

更新於:2023年5月2日

24K+ 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告