Python - 从函数返回多个值到不同的数组

Posted

技术标签:

【中文标题】Python - 从函数返回多个值到不同的数组【英文标题】:Python - returning multiple values from function to different arrays 【发布时间】:2012-01-19 15:59:35 【问题描述】:

我有一个返回两个值的函数。我想将这两个值直接放入两个不同的数组中。我知道如何将输出作为两个不同的值返回,以便稍后添加到数组中,但我不想拥有临时占位符。下面是一个例子。

def two_outputs():
    output_one = 5
    output_two = 6
    return output_one, output_two

one_array = []        # initialize array
two_array = []        # initialize array

a, b = two_outputs()  # get values

one_array.append(a)   # store first value in first array
two_array.append(b)   # store second value in first array

理想情况下,我不想使用 a 和 b 并且必须稍后在代码中附加。我想将函数的输出直接附加到两个数组中。这甚至可能吗?

感谢您的帮助。我希望我这样做是正确的,因为这是我的第一篇文章。你们已经在编程问题上帮助了我很多。

更新:我猜根据下面的回复,不可能直接这样做。感谢大家帮助寻找其他方法来实现目标。

【问题讨论】:

为什么要这样做?临时占位符有什么问题? 我做了大量工作,从数据库收集信息,创建返回许多值的函数。我不喜欢临时占位符,因为它在代码中添加了步骤,我希望代码更小/更短。除此之外,没有技术原因。我只是好奇是否可以将函数的输出直接发送到两个不同的数组(或更多)。根据下面的答案,这似乎是不可能的。 【参考方案1】:

假设我理解正确,您需要在声明函数之前定义数组。

one_array, two_array = [], []

def two_outputs():
    one_array.append(5)
    two_array.append(6)

#call function
two_outputs()

print one_array, two_array
#[5] [6]

【讨论】:

【参考方案2】:

使用辅助函数怎么样?

def zippend(lists, values):
  assert len(lists) == len(values)
  for l,v in zip(lists, values):
    l.append(v)

zippend((one_array, two_array), two_outputs())

函数zippend 有两个参数。第一个是Lists 的可迭代对象(您所说的“数组”实际上是python 中的Lists)。第二个是要附加到这些列表的可迭代值。

只要列表的数量与值的数量匹配(每个列表一个值),它就可以使用任意数量的列表和值。

编辑:如果 two_outputs() 要返回一个 Lists 元组以连接到 one_arraytwo_array,那么您可以将函数更改为使用 extend 而不是 append

def zextend(lists, values):
  assert len(lists) == len(values)
  for l,v in zip(lists, values):
    l.extend(v)

或者,如果您真的愿意,您可以使用一个函数,该函数有一个 if 语句来检查它所获得的值的类型,并酌情使用appended 或extended。

【讨论】:

我建议命名为“zippend”。 @Laurence 我喜欢!已编辑! 这看起来很有趣。你能再解释一下它的界限吗?我假设您可以使用任意数量的数组和输出? 我很好奇如果函数返回一个数组而不是单个值,这个方法将如何工作。 @ruffryder 已编辑以解决您的第一条评论。【参考方案3】:

你总是可以改变你的函数来返回一个列表元组:

def test():
   # some code
   return [a], [b]

a, b = test()

这将在返回时生成 a 和 b 列表

【讨论】:

【参考方案4】:

可以使用以下生成器在一行中完成。对“任何”的调用就是这样 生成器被消耗,因此其中的表达式被执行。

any(lst.append(item) for lst,item in zip((one_array, two_array), two_outputs()))

注意。我不推荐这种编程风格 - 它变得更难阅读。 可能,如果它过于频繁的成语,我会写一个简短的帮助函数 像这样的作业:

def multi_append(lists, multi_function, *args, **kw):
    for lst, result in zip(lists, multi_function(*args, **kw)):
         lst.append(result)

而在代码的“主体”上,只需写:

multi_append((array_one, array_two), two_outputs)

为了完整起见,我添加一个建议,允许您使用赋值运算符。

在这种情况下,需要的是一个自定义 List 对象,该对象具有执行附加的属性。创建这样一个类是一个 2 班轮,但是,他在你的代码中列出的必须来自这个类:

class MList(list):
    last = property(lambda s:s[-1], list.append)

array_one, array_two = MList(), MList()

array_one.last, array_two.last = two_outputs()

【讨论】:

以上是关于Python - 从函数返回多个值到不同的数组的主要内容,如果未能解决你的问题,请参考以下文章

从arraylist返回值到ajax成功函数

Taro 中父组件传多个值到子组件, 不同页面传值, 子组件修改父组件值

连接/附加多个不同大小的垂直数组

处理来自不同函数的多个返回数据集 python pandas

如何从这个程序返回多个值到 API 主机服务器

从选择返回值到函数