python - 定义需要传递给另一个函数的函数的最佳方法是什么?
问题描述
请考虑以下代码:
def build_matrix(x_coordinates, y_coordinates, calc_element, **kwargs):
matrix = np.zeros((len(x_coordinates), len(y_coordinates)))
for i in range(len(x_coordinates)):
for j in range(len(y_coordinates)):
matrix += calc_element(x_coordinates[i], y_coordinates[j], i, j, **kwargs)
return matrix
该函数build_matrix
用于通过使用名为 的函数填充其元素来构建矩阵calc_element
。由于我不确切知道可能传递给该函数的所有可能函数是什么,因此我使用可选关键字参数,这样每次我想将它与另一个函数一起使用时就build_matrix
不需要更改(唯一的build_matrix
所有这些函数的共同点是它们需要参数x_coords_i, y_coords_j, i, j
)
但是,我想知道在这种情况下使用类而不是函数是否是 Pythonic。例如,如果我calc_element
以以下方式定义特定版本
class calc_element_velocity_mass():
def __init__(self, velocity, mass):
self.velocity = velocity
self.mass = mass
def __call__(self, x_coords_i, y_coords_j, i, j):
return self.velocity * i / x_coords_i - y_coords_j * j * self.mass
然后在初始化后如下
calc_element = calc_element_velocity_mass(20, 10)
我可以在build_matrix
不使用可选关键字参数的情况下将其传递给,例如,不传递kwargs = dict(mass = 10, velocity = 20)
给build_matrix
.
问题:这是一种正确的上课方式吗?我的原始实现是否正确,或者我应该以不同的方式处理这个问题?谢谢!
解决方案
您的类解决方案肯定会起作用,但闭包将是一种更简单的方法来做同样的事情:
def calc_element_velocity_mass(velocity, mass):
def f(x_coords_i, y_coords_j, i, j):
return velocity * i / x_coords_i - y_coords_j * j * mass
return f
您也可以返回一个 lambda 而不是f
,但为了清楚起见,我在这里使用了一个命名函数。
推荐阅读
- python - 如何在 Python 中的日志文件中写入标题
- datatables - 数据表状态保存刷新在关闭对话框后继续 POST 请求
- reactjs - 收到来自 axios 请求的承诺时,状态未更新操作
- c# - 在 Visual Studio 中运行 Docker Compose 时引发异常
- javascript - 有没有办法使用三元的条件作为值?
- android - 从以前的活动中检索字符串
- php - laravel 和 jwt:总是返回 Unauthorized
- python - 查找不包括测试用例的 Python 代码总行数
- spring - 为什么我得到异常 - 没有足够的变量可用于在 Spring Rest URI 调用中扩展?
- eclipse - 上传文件后在spring boot中刷新文件夹