如果需要减少某个函数的参数个数,你可以使用 functools.partial() 。partial() 函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参数个数。为了演示清楚,假设你有下面这样的函数
# !/usr/bin/env python
# -*- coding: utf-8 -*-
from functools import partial
def spam(a, b, c, d):
print(a, b, c, d)
s1 = partial(spam, 1) # a = 1
s1(2, 3, 4)
s2 = partial(spam, d=42) # d = 42
s2(1, 2, 3)
s3 = partial(spam, 1, 2, d=42) # a = 1, b = 2, d = 42
s3(3)
可以看出 partial() 固定某些参数并返回一个新的 callable 对象。这个新的 callable接受未赋值的参数,然后跟之前已经赋值过的参数合并起来,最后将所有参数传递给原始函数。
解决的问题是让原本不兼容的代码可以一起工作:
假设你有一个点的列表来表示 (x,y) 坐标元组。你可以使用下面的函数来计算两点之间的距离:
points = [(1, 2), (3, 4), (5, 6), (7, 8)]
def distance(p1, p2):
x1, y1 = p1
x2, y2 = p2
return math.hypot(x2 - x1, y2 - y1)
现在假设你想以某个点为基点,根据点和基点之间的距离来排序所有的这些点。列表的 sort() 方法接受一个关键字参数来自定义排序逻辑,但是它只能接受一个单个参数的函数 (distance() 很明显是不符合条件的)。现在我们可以通过使用 partial() 来解决这个问题, 更进一步,partial() 通常被用来微调其他库函数所使用的回调函数的参数.
pt = (3, 8)
points.sort(key=partial(distance, pt))
print(points) # [(5, 6), (3, 4), (7, 8), (1, 2)]
使用functools.partial简化函数调用与参数管理
本文介绍了如何使用Python的functools模块中的partial函数来减少函数参数,通过预先设定部分参数值创建新的可调用对象。示例展示了如何利用partial解决列表排序时自定义距离计算函数的问题,以及它在调整其他库函数回调参数中的应用。
1190

被折叠的 条评论
为什么被折叠?



