La fonction renvoie None sans instruction return
Je viens d'apprendre (j'apprends) comment les paramètres de fonction fonctionnent en Python, et j'ai commencé à l'expérimenter sans raison apparente, quand ceci:
def jiskya(x, y):
if x > y:
print y
else:
print x
print(jiskya(2, 3))
A donné la sortie:
>>>
2
None
D'où vient le None
? Et c'est quoi?
7 réponses
C'est la valeur de retour de la fonction, que vous imprimez. S'il n'y a pas d'instruction return (ou juste un return
sans argument), Un return None
implicite est ajouté à la fin d'une fonction.
Vous voulez probablement retourner les valeurs dans la fonction au lieu de les imprimer:
def jiskya(x, y):
if x > y:
return y
else:
return x
print(jiskya(2, 3))
Ok, pour commencer quand vous faites ceci:
print(jiskya(2, 3))
Vous obtenez quelque chose à peu près équivalent à ceci:
print(print(2))
Alors, que se passe-t-il? Le print(2)
imprime 2, et renvoie None
qui est imprimé par l'appel externe. Assez simple.
Maintenant, regardez ceci:
def hello():
return 2
Si vous le faites:
print(hello())
Vous obtenez 2 parce que si vous imprimez une fonction, vous obtenez quelle que soit la valeur return
. (La valeur return
est indiquée par la valeur return someVariable
.
Maintenant même bien que print
n'ait pas de parenthèse comme la plupart des fonctions, c'est une fonction juste un peu spéciale à cet égard. Ce n'imprimer retour? Rien. Ainsi, lorsque vous print print someVariable
, vous obtiendrez None
, comme la deuxième partie parce que la valeur de retour de l'imprimé est None
.
Donc, comme d'autres l'ont dit:
def jiskya(x, y):
if x > y:
print(y)
else:
print(x)
Devrait être réécrit:
def jiskya(x, y):
if x > y:
return y
else:
return x
D'où vient le "Aucun"?
La fonction.
Et qu'est-ce que c'est?
C'est ce que la fonction a renvoyé.
En Python, chaque fonction renvoie quelque chose. Il pourrait "être plusieurs choses" en utilisant un tuple, ou il pourrait "être rien" en utilisant None
, mais il doit retourner quelque chose. C'est ainsi que nous traitons du fait qu'il n'y a aucun moyen de spécifier un type de retour (ce qui n'aurait aucun sens puisque vous ne spécifiez pas de types pour autre chose). Lorsqu'il est interprété comme une chaîne pour l'impression, None
est remplacé par la chaîne "None".
None
est un objet spécial qui est censé représenter l'absence de toute chose réelle. Son type est NoneType
(c'est une instance de cette classe). Chaque fois que vous ne renvoyez rien explicitement, vous ne renvoyez implicitement rien.
Vous avez écrit la fonction pour imprimer l'une des deux valeurs x
ou y
, mais pour ne rien renvoyer. Donc None
a été retourné. Ensuite, vous avez demandé à Python d'imprimer le résultat de l'appel fonction. Donc, il a appelé la fonction (en imprimant l'une des valeurs), puis a imprimé la valeur de retour, qui était None
, comme le texte "None".
Ya, fondamentalement, vous utilisez des instructions d'impression dans votre fonction comme un moyen de retourner des informations. Vous ne devriez pas faire cela. Print N'est pas la même chose qu'une déclaration de retour. Si vous voulez simplement que votre fonction donne votre réponse sans le none, tapez simplement jiskya (2, 3) à la place. Vous verrez ce que la fonction jette parce que vous avez des instructions d'impression dans la fonction. Si à la place vous tapiez " return "dans votre fonction, cela ne vous donnerait rien sans le" print " précédant l'appel de la fonction.
Le problème est que vous avez écrit print jiskya(2,3)
. Vous passez la valeur de retour de jiskya
à la fonction print
. jiskya
imprime lui-même x
ou y
, c'est pourquoi vous voyez l'2. Mais alors le print
dans l'instruction print jiskya(2, 3)
s'exécute sans argument.
Pour l'interprète, c'est une simplification de ce qui se passe:
print jiskya(2,3)
>> Executing jiskya with arguments 2, 3
>> jiskya evaulates `print x`
>> 2 is printed
>> Function jiskya exits with no return value
print None
>> None is printed
Vous faites deux impressions, la première dans le corpus de votre fonction et la seconde imprime le résultat de la fonction, qui n'est en fait aucun.
Vous devriez plutôt faire quelque chose comme ceci:
def yourfunction(x, y):
if x > y:
return y
else:
return x
Puis,
>>> print yourfunction(2, 3)
2
Je vois toutes vos réponses, dire la même chose. Jetez un oeil à ce code:
def factorial(x):
if x == 0 or x == 1:
return (1)
else:
return (x * factorial(x-1))
x = (int(input(print('Enter a number: '))))
print(factorial(x))
Et la sortie:
Enter a number:
None
J'ai donc utilisé le retour seulement. Pourquoi est-ce que je vois le méchant none alors?