在Python中增加函数名称

时间:2017-06-26 08:29:10

标签: python string

如果我已经回答了我的问题,我很抱歉,我已经搜索了一段时间的堆栈溢出但发现我无法使用它。

我正在学习如何创建类,我已经为显式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()

但显然这不起作用。有谁知道我应该如何做到这一点?

感谢您的帮助。

4 个答案:

答案 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()