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
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中发生的是从多个逗号分隔值到元组的内部转换,反之亦然.
虽然java中没有相应的东西,你可以使用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)
这里实际上正在回归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)