Python 简明教程
Python - Higher Order Functions
Python 中的高阶函数允许你操作函数,以提高代码的灵活性和可重用性。你可以使用嵌套范围或可调用对象来创建高阶函数。
此外, functools 模块提供了与高阶函数一起使用的实用程序,使其更容易创建装饰器和其他函数操作构造。本教程将探讨 Python 中高阶函数的概念,并演示如何创建它们。
What is a Higher-Order Function?
高阶函数是一种函数,它或者将一个或多个函数作为参数,或者将函数作为其结果返回。下面你可以观察到 Python 中高阶函数的一些属性: −
-
一个函数可以存储在一个变量中。
-
一个函数可以作为参数传递给另一个函数。
-
高阶函数可以以列表、哈希表等的格式存储。
-
函数可以从函数返回。
要使用 Python 创建高阶函数,你可以使用嵌套范围或可调用对象。下面我们将简要讨论它们。
Creating Higher Order Function with Nested Scopes
在 Python 中定义高阶函数的一种方法是使用嵌套范围。这涉及在另一个函数内定义一个函数并返回内层函数。
Example
我们观察一下以下创建 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)
Output
通过执行以上的程序,你会得到以下结果:
Multiplication of Two numbers is: 50
Creating Higher-Order Functions with Callable Objects
创建高阶函数的另一种方法是使用可调用对象。这涉及定义一个具有 call 方法的类。
Example
以下是创建高阶函数的另一种方法,即使用可调用对象。
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)
Output
通过执行以上的程序,你会得到以下结果:
Multiplication of Two numbers is: 200
Higher-order functions with the 'functools' Module
functools 模块提供对其他函数执行操作或返回其他函数的高阶函数。任何可调用对象都可以视为本模块的一个函数。
Working with Higher-order functions using the 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")
Output
通过执行以上的程序,你会得到以下结果:
Calling invite
Welcome to, Tutorialspoint!
Working with Higher-order functions using the partial()
functools 模块的 partial() 函数用于创建一个可调用的“部分”对象。这个对象本身的行为像一个函数。 partial() 函数接收另一个函数作为参数,并冻结函数部分参数,从而产生一个具有简化签名的新对象。
Example
在下面的示例中,用户定义的函数 myfunction() 用作部分函数的参数,方法是在原始函数的参数之一上设置默认值。
import functools
def myfunction(a,b):
return a*b
partfunction = functools.partial(myfunction,b = 10)
print(partfunction(10))
Output
通过执行以上的程序,你会得到以下结果:
100
Working with Higher-order functions using the reduce()
与上述方法类似, functools 模块提供了 reduce() 函数,该函数接收两个参数,即函数和可迭代对象。并且,它返回一个单一的值。参数函数累积应用于列表中的两个参数,从左到右。函数在第一次调用中的结果成为第一个参数,列表中的第三个项成为第二个参数。如此重复,直至用完列表中项。
Example
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)
Output
通过执行以上的程序,你会得到以下结果:
Factorial of 4: 24