it-swarm.asia

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

20
User_Targaryen

由于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 将按照与Tuple等效的相同语义发出:

>>> 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。属性是管理属性的惯用方法,有关这些的更多信息,请参阅一个很好的答案 这里

28
Jim Fasarakis Hilliard

来自 Python Cookbook v.30

def myfun():
    return 1, 2, 3
a, b, c = myfun()

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

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

虽然在 Java中没有等效的东西 你可以使用array或像Collections这样的Lists轻松创建这种行为:

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
18
joc

这里实际上是返回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(查看详细信息请参阅 Python中“yield”关键字的作用是什么?

示例示例:

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
6
Kalpesh Dusane

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

3
Goyo

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

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

  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是具有' 第一类函数 '的语言

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

2
Junsuk Park

提到 这里 ,你可以用这个:

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
0
Ghazal