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 |