首页 > 解决方案 > 如果只给出一个参数,如何忽略变量声明中的第二个参数

问题描述

我编写了一个函数来执行 4 阶 Runge Kutta,但是,它只有在我输入一个具有两个自变量的函数时才有效。我想让函数能够处理只有一个自变量的函数。

def RungeKutta(fun, x0, y0, h, end=None, n=None):
    x = x0
    y = y0
    
    if end == None:
        for i in range(n):
            k1 = fun(x, y)
            k2 = fun(x + h/2, y + (h * k1) / 2)
            k3 = fun(x + h/2, y + (h * k2) / 2)
            k4 = fun(x + h, y + h * k3)
            y = y + h * (k1/6 + k2/3 + k3/3 + k4/6)

            x = x + h

    else:
        n = (end - x0) / h

        for i in range(n):
            k1 = fun(x, y)
            k2 = fun(x + h/2, y + (h * k1) / 2)
            k3 = fun(x + h/2, y + (h * k2) / 2)
            k4 = fun(x + h, y + h * k3)
            y = y + h * (k1/6 + k2/3 + k3/3 + k4/6)

            x = x + h
   return y 

我正在使用以下等式并调用:

A = 1250
Q = 450
WaterLevel = lambda t: ((3 * Q) / A) * mt.sin(t)**2 - (Q / A)
print(Rg(WaterLevel, 0, 0, .5, n=1))

因此,对于给定的方程,函数调用失败,因为输入的方程无法处理第二个输入,并且函数通过调用具有两个输入的输入函数来定义变量。我怎样才能创建方程,以便它也可以处理一个只需要一个自变量的方程?

标签: python

解决方案


如果您知道您有一个可选参数,可能会或可能不会给出,为什么不在您的函数调用中也将其设为可选(y0=None)?然后该函数可以处理不同的情况,例如通过将您的值分派到不同的后台实现。(您需要重新排序函数调用中的参数,以便所有位置参数都排在第一位。)


通常,如果您想要一个可以使用任何未指定数量的参数调用的函数,您可以使用*运算符在函数定义中使用元组打包来处理它们。作为一个高级示例,包括强制和可选参数:

def test(param1, param2, *args, opt1=None, opt2=None):
    print(param1, param2, args, opt1, opt2)

然后:

>>> test(1, 2)
1 2 () None None
>>> test(1, 2, 3, 4, 5)
1 2 (3, 4, 5) None None
>>> test(1, 2, 3, 4, 5, opt1=True, opt2=False)
1 2 (3, 4, 5) True False

同样,您必须编写一种健壮的方法来处理给出不同数量的参数时发生的情况。这是否是一种做事的好方法显然取决于您的用例。例如,内置print函数以这种方式工作得非常好。但是,如果您知道总会有一定数量的函数参数,那么在函数调用中将它们设为可选可能是更简洁的方法。


推荐阅读