web-dev-qa-db-fra.com

Ignorer python valeur de retour multiple

Supposons que j’ai une fonction Python qui renvoie plusieurs valeurs dans un tuple:

def func():
    return 1, 2

Existe-t-il un moyen intéressant d’ignorer l’un des résultats plutôt que d’affecter une variable temporaire? Dites si la première valeur ne m'intéresse que s'il existe un meilleur moyen que celui-ci:

x, temp = func()
244
Mat

Une convention courante consiste à utiliser un "_" comme nom de variable pour les éléments du tuple que vous souhaitez ignorer. Par exemple:

def f():
    return 1, 2, 3

_, _, x = f()
212
Brian Clapper

Vous pouvez utiliser x = func()[0] pour renvoyer la première valeur, x = func()[1] pour renvoyer la seconde, etc.

Si vous voulez obtenir plusieurs valeurs à la fois, utilisez quelque chose comme x, y = func()[2:4].

525
Luke Woodward

Si vous utilisez Python 3, vous pouvez utiliser l'étoile avant une variable (à gauche d'une affectation) pour en faire une liste lors de la décompression.

# Example 1: a is 1 and b is [2, 3]

a, *b = [1, 2, 3]

# Example 2: a is 1, b is [2, 3], and c is 4

a, *b, c = [1, 2, 3, 4]

# Example 3: b is [1, 2] and c is 3

*b, c = [1, 2, 3]       

# Example 4: a is 1 and b is []

a, *b = [1]
80

Rappelez-vous que lorsque vous retournez plus d'un article, vous retournez vraiment un tuple. Donc, vous pouvez faire des choses comme ça:

def func():
    return 1, 2

print func()[0] # prints 1
print func()[1] # prints 2
17
Evan Fosmark

La pratique courante consiste à utiliser la variable muette _ (soulignement simple), comme beaucoup l'ont indiqué précédemment.

Cependant, pour éviter les collisions avec d’autres utilisations de ce nom de variable (voir this réponse), il pourrait être préférable d’utiliser __ (double trait de soulignement) à la place comme variable jetable, comme indiqué par ncoghlan . Par exemple.:

x, __ = func()
16
lackadaisical

Trois choix simples.

Évident

x, _ = func()

x, junk = func()

Hideux

x = func()[0]

Et il y a moyen de faire cela avec un décorateur.

def val0( aFunc ):
    def pick0( *args, **kw ):
        return aFunc(*args,**kw)[0]
    return pick0

func0= val0(func)
15
S.Lott

La meilleure solution est probablement de nommer les choses au lieu de renvoyer des nuplets sans signification. Sauf s'il y a une certaine logique derrière l'ordre des articles retournés.

def func():
    return {'lat':1, 'lng':2}

latitude = func()['lat']
print(latitude)

Vous pouvez même utiliser namedtuple si vous souhaitez ajouter des informations supplémentaires sur ce que vous retournez:

from collections import namedtuple 
Coordinates = namedtuple('Coordinates', ['lat', 'lng'])

def func():
    return Coordinates(lat=1, lng=2)

latitude = func().lat
print(latitude)

Si les objets que vous retournez sont souvent ensemble, il peut être judicieux de définir une classe.

5
cglacet

Cela semble être le meilleur choix pour moi:

val1, val2, ignored1, ignored2 = some_function()

Ce n'est pas cryptique ou laid (comme la méthode func () [index]), et indique clairement votre but.

4
kmelvn

Ce n'est pas une réponse directe à la question. Il répond plutôt à cette question: "Comment choisir une sortie de fonction spécifique parmi de nombreuses options possibles?".

Si vous êtes capable d’écrire la fonction (c’est-à-dire qu’elle ne se trouve pas dans une bibliothèque que vous ne pouvez pas modifier), ajoutez un argument en entrée qui indique ce que vous voulez dans la fonction. Faites-en un argument nommé avec une valeur par défaut afin que, dans le "cas ordinaire", vous n'ayez même pas à le spécifier.

    def fancy_function( arg1, arg2, return_type=1 ):
        ret_val = None
        if( 1 == return_type ):
            ret_val = arg1 + arg2
        Elif( 2 == return_type ):
            ret_val = [ arg1, arg2, arg1 * arg2 ]
        else:
            ret_val = ( arg1, arg2, arg1 + arg2, arg1 * arg2 ) 
        return( ret_val )

Cette méthode donne la fonction "avertissement avancé" concernant la sortie souhaitée. Par conséquent, il peut ignorer les traitements inutiles et ne faire que le travail nécessaire pour obtenir le résultat souhaité. De plus, étant donné que Python effectue une frappe dynamique, le type de retour peut changer. Remarquez comment l'exemple renvoie un scalaire, une liste ou un tuple ... comme vous le souhaitez!

4
1-ijk

Si c'est une fonction que vous utilisez tout le temps mais que vous jetez toujours le deuxième argument, je dirais qu'il est moins compliqué de créer un alias pour la fonction sans la deuxième valeur de retour en utilisant lambda.

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 
2
Chrigi

Lorsque vous avez plusieurs sorties d'une fonction et que vous ne voulez pas l'appeler plusieurs fois, je pense que le moyen le plus simple de sélectionner les résultats est le suivant:

results = fct()
a,b = [results[i] for i in list_of_index]

Comme exemple de travail minimum, démontrant également que la fonction est appelée une seule fois:

def fct(a):
    b=a*2
    c=a+2
    d=a+b
    e=b*2
    f=a*a
    print("fct called")
    return[a,b,c,d,e,f]

results=fct(3)
> fct called

x,y = [results[i] for i in [1,4]]

Et les valeurs sont comme prévu:

results
> [3,6,5,9,12,9]
x
> 6
y
> 12

Par commodité, les index de liste Python peuvent également être utilisés:

x,y = [results[i] for i in [0,-2]]

Retourne: a = 3 et b = 12

2
jeannej