如何在Python中将变量传入和传出函数[重复]

Posted

技术标签:

【中文标题】如何在Python中将变量传入和传出函数[重复]【英文标题】:How to pass variables in and out of functions in Python [duplicate] 【发布时间】:2018-09-24 07:29:32 【问题描述】:

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

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 的低效方法。

有人可以建议一种更好、更有效且不易出错的方法吗?

【问题讨论】:

更好、更高效且不易出错的方法 --> pythonic方式 多个返回值需要打包成一个对象,但除非输入值非常密切相关,否则强制将它们分组到一个对象中只会使事情复杂化,并且在概念上不一定听起来。 @Carcigenicate Python 允许多个返回值无需打包...我没有关注您的评论。 @TemporalWolf 这只是隐式元组包装afaik。它只有 1 个返回值,一个返回恰好是一个包含多个元素的元组。 实际上,它甚至不是隐含的。从 dupe 目标的第二个答案来看,创建元组只需要一个逗号,所以我的示例只是显式创建一个元组然后返回它。 【参考方案1】:

您可以利用 kwargs 来解压命名变量

def foo(**kwargs):
    kwargs['var1'] = do_something(kwargs['var1'])
    ...
    return kwargs

【讨论】:

【参考方案2】:

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

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)

有许多方法可以更简单地创建这些。其中一些包括:

attrs:

>>> @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

namedtuples

>>> 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 中,而是will be added in 3.7。我在这里添加它们是因为它们可能会成为未来的首选工具。

【讨论】:

+1 用于命名元组。它易于使用,并且将数据保存在您不必担心的不可变序列类型中。非常适合以“我不在乎这是什么,我只想让数据通过”的方式存储数据。对于几何点,我会使用一个类(也许__add__ 会有所帮助,但对于邮寄地址、url 等内容,我认为 namedtuples 肯定被低估了。(我正要输入一个 namedtuple 答案但你明白了在我可以之前,所以我将把我的赞美放在这里。)

以上是关于如何在Python中将变量传入和传出函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量传入和传出AsyncTasks?

在Python中将多个参数传递给pool.map()函数[重复]

如何从 Ant Media Server 中获取所有的传入和传出流名称?

python中如何将函数的运算结果传出来作为函数参数使用?

使用 python 驱动程序将数据传入和传出 C++ 代码

将变量传入和传出 PayPal