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

时间:2016-09-06 09:54:25

标签: python function python-3.x return

我写了以下代码:

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中的函数返回一个对象?

6 个答案:

答案 0 :(得分:28)

由于getName中的return语句指定多个元素

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知道创建一个元组。

您也可以使用[]指定其他返回类型,例如列表。对于这种情况,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。属性是管理属性的惯用方法,有关这些内容的更多信息,请参阅一个很好的答案here

答案 1 :(得分:19)

来自Python Cookbook v.30

def myfun():
    return 1, 2, 3

a, b, c = myfun()
  

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

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

虽然中没有相应内容,但您可以使用arrayCollection之类的List来轻松创建此行为:

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

答案 2 :(得分:6)

这里实际上正在返回tuple

如果在Python 3中执行此代码:

def get():
    a = 3
    b = 5
    return a,b
number = get()
print(type(number))
print(number)

输出

<class 'tuple'>
(3, 5)

但是,如果您更改代码行return [a,b]而不是return a,b并执行:

def get():
    a = 3
    b = 5
    return [a,b]
number = get()
print(type(number))
print(number)

输出

<class 'list'>
[3, 5]

它只返回包含多个值的单个对象。

还有return语句的另一种替代方法可以返回多个值,使用yield(查看详细信息请参阅此What does the "yield" keyword do in Python?

示例示例:

def get():
    for i in range(5):
        yield i
number = get()
print(type(number))
print(number)
for i in number:
    print(i)

输出

<class 'generator'>
<generator object get at 0x7fbe5a1698b8>
0
1
2
3
4

答案 3 :(得分:3)

Python函数始终返回唯一值。逗号运算符是元组的构造函数,因此self.first_name, self.last_name求值为元组,而元组是函数返回的实际值。

答案 4 :(得分:2)

  

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

我只是添加一个名称并打印从函数返回的结果。 结果类型为“元组”。

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

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


我不知道您是否听说过'头等功能'。 Python是具有“first class function

的语言

我希望我的回答可以帮到你。 快乐的编码。

答案 5 :(得分:0)

还提到here,您可以使用:

import collections
Point = collections.namedtuple('Point', ['x', 'y'])
p = Point(1, y=2)
>>> p.x, p.y
1 2
>>> p[0], p[1]
1 2