【Python入门教程】第61篇 函数进阶之偏函数
2022/2/23 20:23:51
本文主要是介绍【Python入门教程】第61篇 函数进阶之偏函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本篇我们介绍偏函数(partial function)的概念,以及如何利用 functools 模块中的 partial 函数定义偏函数。
偏函数的概念
以下示例定义了一个乘法函数,可以将两个参数相乘:
def multiply(a, b): return a*b
有时候,我们仅仅想要将一个参数和指定的数字(例如 2)相乘。为此,我们可以重用上面的 multiply 函数,例如:
def double(a): return multiply(a,2)
函数 double 返回了函数 multiply,它将数字 2 传递给了函数 multiply 的第二个参数。
以下示例调用了 double 函数:
result = double(10) print(result)
将以上代码合并到一起:
def multiply(a, b): return a*b def double(a): return multiply(a, 2) result = double(10) print(result) # 20
可以看出, double 函数固定了 multiply 函数的第二个参数值,从而创建了一个更加简单的新函数。也就是说,double 函数简化了 multiply 函数的复杂性和功能。在 Python 中,这种 double 函数被称为偏函数(partial function)。
在实际使用中,当我们想要简化某个函数的参数个数,从而简化函数功能时可以使用偏函数。
由于用户不时需要创建偏函数,Python 在标准模块 functools 中提供了 partial 函数,可以帮助我们更方便地定义偏函数。
functools 模块中的 partial 函数
以下是functools 模块中 partial 函数的语法:
functools.partial(fn, /, *args, **kwargs)
函数 partial 返回的结果是一个新的可被调用的偏函数对象。当我们调用该对象时,Python 会使用位置参数 args 和关键字参数 kwargs 调用 fn 函数。以下示例使用 partial 函数定义上面的 double 函数:
from functools import partial def multiply(a, b): return a*b double = partial(multiply, b=2) result = double(10) print(result)
输出结果如下:
20
以上示例的执行过程如下:
- 首先,从 functools 模块中导入 partial 函数。
- 然后,定义 multiply 函数。
- 最后,调用 partial 函数返回一个偏函数对象并赋予变量 double。
当我们调用 double 对象时,Python 实际调用的是 multiply 函数,同时参数 b 的值默认为 2。
如果我们将更多的参数传递给偏函数对象,Python 会将它们赋值给 args 参数。如果我们将额外的关键字参数传递给偏函数对象,Python 会将它们赋值给 kwargs 参数。因此,我们也可以这样调用 double 函数:
double(10, b=3)
以上示例中, Python 会调用 multiply 函数并将数字 3(而不是 2)传递给参数。因此输出的结果如下:
30
偏函数与变量
有时候我们可能想要使用变量定义偏函数,例如:
from functools import partial def multiply(a, b): return a*b x = 2 f = partial(multiply, x) result = f(10) # 20 print(result) x = 3 result = f(10) # 20 print(result)
以上示例中,我们将变量 x 从 2 修改为 3,希望 f(10) 返回 30 ,而不是 20。
但是,f(10) 还是返回了 20。这是因为 Python 在以下语句中计算了 x 的值:
f = partial(multiply, x)
所以,当我们在后面的代码中将 x 的值修改为 3 时,偏函数的定义不会改变。
总结
- Python 利用 functools 模块中的 partial 函数定义偏函数(partial function)。
这篇关于【Python入门教程】第61篇 函数进阶之偏函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南