Python : commandes "print" et "return"

Bonjour à tous,

Je vois bien qu’il existe une différence entre les deux commandes énoncées dans le titre, mais je ne sais pas exactement ce qu’elles font.

Partons d’un exemple, avec une fonction très simple qui me donne le nombre maximum entre deux nombres :

def maximum_ret(x,y):
    if x>y:
        return(x)
    elif x==y:
        return("Les deux nombres sont égaux")
    elif y>x:
        return(y)
def maximum_pri(x,y):
    if x>y:
        print(x)
    elif x==y:
        print("Les deux nombres sont égaux")
    elif y>x:
        print(y)

A priori, ces deux fonctions me donnent le même résultat :

>>> maximum_ret(3,4)
4
>>> maximum_pri(3,4)
4
>>> maximum_ret(42,42)
'Les deux nombres sont égaux'
>>> maximum_pri(42,42)
Les deux nombres sont égaux

Pourtant :

>>> maximum_ret(3,4)==maximum_pri(3,4)
False

Au début je pensais que ça venait du fait que ce n’était pas la même fonction définie, mais j’ai fait un test de type :

>>> type(maximum_pri(42,42))
<class 'NoneType'>
>>> type(maximum_ret(42,42))
<class 'str'>

Donc il s’avère que ces deux fonctions ne retournent pas le même type d’objet.

Après quelques essais je suis tombé sur ça aussi par exemple :

>>> maximum_ret(3,maximum_ret(2,4))
4
>>> maximum_pri(3,maximum_ret(2,4))
4
>>> maximum_pri(3,maximum_pri(2,4))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
    def maximum_pri(x,y):
  File "<tmp 3>", line 2, in maximum_pri
TypeError: unorderable types: int() > NoneType()

Ainsi, avec « return » on peut « emboîter » plusieurs fonctions, ce qui n’est pas possible avec « print »…

J’ai bien une hypothèse sur le fonctionnement de ces deux commandes mais quelqu’un pourrait-il préciser s’il vous plaît ?

Edit : Hypothèse : La commande « return » conserve le type d’objet manipulé (list, str, int, float etc …) alors que « print » a juste une vocation d’affichage et ne possède pas de type particulier (NoneType). C’est pourquoi on ne peut pas emboîter plusieurs fonctions avec « print » : ça n’a pas de sens de comparer des « float » avec des « NoneType » par exemple

Je vous remercie d’avance :slight_smile: !

Bonne journée.

Ingens

« print » comme son nom l’indique est une fonction qui affiche quelque chose à l’écran mais qui ne retourne rien.
à l’inverse « return » et un mot du langage python qui dit ce que la fonctionne renvoi.
par exemple en maths quand on a une fonction f à une valeur x, elle renvoie f(x) c’est comme si on avait def f(x) : /* la définition de la fonction*/ return (x);

Pour clarifier la situation : print se contente de regarder ce que tu lui donnes et de l’afficher, alors que return va faire « fonctionner » ce que tu lui donnes avant de l’afficher. En d’autres termes, print et return marche très bien tous les 2 pour une variable, tandis que si tu veux afficher le résultat d’une fonction pour une valeur donné, return le fera directement alors que print nécessitera de mettre le résultat de la fonction dans une variable, puis de passer cette variable dans le print.

Je trouve que ce n’est pas clair du tout et je me demande même si tu as compris.
Return renvoie ce qu’on lui donne en paramètre alors que print ne fait que l’afficher.
Exemple:


def f(x):
     print(2*x)

est une fonction qui fait exactement ce qu’on pense c’est à dire:
Elle prend x en paramètre et affiche le résultat de l’opération 2*x.
Elle ne fait que l’afficher.

Si tu fais:
a = f(2)
alors ça va afficher 4 mais ‹ a › ne vaudra pas 4. (en fait python gère cette utilisation étrange de ‹ = › en disant que ‹ a › n’a pas de type).

Par contre, si tu changes le print en un retrun, là, a=f(2) aura un sens et ‹ a › vaudra 4.

« Mais alors pourquoi, avec le return, ça m’affiche 4 »???
Ben c’est parce que, par défaut, une valeur qui est retournée (return) mais dont on ne fait rien (c’est à dire qu’on ne la stocke pas dans une variable) est bêtement affichée. Elle est affiché mais elle est « perdue ». On ne peut pas l’utiliser dans le suite du programme.

Clair?? (c’est cool d’avoir des débutants en info car ils posent des questions qui ne me seraient jamais venues à l’esprit.

Merci beaucoup à tous !
J’ai finalement compris.

Bonne journée

Ingens