python - 如果只给出一个参数,如何忽略变量声明中的第二个参数
问题描述
我编写了一个函数来执行 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))
因此,对于给定的方程,函数调用失败,因为输入的方程无法处理第二个输入,并且函数通过调用具有两个输入的输入函数来定义变量。我怎样才能创建方程,以便它也可以处理一个只需要一个自变量的方程?
解决方案
如果您知道您有一个可选参数,可能会或可能不会给出,为什么不在您的函数调用中也将其设为可选(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
函数以这种方式工作得非常好。但是,如果您知道总会有一定数量的函数参数,那么在函数调用中将它们设为可选可能是更简洁的方法。
推荐阅读
- c++ - How to force resizing of indexWidgets to fit in cells of Qt5 QTableView
- java - 单独 jar 文件中的 Java 类的超类,显示为 Object
- python - PyGame:camera.set_controls() 在 RasPI 上不起作用
- python - 在 Python 中使用 Keras 将 27 个字段的输入连接到 LSTM 层的输出
- mysql - 无法提高查询的查询性能
- sitecore - 移动设备上的 Sitecore 缓存问题(Ipad-I 手机)
- c - fgets() 是否锁定标准输出以防止 printf
- hana - SAP HANA 查询中涉及参数和变量的“国家”字符(unicode)
- templates - Vue.js 本地模板变量
- laravel - Laravel Nova 1 个资源中的 2 个模型