如何將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+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告