我在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)]
我用不同的xiStart
,xiEnd
,noOfxi
写了这个。用户的命令行输入将决定我调用的函数。
答案 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]
您需要在参数列表中为要循环的参数提供虚拟值。