如何在Python中传递多个变量给函数并返回?
我从事科学编程,经常需要给用户显示一些提示和变量对,让他们可以编辑这些变量,然后用新的变量进行计算。因为这个需求很频繁,我写了一个wxPython的类,把这部分代码从主程序中抽离出来。你需要为每个变量设置一个列表,里面包含变量的类型(比如字符串、浮点数、整数)、提示信息和变量当前的值。然后把所有这些列表放到一个大列表里,我的工具就会创建一个格式整齐的wxPython面板,显示提示和当前值,用户可以在上面进行编辑。
刚开始的时候,我只有几个变量,所以我就一个一个地写出来。
s='this is a string'; i=1; f=3.14
my_list=[ ['s','your string here',s], ['i','your int here',i], ['f','your float here'],]
input_panel = Input(my_list)
# the rest of the window is created, the input_panel is added to the window, the user is
# allowed to make choices, and control returns when the user hits the calculate button
s,i,f = input_panel.results() # the .results() function returns the values in a list
现在我想用这个方法处理很多变量(大约10到30个),这种做法就不太管用了。我可以用多行代码来创建函数的输入列表,使用list.append()语句。但是当代码从函数返回时,我得到的是一个很大的列表,需要把它拆分成正确的变量。这管理起来很麻烦,而且很容易导致输入列表和输出列表不同步。更糟糕的是,这样看起来很笨拙。
在Python中,传递很多变量到一个函数时,怎样才能带上额外的信息,让它们可以被编辑,然后再把这些变量拿回来,以便在程序的其他部分使用呢?
如果我能通过引用把变量传递给函数,那用户就可以选择是否修改它们,而我可以在程序从函数返回后使用这些值。这样我只需要在多行中构建输入列表,就不会出现输入列表和输出列表不同步的情况。但Python不允许这样做。
我是不是应该把大列表拆分成小列表,然后再组合成大列表传入和传出函数?这样做会不会增加出错的机会呢?
6 个回答
在我看来,最理想的解决方案是使用这样的一个类:
>>> class Vars(object):
... def __init__(self, **argd):
... self.__dict__.update(argd)
...
>>> x = Vars(x=1, y=2)
>>> x.x
1
>>> x.y
2
你也可以创建一个字典,然后像这样传递它:
>>> some_dict = {'x' : 1, 'y' : 2}
>>> #the two stars below mean to pass the dict as keyword arguments
>>> x = Vars(**some_dict)
>>> x.x
1
>>> x.y
2
这样在把数据传给一个函数时,你可以根据需要获取或修改数据:
>>> def foo(some_vars):
... some_vars.z = 3 #note that we're creating the member z
...
>>> foo(x)
>>> x.z
3
这里有两个不错的选择。
第一个是用字典把所有变量集中在一个地方:
d = {}
d['var1'] = [1,2,3]
d['var2'] = 'asdf'
foo(d)
第二个是用类来把所有参数打包。这个类可以简单到如下:
class Foo(object):
pass
f = Foo()
f.var1 = [1,2,3]
f.var2 = 'asdf'
foo(f)
在这种情况下,我更喜欢用类而不是字典,因为你可以为这个类提供一个定义,这样使用起来会更清晰,或者提供一些方法来处理打包和解包的工作。
最简单的方法就是创建一个类。与其处理一堆变量,不如让这个类有一些属性。这样你只需要使用这个类的一个实例就可以了。