Python - 高阶函数



Python 中的高阶函数允许您操作函数以提高代码的灵活性和可重用性。您可以使用嵌套范围或可调用对象创建高阶函数。

此外,functools 模块提供了用于处理高阶函数的实用程序,从而可以更轻松地创建装饰器和其他函数操作结构。本教程将探讨 Python 中高阶函数的概念,并演示如何创建它们。

什么是高阶函数?

高阶函数是将一个或多个函数作为参数或返回函数作为其结果的函数。下面你可以观察 Python 中高阶函数的一些属性 -

  • 函数可以存储在变量中。
  • 一个函数可以作为参数传递给另一个函数。
  • A 高阶函数可以以列表、哈希表等形式存储。
  • 函数可以从函数返回。

要在 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("qikepu")

输出

在执行上述程序时,您将获得以下结果 -

Calling invite
Welcome to, qikepu!

使用 partial() 处理高阶函数

functools 模块的 partial() 函数用于创建可调用的 '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() 函数,该函数接收两个参数,一个函数和一个可迭代对象。而且,它返回单个值。argument 函数从左到右累积应用列表中的两个参数。第一次调用中的函数结果成为第一个参数,列表中的第三项成为第二个参数。重复此操作,直到列表用尽。


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