Python 如何从一个函数返回多个值?

新手上路,请多包涵

我写了以下代码:

 class FigureOut:
   def setName(self, name):
      fullname = name.split()
      self.first_name = fullname[0]
      self.last_name = fullname[1]

   def getName(self):
      return self.first_name, self.last_name

f = FigureOut()
f.setName("Allen Solly")
name = f.getName()
print (name)

我得到以下 输出:

 ('Allen', 'Solly')

每当从python中的函数返回多个值时,它是否总是将多个值转换为多个值的 列表, 然后从函数返回它?

整个过程是否与将多个值转换为 list 显式然后返回列表相同,例如在 Java 中,因为在 Java 中只能从函数返回一个对象?

原文由 User_Targaryen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 362
2 个回答

由于 getName 中的返回语句指定 _了多个元素_:

 def getName(self):
   return self.first_name, self.last_name

Python 将返回一个基本上包含它们的容器对象。

在这种情况下,返回一组以 逗号分隔 的元素会创建 _一个元组_。 只能在容器内返回 多个值。

让我们使用一个返回多个值的更简单的函数:

 def foo(a, b):
    return a, b

您可以查看使用 dis.dis 生成的字节码,它是 Python 字节码的反汇编程序。对于没有任何括号的逗号分隔值,它看起来像这样:

 >>> import dis
>>> def foo(a, b):
...     return a,b
>>> dis.dis(foo)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_TUPLE              2
              9 RETURN_VALUE

正如您所看到的,这些值首先加载到内部堆栈上 LOAD_FAST 然后是 BUILD_TUPLE (抓住前面的 2 生成的元素放在堆栈上) .由于存在逗号,Python 知道创建一个元组。

您也可以使用 [] 指定另一个返回类型,例如列表。对于这种情况,a BUILD_LIST 将按照与元组等效的相同语义发布:

 >>> def foo_list(a, b):
...     return [a, b]
>>> dis.dis(foo_list)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (b)
              6 BUILD_LIST               2
              9 RETURN_VALUE

返回的对象类型实际上取决于括号的存在(对于元组 () 如果至少有一个逗号,则可以省略)。 [] 创建列表和 {} 集合。字典需要 key:val 对。

总而言之, _返回一个实际对象_。如果该对象是容器类型,它可以包含多个值,给人以返回多个结果的印象。通常的方法是直接解压它们:

 >>> first_name, last_name = f.getName()
>>> print (first_name, last_name)


除了这一切,您的 Java 方式正在泄漏到 Python 中 :-)

在 Python 中编写类时不要使用 getter,使用 properties 。属性是管理属性的惯用方式,有关这些的更多信息,请在 此处 查看一个很好的答案。

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 3.0 许可协议

来自 Python Cookbook v.30

 def myfun():
    return 1, 2, 3

 a, b, c = myfun()

虽然它看起来像 myfun() 返回多个值,但实际上正在创建一个 tuple 看起来有点奇特,其实组成元组的是逗号,而不是括号

所以是的,Python 中发生的是从多个逗号分隔值到元组的内部转换,反之亦然。

尽管在 Java 中没有等效项,但您可以使用 array 或一些 Collection 轻松创建此行为,例如 List s:

 private static int[] sumAndRest(int x, int y) {
    int[] toReturn = new int[2];

    toReturn[0] = x + y;
    toReturn[1] = x - y;

    return toReturn;

}

以这种方式执行:

 public static void main(String[] args) {
    int[] results = sumAndRest(10, 5);

    int sum  = results[0];
    int rest = results[1];

    System.out.println("sum = " + sum + "\nrest = " + rest);

}

结果:

 sum = 15
rest = 5

原文由 joc 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题