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

Use*_*yen 23 python return function python-3.x

我写了以下代码:

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)
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

('Allen', 'Solly')
Run Code Online (Sandbox Code Playgroud)

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

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

Jim*_*ard 28

由于return语句getName指定了多个元素:

def getName(self):
   return self.first_name, self.last_name
Run Code Online (Sandbox Code Playgroud)

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

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

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

def foo(a, b):
    return a, b
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

如您所见,首先在内部堆栈上加载值LOAD_FAST,然后生成BUILD_TUPLE(抓取2堆栈上的先前元素).由于存在逗号,Python知道创建一个元组.

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

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

>>> first_name, last_name = f.getName()
>>> print (first_name, last_name)
Run Code Online (Sandbox Code Playgroud)

除此之外,你的Java方式正在渗入Python :-)

使用Python编写类时不要使用getter properties.属性是管理属性的惯用方法,有关这些的更多信息,请参阅此处的一个很好的答案.


joc*_*joc 19

来自Python Cookbook v.30

def myfun():
    return 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

a, b, c = myfun()
Run Code Online (Sandbox Code Playgroud)

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

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

虽然没有相应的东西,你可以使用arrays或Collections之类List的东西轻松创建这种行为:

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

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

    return toReturn;

}
Run Code Online (Sandbox Code Playgroud)

以这种方式执行:

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);

}
Run Code Online (Sandbox Code Playgroud)

结果:

sum = 15
rest = 5
Run Code Online (Sandbox Code Playgroud)


Kal*_*ane 6

这里实际上正在回归tuple.

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

def get():
    a = 3
    b = 5
    return a,b
number = get()
print(type(number))
print(number)
Run Code Online (Sandbox Code Playgroud)

输出:

<class 'tuple'>
(3, 5)
Run Code Online (Sandbox Code Playgroud)

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

def get():
    a = 3
    b = 5
    return [a,b]
number = get()
print(type(number))
print(number)
Run Code Online (Sandbox Code Playgroud)

输出:

<class 'list'>
[3, 5]
Run Code Online (Sandbox Code Playgroud)

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

return返回多个值的语句还有另一种选择,使用yield(查看详细信息请参阅"yield"关键字在Python中的作用是什么?)

示例示例:

def get():
    for i in range(5):
        yield i
number = get()
print(type(number))
print(number)
for i in number:
    print(i)
Run Code Online (Sandbox Code Playgroud)

输出:

<class 'generator'>
<generator object get at 0x7fbe5a1698b8>
0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)