如果我已经回答了我的问题,我很抱歉,我已经搜索了一段时间的堆栈溢出但发现我无法使用它。
我正在学习如何创建类,我已经为显式Runge-Kutta方法1-4构建了类。类的名称是'RK_1','RK_2','RK_3'和'RK_4'。为了测试我的代码,我决定解决Legendre微分方程,我还创建了一个叫做“Legendre”的类。
现在我想解决这个问题,所以我编写了一个使用特定RK方案的函数并解决了Legendre问题。我想为我的每一个RK方案做这个,所以我写了4次相同的函数,即
def solve_Legendre_1(p,Tmax,init,dt=0.001):
f = Legendre(p)
solver = RK_1(init,f)
while solver.now() < Tmax:
solver(dt)
return solver.state()
def solve_Legendre_2(p,Tmax,init,dt=0.001):
f = Legendre(p)
solver = RK_2(init,f)
while solver.now() < Tmax:
solver(dt)
return solver.state()
def solve_Legendre_3(p,Tmax,init,dt=0.001):
f = Legendre(p)
solver = RK_3(init,f)
while solver.now() < Tmax:
solver(dt)
return solver.state()
def solve_Legendre_4(p,Tmax,init,dt=0.001):
f = Legendre(p)
solver = RK_4(init,f)
while solver.now() < Tmax:
solver(dt)
return solver.state()
然而,我意识到必须有一种更简单的方法来做到这一点。所以我认为我可以使用循环和str.format()来更改函数的名称并使其采用相应的RK方案,如
for j in range(4):
def solve_Legendre_%s(p,Tmax,init,dt=0.001) % (j+1):
f = Legendre(p)
solver = RK_%s(init,f) % (j+1)
while solver.now() < Tmax:
solver(dt)
return solver.state()
但显然这不起作用。有谁知道我应该如何做到这一点?
感谢您的帮助。
答案 0 :(得分:7)
您可以简单地将RK_n()
函数作为参数传递,以避免重复其他函数:
def solve_Legendre(p,Tmax,init,dt=0.001, RK=RK_1):
f = Legendre(p)
solver = RK(init,f)
while solver.now() < Tmax:
solver(dt)
return solver.state()
如果您愿意,可以提前绑定最后一个参数:
import functools
solve_Legendre_1 = functools.partial(solve_Legendre, RK=RK_1)
solve_Legendre_2 = functools.partial(solve_Legendre, RK=RK_2)
...
答案 1 :(得分:1)
你可以使用参数不仅给函数提供“常用”的东西,比如数字,列表或字符串,你也可以使用函数本身作为参数:
>>> def test1():
print(1)
>>> def test2():
print(2)
>>> def solve_with_func(funcname):
funcname()
>>> solve_with_func(test1)
1
>>> solve_with_func(test2)
2
这样你就可以在solve_with_func
中使用相同的逻辑,只需换出执行的函数。
这当然可以扩展到功能列表:
>>> def execute_all(funclist):
for f in funclist:
f()
>>> execute_all([test1, test2])
1
2
答案 2 :(得分:1)
您的功能仅因RK_x功能而异,您只需通过其他变量即可。这将最大限度地减少代码冗余:
def solve_Legendre(RK_func, p,Tmax,init,dt=0.001):
f = Legendre(p)
solver = RK_func(init,f)
while solver.now() < Tmax:
solver(dt)
return solver.state()
现在问题 - 您可以查询全局变量。 globals()函数将返回map,其中每个对象都在由标识符键入的全局范围内定义。所以你可以写(使用我以前的函数):
for j in range(4):
globals()['solve_Legendre_%d' % (j + 1)] = lambda *args, **kw_args: solve_Legendre(globals()['RK_%d' % (j + 1)], *args, **kw_args)
答案 3 :(得分:1)
您应该为您的函数添加参数。所以你有一个功能来解决你所有的方案:
<?php
$db_username = 'admin';
$username = $_POST['username']; // asumming it is 'admin'
if($username == '{$db_username}') // will be false because 'admin' != '{$db_username}'
if($username == "{$db_username}") // will be true because 'admin' == 'admin'
if($username == $db_username) // same as before but cleaner (and a little bit faster, maybe?)
?>
如果需要,您可以为RK设置默认值:
def solve_Legendre(p,Tmax,init,dt=0.001, RK):
f = Legendre(p)
solver = RK(init,f)
while solver.now() < Tmax:
solver(dt)
return solver.state()