缩短 python3 中几乎重复的代码
Shortening an almost-repeating code in python3
我在 python 3 中有一个 "almost repeats" 本身的代码,我正在寻找一种简单的方法来缩短它。
我有一个函数 f(x1, ..., xN) 有 N 个变量。用户选择一个变量,比如说 x5,然后得到 f 与 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
写了这篇文章。用户的命令行输入将决定我调用的函数。
for
循环或列表理解中的变量实际上可以是您可以分配给("lvalue")的任何表达式,而不仅仅是一个简单的变量名。这意味着如果您将所有参数都放在一个列表中,则可以通过索引迭代该列表的任意元素,而无需复制任何代码。像这样:
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]
您需要在参数列表中为要循环的参数提供一个虚拟值。
我在 python 3 中有一个 "almost repeats" 本身的代码,我正在寻找一种简单的方法来缩短它。
我有一个函数 f(x1, ..., xN) 有 N 个变量。用户选择一个变量,比如说 x5,然后得到 f 与 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
写了这篇文章。用户的命令行输入将决定我调用的函数。
for
循环或列表理解中的变量实际上可以是您可以分配给("lvalue")的任何表达式,而不仅仅是一个简单的变量名。这意味着如果您将所有参数都放在一个列表中,则可以通过索引迭代该列表的任意元素,而无需复制任何代码。像这样:
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]
您需要在参数列表中为要循环的参数提供一个虚拟值。