【问题标题】:How to pass variables in and out of functions in Python [duplicate]如何在Python中将变量传入和传出函数[重复]
【发布时间】: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 目标的第二个答案来看,创建元组只需要一个逗号,所以我的示例只是显式创建一个元组然后返回它。

标签: python


【解决方案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 答案但你明白了在我可以之前,所以我将把我的赞美放在这里。)
    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2021-06-02
    • 2017-10-24
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多