Comment Python renvoie-t-il plusieurs valeurs d'une fonction?

j'ai écrit le code suivant:

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)

j'ai le Sortie:

('Allen', 'Solly')

chaque fois que des valeurs multiples sont retournées d'une fonction en python, est-ce qu'il convertit toujours les valeurs multiples en un liste des valeurs multiples et le renvoie de la fonction?

l'ensemble du processus est-il identique à la conversion des valeurs multiples en un list explicitement et en retournant la liste, par exemple en JAVA, comme on ne peut retourner qu'un seul objet d'une fonction en JAVA?

19
demandé sur User_Targaryen 2016-09-06 12:54:25

6 réponses

depuis la déclaration de retour dans getName spécifie plusieurs éléments:

def getName(self):
   return self.first_name, self.last_name

Python retournera un objet container qui essentiellement les contient.

dans ce cas, retourner un séparés par des virgules ensemble d'éléments crée un n-uplet. Plusieurs valeurs peut seulement être retourné à l'intérieur des conteneurs.

utilisons une fonction plus simple qui renvoie plusieurs valeurs:

def foo(a, b):
    return a, b

vous pouvez regarder le code byte généré en utilisant dis.dis, un démonteur pour Python bytecode. Pour les valeurs séparées par des virgules avec n'importe quelle parenthèse, il ressemble à ceci:

>>> 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

Comme vous pouvez le voir, les valeurs sont d'abord chargés sur la pile interne avec LOAD_FAST et BUILD_TUPLE (saisir le précédent 2 les éléments placés sur la pile) est généré. Python sait créer un tuple à cause des virgules présent.

vous pouvez également spécifier un autre type de retour, par exemple une liste, en utilisant []. Pour ce cas, un BUILD_LIST va être émises à la suite de la même sémantique que c'est tuple équivalent:

>>> 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

Le type d'objet renvoyé dépend vraiment de la présence de crochets (pour les tuples () peut être omis s'il y a au moins une virgule). [] crée des listes et des {} ensembles. Dictionnaires besoin key:val pair.

Pour résumer, un seul objet est retourné. Si cet objet est d'un type de conteneur, il peut contenir des valeurs multiples donnant l'impression de résultats multiples retournés. La méthode habituelle consiste à décompresser directement:

>>> first_name, last_name = f.getName()
>>> print (first_name, last_name)

en marge de tout cela, vos Java ways fuient en Python : -)

Ne pas utiliser les méthodes de lecture lors de l'écriture de classes en Python, utilisez properties. Les propriétés sont la façon idiomatique de Gérer les attributs, pour plus sur ceux-ci, voir une bonne réponse ici.

27
répondu Jim Fasarakis Hilliard 2018-04-26 07:26:08

Python Cookbook v. 30

def myfun():
    return 1, 2, 3

a, b, c = myfun()

bien que cela ressemble à myfun() renvoie plusieurs valeurs, un tuple est réellement créé. il semble un peu particulier, mais c'est en fait la virgule Qui forme un tuple, pas les parenthèses

donc oui, ce qui se passe en Python est une transformation interne de plusieurs valeurs séparées par des virgules vers un tuple et vice-versa.

bien qu'il n'y ait pas d'équivalent en vous pouvez facilement créer ce comportement en utilisant array's ou de certains Collections List s:

private static int[] sumAndRest(int x, int y) {
    int[] toReturn = new int[2];

    toReturn[0] = x + y;
    toReturn[1] = x - y;

    return toReturn;

}

Exécuté de cette façon:

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);

}

résultat:

sum = 15
rest = 5
17
répondu joc 2017-07-10 17:49:10

Ici, Il est en fait le retour tuple.

si vous exécutez ce code en Python 3:

def get():
    a = 3
    b = 5
    return a,b
number = get()
print(type(number))
print(number)

Sortie :

<class 'tuple'>
(3, 5)

mais si vous changez la ligne de code return [a,b] au lieu de return a,b et de l'exécuter :

def get():
    a = 3
    b = 5
    return [a,b]
number = get()
print(type(number))
print(number)

Sortie :

<class 'list'>
[3, 5]

il ne retourne qu'un seul objet qui contient plusieurs valeurs.

il y a une autre alternative à return déclaration pour retourner plusieurs valeurs, utilisez yield( à vérifier dans les détails de voir ce Que fait le mot clé" yield " en Python?)

Exemple D'Exemple:

def get():
    for i in range(5):
        yield i
number = get()
print(type(number))
print(number)
for i in number:
    print(i)

Sortie :

<class 'generator'>
<generator object get at 0x7fbe5a1698b8>
0
1
2
3
4
6
répondu Kalpesh Dusane 2017-05-23 12:26:17

les fonctions Python renvoient toujours une valeur unique. L'opérateur virgule est le constructeur de tuples, donc self.first_name, self.last_name évalue à un tuple et que tuple est la valeur réelle que la fonction renvoie.

3
répondu Goyo 2016-09-06 10:00:03

chaque fois que des valeurs multiples sont retournées d'une fonction en python, est-ce qu'il convertit toujours les valeurs multiples en un liste de valeurs multiples et le renvoie à partir de la fonction??

Je ne fais qu'ajouter un nom et imprimer le résultat qui revient de la fonction. le type de résultat est" tuple'.

  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)



je ne sais pas si vous avez entendu parler de 'première fonction de classe'. Python est le langage qui a 'fonction de première classe'

j'espère que ma réponse peut vous aider. Heureux de codage.

2
répondu Junsuk Park 2016-09-06 10:12:24

et aussi ici, vous pouvez utiliser ceci:

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
0
répondu Ghazal 2018-06-05 20:48:45