如何在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中将变量传入和传出函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在Python中将多个参数传递给pool.map()函数[重复]