因此,我创建了一个函数,它将一个操作(在本例中,一个数组与一个正弦波进行逐点乘法,但这与我的问题无关)。在
现在我已经创建了另一个函数,我想用它创建一个string
的python代码,以便以后多次应用第一个函数。第二个函数的输入可以是string
,也可以是array
,因此如果需要,我也可以在第二个函数的输出上使用第二个函数。我在字符串中获取变量名的方法在函数之外工作。在
输入:
var = np.array([[1,3],[2,4]]) # or sometimes var = 'a string'
if type(var)==str:
var_name = var
else:
var_name = [ k for k,v in locals().items() if v is var][0]
var_name
输出:
^{pr2}$所以这里var
是提供给函数的变量(数组或字符串),在本例中是一个数组。if语句很好地返回了它的名称。在
但是,当我在函数中使用这个函数时,不管我给它什么输入,它实际上似乎在locals()中查找var。不知何故,它不会从函数输入中获取var。在
定义:
def functionTWO(var, listoflistsofargs=None):
if type(var)==str:
var_name = var
else:
var_name = [ k for k,v in locals().items() if v is var][0]
if listoflistsofargs==None:
return var_name
command = []
for i in range(len(listoflistsofargs)):
if i==0:
command.append('functionONE(')
command.append(var_name)
command.append(',%.17f, %.17f)' % tuple(listoflistsofargs[i]))
else:
command.insert(0,'functionONE(')
command.append(',%.17f, %.17f)' % tuple(listoflistsofargs[i]))
''.join(command)
command[0] = var_name + ' + ' + command[0]
return ''.join(command)
输入:
somearray = np.array([[1,2,3],[1,2,3],[1,2,3]])
args = [[1,3],[6,5]]
command = functionTWO(somearray, args)
command
输出:
NameError: name 'var' is not defined
想要的输出:
'functionONE(functionONE(somearray, 1, 3), 6, 5)'
为什么listoflistsofargs
取自函数输入而var
不是?我在functionTWO
的定义中的listcomponsion中指定var
。通常,当我使用列表理解和函数输入时,它工作得很好。有人知道为什么这里不是这样吗?提前谢谢你!在
编辑:所以我想答案是不要。Marcin实现的类看起来更干净,代码量也大致相同。太可惜了,我不能在函数中使用这个函数。对于其他关于使用变量名作为字符串的dont(实际上是其他想法),有一个this问题,我在上面列出了对变量名的理解。在
不能将变量作为字符串*传递,也不应这样做。在
如果要在函数之间传递值,通常的方法是将其作为参数传入,然后作为返回值传出。在
如果不方便的话,通常的解决方案是一个对象:定义一个既包含共享变量又包含作用于变量的方法的类。在
如果需要创建命令对象,最好是以结构化的方式创建。例如,如果要传递函数和参数,可以直接传递函数对象和元组中的参数:
如果你想在命令中嵌入这样的命令,你可能需要用一个类来包装它,这样你就可以递归地计算参数了。事实上,这里有一个小评估者:
^{pr2}$尽管有一些方法可以将对局部变量的引用从函数中传递出去,但这些方法并不是一个好主意,因为你最终创建了自己的半成品对象系统,这更难理解。在
*
这是因为变量有一个名称(字符串)和一个将名称映射到字符串的上下文。所以,至少需要传递一个元组才能真正传递一个变量。在演示者的答案在Python3中有效
示例:
^{pr2}$唯一的问题是有点乱。在
当您将其全部包装到一个函数中时,会出现错误
NameError: name 'var' is not defined
,原因如下:locals().items()
是指本地定义的变量。事实上,函数中本地定义的变量只是函数内部定义的变量和作为参数传递给函数的变量。在顾名思义,
locals().items()
是本地的,根据脚本中调用它的位置,它将由不同的变量组成。在{cd4>应该用全局变量来代替它。在
有关更多信息,请在Python中查找全局和局部变量以及变量的范围。在
相关问题 更多 >
编程相关推荐