缩短python3中几乎重复的代码

时间:2017-09-08 20:27:24

标签: python-3.x repeat

我在python 3中有一个代码,"几乎重复"本身,我正在寻找一种简单的方法来缩短它。

我所拥有的是具有N个变量的函数f(x1,...,xN)。用户选择一个变量,比如说x5,得到一个f vs x5的图,其他变量是固定的。我总是可以手写N个函数,每个函数执行以下不同的xi:

def get_Array_To_Plot_x5(x1, ..., x5Start, x5End, numberOfX5, ..., xN):
      return [f(x1, ..., xN) for x5 in numpy.linspace(xiStart, xiEnd, numberOfXi)]

然后我根据用户输入在我的主脚本中调用正确的get_Array_To_Plot_xi函数(在本例中为get_Array_To_Plot_x5),并绘制此数组。

有没有更好的方法来编写这段代码?我可以编写另一个代码,将此脚本编写为文本文件,但我希望在可能的情况下提供更优雅的解决方案。

编辑:根据Mad Physicist的要求添加示例代码:

这里是我编写的代码(我使用Kwant库计算s波拓扑超导体的能级):

def get SWaveEnergies(V0, mu, B_Zeeman, alpha, Delta, W, L, noOfLevels, a, t):
   return some_floating_number

def SWave_vsMu(muStart, muEnd, noOfmu, V0, B_Zeeman, alpha, Delta, W, L, noOfLevels=6, a=1, t=1.0):
    return [SWaveEnergies(V0, mu, B_Zeeman, alpha, Delta, W, L, noOfLevels, a, t) for mu in np.linspace(muStart, muEnd, noOfmu)]

我用不同的xiStartxiEndnoOfxi写了这个。用户的命令行输入将决定我调用的函数。

1 个答案:

答案 0 :(得分:1)

for循环或列表推导中的变量实际上可以是您可以分配给的任何表达式(“左值”),而不仅仅是一个简单的变量名。这意味着如果列表中包含所有参数,则可以通过索引迭代该列表中的任意元素,而无需复制任何代码。像这样:

def get_Array_To_Plot(whichParam, start, end, number, *args):
    args = list(args)   # must be writable list, not tuple
    values = numpy.linspace(start, end, number)
    return [f(*args) for args[whichParam] in values]

您需要在参数列表中为要循环的参数提供虚拟值。