Digamos que tengo una función de Python que devuelve múltiples valores en una tupla:
def func():
return 1, 2
¿Hay una buena manera de ignorar uno de los resultados en lugar de simplemente asignarlo a una variable temporal? Digamos que si solo me interesara el primer valor, ¿hay una mejor manera que esta?
x, temp = func()
~
como sintaxis para ignorar una variable de retorno particularRespuestas:
Una convención común es usar una "_" como nombre de variable para los elementos de la tupla que desea ignorar. Por ejemplo:
fuente
Puede usar
x = func()[0]
para devolver el primer valor,x = func()[1]
para devolver el segundo, etc.Si desea obtener múltiples valores a la vez, use algo como
x, y = func()[2:4]
.fuente
func()[2:4]
si solo desea algunos de los valores de retorno._, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
es menos claro que llamar a la función varias veces, pero esa es solo mi opinión. Si su función devuelve tantos elementos, creo que sería preferible usar numpy:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...x, __, y = func()
Si está usando Python 3, puede usar la estrella antes de una variable (en el lado izquierdo de una tarea) para que sea una lista en el desempaque.
fuente
a, *_ = f()
para ignorar el número arbitrario de valores devueltos despuésa
.Recuerde, cuando devuelve más de un artículo, realmente está devolviendo una tupla. Entonces puedes hacer cosas como esta:
fuente
La práctica común es usar la variable ficticia
_
(subrayado simple), como muchos han indicado aquí antes.Sin embargo, para evitar colisiones con otros usos de ese nombre de variable (vea esta respuesta), podría ser una mejor práctica usar
__
(doble guión bajo) como una variable desechable, como lo señala ncoghlan . P.ej:fuente
a, _, _ = 1,8,9
. Hasta ese momento, almacena el resultado de la última instrucción ejecutada que, si desea capturar, normalmente usaría una variable para almacenar ese valor. Y esta es la razón por la cual '_' es el nombre de variable sugerido para capturar valores basura. Los valores '_' se sobrescriben poco después de que se ejecute otra instrucción. En el caso de '_ _', el valor permanecería allí hasta que GC lo limpie.Tres elecciones simples.
Obvio
Horrible
Y hay formas de hacer esto con un decorador.
fuente
_
variable. Es muy obvio que estás ignorando un valorx, _ = func()
es horrible yx = func()[0]
es obvio. ¿Asignar a una variable y luego no usarla? La función está devolviendo una tupla; indexarlo como una tupla.;)
, los accesos de lista comoa[0]
,a[:]
(copia de la lista),a[::2]
(cada dos elementos) ya[i:] + a[:i]
(rotar una lista), también son evidentes y canónicos.La mejor solución probablemente sea nombrar cosas en lugar de devolver tuplas sin sentido. A menos que haya alguna lógica detrás del orden de los artículos devueltos.
Incluso podría usar namedtuple si desea agregar información adicional sobre lo que está devolviendo (no es solo un diccionario, estas son coordenadas):
Si los objetos dentro de su diccionario / tupla están fuertemente unidos, entonces puede ser una buena idea incluso definir una clase para ello. De esa manera, también podrá definir la interacción entre objetos de este tipo y ofrecer una API sobre cómo trabajar con ellos. Una pregunta natural que sigue: ¿ Cuándo debería usar clases en Python? .
fuente
Esta me parece la mejor opción:
No es críptico ni feo (como el método func () [index]), y establece claramente su propósito.
fuente
Esta no es una respuesta directa a la pregunta. Más bien responde a esta pregunta: "¿Cómo elijo una salida de función específica de muchas opciones posibles?".
Si puede escribir la función (es decir, no está en una biblioteca que no puede modificar), agregue un argumento de entrada que indique lo que desea de la función. Conviértalo en un argumento con nombre con un valor predeterminado para que en el "caso común" ni siquiera tenga que especificarlo.
Este método le da a la función "advertencia avanzada" con respecto a la salida deseada. En consecuencia, puede omitir el procesamiento innecesario y solo hacer el trabajo necesario para obtener el resultado deseado. Además, debido a que Python hace tipeo dinámico, el tipo de retorno puede cambiar. Observe cómo el ejemplo devuelve un escalar, una lista o una tupla ... ¡lo que quiera!
fuente
Si esta es una función que usa todo el tiempo pero siempre descarta el segundo argumento, diría que es menos complicado crear un alias para la función sin usar el segundo valor de retorno
lambda
.fuente
Cuando tiene muchos resultados de una función y no desea llamarla varias veces, creo que la forma más clara de seleccionar los resultados sería:
Como ejemplo de trabajo mínimo, también demuestra que la función se llama solo una vez:
Y los valores son los esperados:
Por conveniencia, los índices de lista de Python también se pueden usar:
Devuelve: a = 3 yb = 12
fuente