如何在Python中传入和传出函数中的变量

How to pass variables in and out of functions in Python

本问题已经有最佳答案,请猛点这里访问。

当我用Python编写函数时,通常需要向函数传递相当多的变量。此外,这些函数的输出包含多个变量。为了管理这个变量的I/O,我使用字典数据类型,将所有输入变量打包到一个字典中以注入一个函数,然后在函数的末尾编译另一个字典以返回主程序。当然,这需要对输出字典进行另一次解包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dict_in = {'var1':var1,
           'var2':var2,
           'varn':varn}    

def foo(dict_in):
    var1 = dict_in['var1']
    var2 = dict_in['var2']
    varn = dict_in['varn']

   """ my code"""

    dict_out = {'op1':op1,
                'op2':op2,
                'op_m':op_m}
    return dict_out

随着变量列表的增加,我怀疑这将是处理变量I/O的一种效率低下的方法。

有人能提出一个更好、更有效、更不容易出错的方法来解决这个问题吗?


如果您发现自己编写了许多作用于相同数据的函数,一种更好的方法是使用类来包含您的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Thing:
    def __init__(self, a, b, c):
        var_1 = a
        var_2 = b
        var_3 = c

    # you can then define methods on it

    def foo(self):
        self.var_1 *= self.var_2

# and use it
t = Thing(1, 2, 3)
t.foo()
print(t.var_1)

有许多方法可以更容易地创建这些。其中包括:

阿特斯:

1
2
3
4
5
6
7
>>> @attr.s
... class SomeClass(object):
...     a_number = attr.ib(default=42)
...     list_of_numbers = attr.ib(default=attr.Factory(list))
...
...     def hard_math(self, another_number):
...         return self.a_number + sum(self.list_of_numbers) * another_number

命名元组

1
2
3
4
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22)     # instantiate with positional or keyword arguments
>>> p.x + p.y               # fields accessible by name
33

数据包

这些还没有在Python中出现,但将在3.7中添加。我将在这里添加它们,因为它们可能是将来选择的工具。


您可以利用Kwargs解包命名变量

1
2
3
4
def foo(**kwargs):
    kwargs['var1'] = do_something(kwargs['var1'])
    ...
    return kwargs