Disons que j'ai une fonction Python qui renvoie plusieurs valeurs dans un tuple:
def func():
return 1, 2
Existe-t-il un bon moyen d'ignorer l'un des résultats plutôt que de simplement l'affecter à une variable temporaire? Dites si je n'étais intéressé que par la première valeur, y a-t-il un meilleur moyen que celui-ci:
x, temp = func()
~
comme syntaxe pour ignorer une variable de retour particulièreRéponses:
Une convention courante consiste à utiliser un "_" comme nom de variable pour les éléments du tuple que vous souhaitez ignorer. Par exemple:
la source
Vous pouvez utiliser
x = func()[0]
pour renvoyer la première valeur,x = func()[1]
pour renvoyer la seconde, etc.Si vous souhaitez obtenir plusieurs valeurs à la fois, utilisez quelque chose comme
x, y = func()[2:4]
.la source
func()[2:4]
si vous ne voulez que certaines des valeurs de retour._, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
c'est moins clair que d'appeler la fonction plusieurs fois, mais c'est juste mon avis. Si votre fonction renvoie autant d'éléments, je pense que l'utilisation de numpy serait préférable:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...x, __, y = func()
Si vous utilisez Python 3, vous pouvez utiliser l'étoile devant une variable (sur le côté gauche d'une affectation) pour qu'elle soit une liste dans le déballage.
la source
a, *_ = f()
pour ignorer le nombre arbitraire de valeurs renvoyées aprèsa
.N'oubliez pas que lorsque vous retournez plusieurs articles, vous retournez vraiment un tuple. Vous pouvez donc faire des choses comme ça:
la source
La pratique courante consiste à utiliser la variable fictive
_
(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 cette réponse), il pourrait être préférable d'utiliser
__
(double soulignement) à la place comme variable jetable , comme indiqué par ncoghlan . Par exemple:la source
a, _, _ = 1,8,9
. Jusque-là, il stocke le résultat de la dernière instruction exécutée qui, si vous voulez intercepter, vous utiliseriez normalement une variable pour stocker cette valeur. Et c'est pourquoi, '_' est le nom de variable suggéré pour attraper les valeurs indésirables. Les valeurs '_' sont écrasées peu de temps après l'exécution d'une autre instruction. En cas de '_ _', la valeur resterait là jusqu'à ce que GC la nettoie.Trois choix simples.
Évident
Hideux
Et il existe des moyens de le faire avec un décorateur.
la source
_
variable. Il est très évident que vous ignorez une valeurx, _ = func()
est hideux etx = func()[0]
évident. Assigner à une variable et ne pas l'utiliser ensuite? La fonction renvoie un tuple; indexez-le comme un tuple.;)
, les accesseurs de liste tels quea[0]
,a[:]
(copie de liste),a[::2]
(tous les deux éléments) eta[i:] + a[:i]
(rotation d'une liste), sont en effet également évidents et canoniques.La meilleure solution est probablement de nommer les choses au lieu de renvoyer des tuples sans signification. Sauf s'il y a une certaine logique derrière l'ordre des articles retournés.
Vous pouvez même utiliser namedtuple si vous souhaitez ajouter des informations supplémentaires sur ce que vous retournez (ce n'est pas seulement un dictionnaire, ce sont des coordonnées):
Si les objets de votre dictionnaire / tuple sont fortement liés, il peut être judicieux de même définir une classe pour lui. De cette façon, vous pourrez également définir l'interaction entre des objets de ce type et donner une API sur la façon de travailler avec eux. Une question naturelle qui suit: Quand devrais-je utiliser des classes en Python? .
la source
Cela me semble être le meilleur choix:
Ce n'est pas cryptique ou laid (comme la méthode func () [index]), et indique clairement votre objectif.
la source
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 pouvez é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 d'entrée qui indique ce que vous voulez retirer de la fonction. Faites-en un argument nommé avec une valeur par défaut afin que dans le "cas commun" vous n'ayez même pas à le spécifier.
Cette méthode donne la fonction "avertissement avancé" concernant la sortie souhaitée. Par conséquent, il peut ignorer le traitement inutile et ne faire que le travail nécessaire pour obtenir la sortie souhaitée. De plus, parce que Python effectue une frappe dynamique, le type de retour peut changer. Remarquez comment l'exemple retourne un scalaire, une liste ou un tuple ... tout ce que vous aimez!
la source
S'il s'agit d'une fonction que vous utilisez tout le temps mais que vous rejetez 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 à l'aide
lambda
.la source
Lorsque vous avez plusieurs sorties d'une fonction et que vous ne voulez pas l'appeler plusieurs fois, je pense que la manière la plus claire de sélectionner les résultats serait:
Comme exemple de travail minimum, démontrant également que la fonction n'est appelée qu'une seule fois:
Et les valeurs sont comme prévu:
Pour plus de commodité, les index de liste Python peuvent également être utilisés:
Renvoie: a = 3 et b = 12
la source