我写了以下代码:
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中的函数返回一个对象?
答案 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)
def myfun():
return 1, 2, 3
a, b, c = myfun()
虽然看起来
myfun()
会返回多个值,但实际上正在创建tuple
。它看起来有点特殊,但它实际上是形成元组的逗号,不是括号
所以是的,Python中发生的是从多个逗号分隔值到元组的内部转换,反之亦然。
虽然java中没有相应内容,但您可以使用array
或Collection
之类的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