🧩 Python 小练习系列:掌握偏函数 partial,用函数更丝滑!
本节是 Python 小练习系列的第 14 题,我们将聚焦一个 冷门但高能 的工具 ------
functools.partial
。它的作用类似于"函数的预设模板",能帮你写出更加灵活、优雅的代码。
🎯 本题目标
- 理解什么是偏函数;
- 学会使用
functools.partial
; - 编写一个带偏函数的实战案例;
- 思考偏函数的常见使用场景。
🧠 偏函数是什么?
偏函数(Partial Function)是指:预先为某个函数的部分参数设定默认值,返回一个新的函数对象。
在 Python 中我们可以用 functools.partial
来实现。
✅ 示例一:最经典的使用场景
python
from functools import partial
def power(base, exponent):
return base ** exponent
# 创建一个求平方的函数
square = partial(power, exponent=2)
# 创建一个求立方的函数
cube = partial(power, exponent=3)
print(square(5)) # 25
print(cube(2)) # 8
本质上:
square(x)
就等价于power(x, 2)
,是不是很丝滑?
🎮 小练习:构建一个"偏好设置"函数生成器
场景说明:
你在写一个电商网站的消息通知系统,需要根据用户的偏好设置通知行为,比如:
python
def send_notification(user, channel, content):
print(f"To {user}, via {channel}: {content}")
你希望提前为"微信渠道"做一个专用函数:
python
from functools import partial
send_by_wechat = partial(send_notification, channel="WeChat")
send_by_wechat("小明", content="你有一笔订单已发货")
输出:
css
To 小明, via WeChat: 你有一笔订单已发货
是不是代码变得更清晰、更"可读"了?
📌 实战题:构建简化版 API 请求工具
原始方法:
python
def make_request(method, url, headers=None, data=None):
print(f"Request: [{method}] {url}")
print(f"Headers: {headers}")
print(f"Data: {data}")
使用偏函数预设请求类型:
python
from functools import partial
post_json = partial(
make_request,
method="POST",
headers={"Content-Type": "application/json"}
)
post_json(url="http://example.com/api", data='{"name": "chatgpt"}')
✨ 进阶挑战
尝试封装一个函数生成器,自动创建多个"预设模板函数":
python
def create_sender(channel):
return partial(send_notification, channel=channel)
send_by_sms = create_sender("SMS")
send_by_email = create_sender("Email")
send_by_sms("小红", content="验证码:123456")
send_by_email("小蓝", content="欢迎注册我们的平台")
📚 总结
知识点 | 说明 |
---|---|
functools.partial |
用于"锁定"函数部分参数,返回新函数 |
使用场景 | API封装、回调函数、事件处理、参数绑定等 |
优势 | 简化函数调用,提高可读性、复用性 |
✅ 推荐延伸阅读
lambda
vspartial
:什么时候该用哪个?- 偏函数在
tkinter
GUI 编程中的应用; - functools.partialmethod 用于类的方法绑定(进阶)。
🧩 最后一题
尝试完成这个练习:
写一个偏函数
rmb_to_usd
,假设当前汇率是 7.2,使用它将多个人民币金额转换为美元。
提示:
python
def exchange(amount, rate):
return amount * rate
# TODO:补全偏函数定义
🧃 如果这题你喜欢:
📌 点个赞 / ⭐ 收藏 / 💬 留个言支持我继续更🔥的小练习系列吧!