如何在 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 的一個強大功能,它允許你編寫可以由不同函式自定義的高階函式。這可以使你的程式碼更靈活和可重用,並且可以節省你大量的時間和精力。透過使用高階函式和函數語言程式設計技術,你可以編寫更清晰、更簡潔和更易於維護的程式碼。