定义需要传递给另一个函数的函数的最佳方法是什么?
What is the best way to define a function that needs to be passed to another function?
请考虑以下代码:
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
)
但是,我想知道在这种情况下使用 class 而不是函数是否符合 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
。
问题:这是 classes 的正确方法吗?我的原始实现是否正确,或者我应该以不同的方式处理这个问题?谢谢!
您的 class 解决方案肯定会奏效,但闭包会是一种更简单的方法来完成完全相同的事情:
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
您也可以 return lambda 而不是 f
,但为了清楚起见,我在这里使用了命名函数。
请考虑以下代码:
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
)
但是,我想知道在这种情况下使用 class 而不是函数是否符合 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
。
问题:这是 classes 的正确方法吗?我的原始实现是否正确,或者我应该以不同的方式处理这个问题?谢谢!
您的 class 解决方案肯定会奏效,但闭包会是一种更简单的方法来完成完全相同的事情:
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
您也可以 return lambda 而不是 f
,但为了清楚起见,我在这里使用了命名函数。