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?
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.
def myfun():
return 1, 2, 3
a, b, c = myfun()
bien que cela ressemble à
myfun()
renvoie plusieurs valeurs, untuple
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 java vous pouvez facilement créer ce comportement en utilisant array
's ou de certains Collection
s 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
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
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.
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.