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
广告