Considérez trois fonctions:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
Ils semblent tous retourner Aucun. Existe-t-il des différences entre le comportement de la valeur renvoyée de ces fonctions? Y a-t-il des raisons de préférer l'un à l'autre?
return None
implique pour moi que la fonction a parfois uneNone
valeur de non- retour, mais à l'emplacement dereturn None
, il n'y a pas une telle valeur de retour. Ecrire nonreturn
implique pour moi qu'il n'y a jamais de valeur de retour intéressante, un peu comme une "procédure" par opposition à une "fonction".return
implique d'exister très tôt à partir d'une "procédure" selon le point précédent.Réponses:
Sur le comportement réel, il n'y a pas de différence. Ils reviennent tous
None
et c'est tout. Cependant, il y a un temps et un lieu pour tout cela. Les instructions suivantes indiquent essentiellement comment les différentes méthodes doivent être utilisées (ou du moins comment on m'a appris qu'elles devraient être utilisées), mais ce ne sont pas des règles absolues, vous pouvez donc les mélanger si vous le jugez nécessaire.En utilisant
return None
Cela indique que la fonction est en effet destinée à renvoyer une valeur pour une utilisation ultérieure, et dans ce cas, elle retourne
None
. Cette valeurNone
peut ensuite être utilisée ailleurs.return None
n'est jamais utilisé s'il n'y a pas d'autres valeurs de retour possibles de la fonction.Dans l'exemple suivant, nous retournons
person
le smother
si leperson
donné est un humain. Si ce n'est pas un humain, nous revenonsNone
car leperson
n'a pasmother
(supposons que ce n'est pas un animal ou quelque chose).En utilisant
return
Ceci est utilisé pour la même raison que
break
dans les boucles. La valeur de retour n'a pas d'importance et vous souhaitez uniquement quitter la fonction entière. Il est extrêmement utile à certains endroits, même si vous n'en avez pas besoin souvent.Nous en avons 15
prisoners
et nous savons que l'un d'eux a un couteau. Nous passons en revue chacunprisoner
d'eux pour vérifier s'ils ont un couteau. Si nous frappons la personne avec un couteau, nous pouvons simplement quitter la fonction parce que nous savons qu'il n'y a qu'un seul couteau et aucune raison de vérifier le reste duprisoners
. Si nous ne trouvons pas leprisoner
couteau, nous lançons une alerte. Cela peut être fait de différentes manières et l'utilisationreturn
n'est probablement même pas la meilleure façon, mais ce n'est qu'un exemple pour montrer comment l'utiliserreturn
pour quitter une fonction.Remarque: vous ne devriez jamais le faire
var = find_prisoner_with_knife()
, car la valeur de retour n'est pas destinée à être interceptée.Ne pas utiliser
return
du toutCela reviendra également
None
, mais cette valeur n'est pas destinée à être utilisée ou capturée. Cela signifie simplement que la fonction s'est terminée avec succès. C'est fondamentalement la même chose quereturn
dans lesvoid
fonctions de langages tels que C ++ ou Java.Dans l'exemple suivant, nous définissons le nom de la mère de la personne, puis la fonction se termine après avoir terminé avec succès.
Remarque: vous ne devriez jamais le faire
var = set_mother(my_person, my_mother)
, car la valeur de retour n'est pas destinée à être interceptée.la source
var = get_mother()
est OK si vous passezvar
à d'autres fonctions qui acceptentNone
- "jamais" est un peu extrêmevar = get_mother()
ne peut pas être utilisée? À mon humble avis, c'est très bien de le faire. Vous devez juste vous assurer de vérifier une nonNone
valeur avecif var
avant de l'utiliser.Oui, ils sont tous pareils.
Nous pouvons examiner le code machine interprété pour confirmer qu'ils font tous exactement la même chose.
la source
dis.dis
retourneNone
: -Xdis.dis
également que certains numéros de ligne sontIls retournent chacun le même singleton
None
- Il n'y a pas de différence fonctionnelle.Je pense qu'il est raisonnablement idiomatique de laisser la
return
déclaration à moins que vous n'en ayez besoin pour sortir de la fonction plus tôt (auquel cas une mise à nureturn
est plus courante), ou renvoyer autre chose queNone
. Il est également logique et semble idiomatique d'écrirereturn None
quand il se trouve dans une fonction qui a un autre chemin qui renvoie autre chose queNone
. L'écriturereturn None
explicite est une indication visuelle pour le lecteur qu'il existe une autre branche qui renvoie quelque chose de plus intéressant (et que le code appelant devra probablement gérer les deux types de valeurs de retour).Souvent en Python, les fonctions qui retournent
None
sont utilisées comme desvoid
fonctions en C - Leur but est généralement d'opérer sur les arguments d'entrée en place (sauf si vous utilisez des données globales ( frissons )). Le retourNone
rend généralement plus explicite la mutation des arguments. Cela rend un peu plus clair pourquoi il est logique de laisser l'return
énoncé du point de vue des «conventions linguistiques».Cela dit, si vous travaillez dans une base de code qui a déjà des conventions prédéfinies autour de ces choses, je ferais certainement de même pour aider la base de code à rester uniforme ...
la source
return
instruction, elle revientNone
.Ruby
etJavascript
adoptent la même approche que python. Je suis sûr qu'il ya des exemples de langages de haut niveau qui disent « vide » dans l'expression , mais je ne peux pas penser à tout au moment (peut - être si l' on considèreJava
un langage de haut niveau) ... Comment serait singe-patcher une fonction (qui est utile pour se moquer entre autres des tests) fonctionne-t-elle dans un monde hypothétique où python a unvoid
mot-clé qui fait en sorte que la fonction ne retourne rien? (De plus, comme je l'ai déjà dit, vous n'avez pas besoin de me convaincre qu'il s'agit d'un mauvais design. Je ne peux rien faire même si vous avez raison)Comme d'autres l'ont répondu, le résultat est exactement le même,
None
est retourné dans tous les cas.La différence est stylistique, mais veuillez noter que PEP8 nécessite une utilisation cohérente:
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
Fondamentalement, si vous retournez une
None
valeur nulle dans une fonction, cela signifie que la valeur de retour a un sens et est destinée à être interceptée par les appelants. Donc, quand vous revenezNone
, il doit aussi être explicite, pour transmettreNone
dans ce cas a du sens, c'est une des valeurs de retour possibles.Si vous n'avez pas besoin du tout de retour, votre fonction fonctionne essentiellement comme une procédure au lieu d'une fonction, donc n'incluez pas l'
return
instruction.Si vous écrivez une fonction de type procédure et qu'il est possible de revenir plus tôt (c'est-à-dire que vous avez déjà terminé à ce stade et n'avez pas besoin d'exécuter le reste de la fonction), vous pouvez utiliser un
return
s vide pour signaler au lecteur c'est juste une fin précoce de l'exécution et laNone
valeur retournée implicitement n'a aucune signification et n'est pas destinée à être interceptée (la fonction de type procédure retourne toujours deNone
toute façon).la source
En termes de fonctionnalité, ce sont tous les mêmes, la différence entre eux réside dans la lisibilité et le style du code (ce qui est important à considérer)
la source