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?

30
demandé sur martineau 2011-08-14 02:17:25

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))
38
répondu phihag 2016-11-27 11:34:48

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
8
répondu Dair 2016-11-27 11:37:08

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

1
répondu Karl Knechtel - away from home 2011-08-13 22:25:32

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.

1
répondu de1337ed 2011-08-13 22:25:57

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
0
répondu Jared Ng 2011-08-13 22:19:33

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
0
répondu Alexis Métaireau 2011-08-13 22:20:38

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?

-1
répondu shanmu ganathan 2018-07-06 12:01:50