函数式编程进阶:如何使用 partial application 预置参数?

酷晨同学_9450

酷晨同学_9450

2026-06-16

257人浏览

原创

partial是固定原函数部分参数生成新函数的偏函数应用,不修改原函数、不依赖默认参数,靠闭包保存预设值;≠默认参数、≠柯里化、≠简单封装。

函数式编程进阶:如何使用 partial application 预置参数?

预置参数不是“设默认值”,而是把函数的一部分参数提前填好,生成一个新函数——调用时只传剩下的,逻辑更干净,复用性更强。

partial 是什么,不是什么

partial(偏函数应用)是函数式编程里的通用概念,指固定原函数的一个或多个参数,返回一个参数更少的新函数。它不修改原函数,也不依赖默认参数机制,而是靠闭包保存预设值,运行时自动合并传参。

常见误解:

  • ≠ 默认参数:默认参数在定义时写死,无法动态生成多个变体;partial 可在运行时按需创建不同绑定版本
  • ≠ 柯里化(Currying):柯里化是把多参函数转成一系列单参函数,每次只收一个;partial 是一次性冻结若干参数,剩余参数仍可批量传入
  • ≠ 简单封装:它不写新逻辑,只是参数预填充,语义清晰、开销极小

Python 中用 functools.partial 预置位置或关键字参数

Python 标准库提供 functools.partial,支持灵活绑定:

  • 位置参数绑定:如 partial(func, a, b) → 新函数调用时,a 和 b 自动作为前两个参数
  • 关键字参数绑定:如 partial(func, key=value) → 后续调用中,该关键字若未重传,就用预设值;若重传,则覆盖(除非函数内部强制校验)
  • 混合绑定:可同时固定位置和关键字参数,例如 partial(send_request, 'POST', timeout=3)

示例:

学习导航
学习导航

一款AI开发辅助工具,主要用于学习者优质的学习网址导航网站,适合需要提升相关任务效率的用户。

下载
from functools import partial<br>def format_log(level, module, msg):<br>  return f"[{level}] {module}: {msg}"<br><br># 预置 level 和 module,生成专用日志函数<br>info_log = partial(format_log, "INFO", "auth")<br>warn_log = partial(format_log, "WARN", module="payment")<br><br>print(info_log("login success"))  # [INFO] auth: login success<br>print(warn_log("timeout"))       # [WARN] payment: timeout

JavaScript 中用 bind 或自定义 partial 实现

JS 原生支持通过 Function.prototype.bind 实现部分应用,尤其适合需要固定 this 的场景:

  • func.bind(thisArg, arg1, arg2) 返回新函数,this 和前几个参数被锁定
  • 若不关心 this,常用 func.bind(null, ...preset)
  • 也可手写轻量 partial 辅助函数,用闭包+展开运算符实现更直观的参数拼接

示例:

const multiply = (a, b, c) => a * b * c;<br>const double = multiply.bind(null, 2); // 固定第一个参数为 2<br>console.log(double(3, 4)); // 24<br><br>// 自定义 partial(更贴近语义)<br>const partial = (fn, ...preset) => (...rest) => fn(...preset, ...rest);<br>const triple = partial(multiply, 3);<br>console.log(triple(5, 2)); // 30

什么时候该用 partial,而不是硬编码或默认参数

核心判断标准是:是否需要**同一函数的多个定制化版本**,且这些版本会反复使用。

  • API 请求封装:固定 method 和 base URL,生成 getUsers、postOrder 等函数
  • 事件处理器:如 handleClick.bind(null, 'save'),避免内联箭头函数导致重复渲染
  • 数据转换流水线:与 map、filter 配合,如 map(partial(parseInt, 10)) 批量转十进制字符串
  • 配置驱动逻辑:根据环境变量生成不同行为的函数,比如日志级别、超时阈值

如果只是单次调用、参数变化频繁,或仅需一个默认值,直接用默认参数或普通调用更合适。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4526

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1129

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4444

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

900

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1796

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3245

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

4233

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

2740

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

888

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python进阶视频教程
Python进阶视频教程

共30课时 | 9万人学习

Scala教程
Scala教程

共24课时 | 19.4万人学习