首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python如何从一个函数返回多个值?

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

Stack Overflow用户
提问于 2016-09-06 17:54:25
回答 4查看 105.4K关注 0票数 27

我写了以下代码:

代码语言:javascript
复制
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)

我得到了以下输出:

代码语言:javascript
复制
('Allen', 'Solly')

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-06 17:59:13

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

代码语言:javascript
复制
def getName(self):
   return self.first_name, self.last_name

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

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

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

代码语言:javascript
复制
def foo(a, b):
    return a, b

您可以查看使用dis.dis生成的字节码,这是一种Python字节码的反汇编程序。对于不带任何括号的逗号分隔值,如下所示:

代码语言:javascript
复制
>>> 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知道创建一个元组。

您也可以使用[]指定另一种返回类型,例如list。在这种情况下,将按照与元组等效的相同语义发出BUILD_LIST

代码语言:javascript
复制
>>> 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对。

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

代码语言:javascript
复制
>>> first_name, last_name = f.getName()
>>> print (first_name, last_name)

顺便说一句,您的Java方法正在泄漏到Python中:-)

在Python中编写类时,不要使用getters,而要使用properties。属性是管理属性的惯用方法,有关这些属性的更多信息,请参阅不错的答案here

票数 34
EN

Stack Overflow用户

发布于 2016-09-06 18:13:06

在这里,它实际上是返回tuple

如果在Python 3中执行以下代码:

代码语言:javascript
复制
def get():
    a = 3
    b = 5
    return a,b
number = get()
print(type(number))
print(number)

输出:

代码语言:javascript
复制
<class 'tuple'>
(3, 5)

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

代码语言:javascript
复制
def get():
    a = 3
    b = 5
    return [a,b]
number = get()
print(type(number))
print(number)

输出:

代码语言:javascript
复制
<class 'list'>
[3, 5]

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

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

示例:

代码语言:javascript
复制
def get():
    for i in range(5):
        yield i
number = get()
print(type(number))
print(number)
for i in number:
    print(i)

输出:

代码语言:javascript
复制
<class 'generator'>
<generator object get at 0x7fbe5a1698b8>
0
1
2
3
4
票数 6
EN

Stack Overflow用户

发布于 2016-09-06 18:00:04

Python函数总是返回唯一的值。逗号运算符是元组的构造函数,因此self.first_name, self.last_name的计算结果是一个元组,而该元组是函数返回的实际值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39345995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档