web-dev-qa-db-fra.com

Comment puis-je retourner deux valeurs d'une fonction en Python?

Je voudrais renvoyer deux valeurs d'une fonction dans deux variables distinctes. Par exemple:

def select_choice():
    loop = 1
    row = 0
    while loop == 1:
        print('''Choose from the following options?:
                 1. Row 1
                 2. Row 2
                 3. Row 3''')

        row = int(input("Which row would you like to move the card from?: "))
        if row == 1:
            i = 2
            card = list_a[-1]
        Elif row == 2:
            i = 1
            card = list_b[-1]
        Elif row == 3:
            i = 0
            card = list_c[-1]
        return i
        return card

Et je veux pouvoir utiliser ces valeurs séparément. Lorsque j'ai essayé d'utiliser return i, card, il retourne un Tuple et ce n'est pas ce que je veux.

187
Lycon

Vous ne pouvez pas renvoyer deux valeurs, mais vous pouvez renvoyer un Tuple ou un list et le décompresser après l'appel:

def select_choice():
    ...
    return i, card  # or [i, card]

my_i, my_card = select_choice()

En ligne return i, cardi, card signifie créer un tuple. Vous pouvez également utiliser des parenthèses comme return (i, card), mais les n-uplets sont créés par des virgules, les parenthèses ne sont donc pas obligatoires. Mais vous pouvez utiliser des parenthèses pour rendre votre code plus lisible ou pour scinder le tuple sur plusieurs lignes. Il en va de même pour la ligne my_i, my_card = select_choice().

Si vous souhaitez renvoyer plus de deux valeurs, envisagez d'utiliser un nommé Tuple . Cela permettra à l'appelant de la fonction d'accéder aux champs de la valeur renvoyée par leur nom, ce qui est plus lisible. Vous pouvez toujours accéder aux éléments du tuple par index. Par exemple, dans la méthode Schema.loads, le cadre Marshmallow renvoie un UnmarshalResult qui est un namedtuple . Alors tu peux faire:

data, errors = MySchema.loads(request.json())
if errors:
    ...

ou

result = MySchema.loads(request.json())
if result.errors:
    ...
else:
    # use `result.data`

Dans d'autres cas, vous pouvez renvoyer un dict de votre fonction:

def select_choice():
    ...
    return {'i': i, 'card': card, 'other_field': other_field, ...}

Mais vous voudrez peut-être envisager de renvoyer une instance d'une classe utilitaire, qui encapsule vos données:

class ChoiceData():
    def __init__(self, i, card, other_field, ...):
        # you can put here some validation logic
        self.i = i
        self.card = card
        self.other_field = other_field
        ...

def select_choice():
    ...
    return ChoiceData(i, card, other_field, ...)

choice_data = select_choice()
print(choice_data.i, choice_data.card)
384
warvariuc

Je voudrais renvoyer deux valeurs d'une fonction dans deux variables distinctes.

À quoi vous attendez-vous à ce que cela ressemble à l'appel terminé? Vous ne pouvez pas écrire a = select_choice(); b = select_choice() parce que la fonction serait appelée deux fois.

Les valeurs ne sont pas retournées "dans les variables"; ce n'est pas ainsi que Python fonctionne. Une fonction retourne des valeurs (objets). Une variable est juste un nom pour une valeur dans un contexte donné. Lorsque vous appelez une fonction et affectez la valeur de retour quelque part, vous attribuez un nom à la valeur reçue dans le contexte de l'appel. La fonction ne met pas la valeur "dans une variable" pour vous, l'affectation fait (peu importe que la variable ne soit pas "stockage" pour la valeur, mais encore, juste un nom).

Quand j'ai essayé d'utiliser return i, card, il retourne un Tuple et ce n'est pas ce que je veux.

En fait, c'est exactement ce que vous voulez. Tout ce que vous avez à faire est de séparer à nouveau la Tuple.

Et je veux pouvoir utiliser ces valeurs séparément.

Il suffit donc de saisir les valeurs dans la variable Tuple.

La façon la plus simple de le faire est de décompresser:

a, b = select_choice()
25
Karl Knechtel

Je pense que ce que tu veux est un tuple. Si vous utilisez return (i, card), vous pouvez obtenir ces deux résultats en:

i, card = select_choice()
17
heinrich5991
def test():
    ....
    return r1, r2, r3, ....

>> ret_val = test()
>> print ret_val
(r1, r2, r3, ....)

maintenant, vous pouvez faire tout ce que vous voulez avec votre tuple.

8
Amin
def test():
    r1 = 1
    r2 = 2
    r3 = 3
    return r1, r2, r3

x,y,z = test()
print x
print y
print z


> test.py 
1
2
3
4
user8541092

Et ceci est une alternative.Si vous retournez sous forme de liste, il est simple d’obtenir les valeurs.

def select_choice():
    ...
    return [i, card]

values = select_choice()

print values[0]
print values[1]
1
praveen

Vous pouvez aussi renvoyer plus d’une valeur en utilisant list. Vérifiez le code ci-dessous

def newFn():    #your function
  result = []    #defining blank list which is to be return
  r1 = 'return1'    #first value
  r2 = 'return2'    #second value
  result.append(r1)    #adding first value in list
  result.append(r2)    #adding second value in list
  return result    #returning your list

ret_val1 = newFn()[1]    #you can get any desired result from it
print ret_val1    #print/manipulate your your result
1
kaushik karan