微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

定义需要传递给另一个函数的函数的最佳方法是什么?

如何解决定义需要传递给另一个函数的函数的最佳方法是什么?

请考虑以下代码

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,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,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,但为了清楚起见,我在这里使用了一个命名函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。