propias - ¿Cómo Python devuelve múltiples valores de una función?
lista de funciones de python (6)
Cada vez que se devuelven varios valores desde una función en Python, ¿siempre convierte los múltiples valores a una lista de múltiples valores y luego los devuelve desde la función?
Solo estoy agregando un nombre e imprimiendo el resultado que se obtiene de la función. El tipo de resultado es '' tupla ''.
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)
No sé si se ha enterado de la " función de primera clase ". Python es el lenguaje que tiene '' función de primera clase ''
Espero que mi respuesta te pueda ayudar. Feliz codificacion
He escrito el siguiente código:
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)
Obtengo la siguiente salida:
(''Allen'', ''Solly'')
Cada vez que se devuelven varios valores desde una función en Python, ¿convierte siempre los múltiples valores a una lista de múltiples valores y luego los devuelve desde la función?
¿Es todo el proceso igual que convertir los múltiples valores en una list
explícitamente y luego devolver la lista, por ejemplo en JAVA, ya que uno puede devolver solo un objeto desde una función en JAVA?
Aquí está volviendo realmente tuple
.
Si ejecuta este código en Python 3:
def get():
a = 3
b = 5
return a,b
number = get()
print(type(number))
print(number)
Salida:
<class ''tuple''>
(3, 5)
Pero si cambia la línea de código, return [a,b]
lugar de return a,b
y ejecute:
def get():
a = 3
b = 5
return [a,b]
number = get()
print(type(number))
print(number)
Salida:
<class ''list''>
[3, 5]
Solo está devolviendo un solo objeto que contiene múltiples valores.
Hay otra alternativa a la declaración de retorno para devolver múltiples valores, usar yield
(para verificar los detalles, consulte esto. ¿Qué hace la palabra clave "rendimiento" en Python? )
Ejemplo de muestra:
def get():
for i in range(5):
yield i
number = get()
print(type(number))
print(number)
for i in number:
print(i)
Salida:
<class ''generator''>
<generator object get at 0x7fbe5a1698b8>
0
1
2
3
4
Dado que la declaración de retorno en getName
especifica múltiples elementos :
def getName(self):
return self.first_name, self.last_name
Python devolverá un objeto contenedor que básicamente los contiene.
En este caso, devolver un conjunto de elementos separados por comas crea una tupla . Múltiples valores solo pueden ser devueltos dentro de contenedores .
Usemos una función más simple que devuelve múltiples valores:
def foo(a, b):
return a, b
Puede ver el código de bytes generado mediante el uso de dis.dis
, un desensamblador para el código de bytes de Python. Para valores separados por comas sin corchetes, se ve así:
>>> 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
Como puede ver, los valores se cargan primero en la pila interna con LOAD_FAST
y luego se BUILD_TUPLE
un BUILD_TUPLE
(que BUILD_TUPLE
los 2
elementos anteriores colocados en la pila). Python sabe crear una tupla debido a que las comas están presentes.
Alternativamente, podría especificar otro tipo de retorno, por ejemplo, una lista, utilizando []
. Para este caso, se BUILD_LIST
una BUILD_LIST
siguiendo la misma semántica que su equivalente de tupla:
>>> 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
El tipo de objeto devuelto realmente depende de la presencia de corchetes (para tuplas ()
se puede omitir si hay al menos una coma). []
crea listas y {}
conjuntos. Los diccionarios necesitan key:val
pares de key:val
.
Para resumir, se devuelve un objeto real . Si ese objeto es de un tipo contenedor, puede contener varios valores que dan la impresión de que se han devuelto varios resultados. El método habitual entonces es descomprimirlos directamente:
>>> first_name, last_name = f.getName()
>>> print (first_name, last_name)
Además de todo esto, sus formas Java se están filtrando en Python :-)
No uses captadores cuando escribas clases en Python, usa properties
. Las propiedades son la forma idiomática de administrar atributos, para más información sobre estos, vea una buena respuesta here .
def myfun():
return 1, 2, 3
a, b, c = myfun()
Aunque parece que
myfun()
devuelve múltiples valores, en realidad se está creando unatuple
. Parece un poco peculiar, pero en realidad es la coma que forma una tupla, no los paréntesis
Entonces, sí, lo que está sucediendo en Python es una transformación interna de múltiples valores separados por comas a una tupla y viceversa.
Aunque no hay un equivalente en java , puede crear fácilmente este comportamiento utilizando array
o algunas Collection
como las de la List
:
private static int[] sumAndRest(int x, int y) {
int[] toReturn = new int[2];
toReturn[0] = x + y;
toReturn[1] = x - y;
return toReturn;
}
Ejecutado de esta manera:
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);
}
resultado:
sum = 15
rest = 5
Las funciones de Python siempre devuelven un valor único. El operador de coma es el constructor de tuplas, por lo que self.first_name, self.last_name
evalúa como tupla y esa tupla es el valor real que la función está devolviendo.
mencionado también here , puedes usar esto:
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