如何将 Python 函数作为函数参数传递?

pythonserver side programmingprogramming

在 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 操作。add 和 multiply 函数以两个数字作为参数,并分别返回它们的和与乘积。apply 操作函数以函数 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 函数来检查每个数字是否为偶数。生成的偶数列表仅包含原始列表中的偶数。

示例

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

输出

[2, 4]

将函数作为参数传递给 sorted()

内置的 sorted() 函数使用比较函数对元素列表进行排序。您可以将任何函数作为关键参数传递给 sorted(),只要它接受一个参数并返回一个可比较的值即可。

在此示例中,我们定义了一个名为 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 的一项强大功能,它允许您编写可使用不同函数进行自定义的高阶函数。这可以使您的代码更加灵活和可重用,并可以为您节省大量时间和精力。通过使用高阶函数和函数式编程技术,您可以编写更干净、更简洁、更易于维护的代码。


相关文章