Skip to article frontmatterSkip to article content

jusqu’ici on a fait pas mal de print()

mais

en fait dans la pratique on n’en fait presque jamais !!

mais alors me direz-vous, comment on construit un programme qui fait des choses utiles si on n’imprime jamais rien ?

exécution normale ou interactive ?

en premier, il y a une chose qui est troublante pour les gens qui commencent :

exécution normale

dans un programme qu’on lance “normalement” c’est-à-dire depuis un terminal avec
$ python truc.py
eh bien dans ce cas les seules choses qui sont imprimées sont quand on appelle print(..)

toutes les autres étapes de calcul sont simplement passées sous silence;
on les calcule bien sûr, mais on ne les affiche que si on appelle print()
l’idée c’est que si on devait montrer toutes les valeurs intermédiaires on serait complètement noyé !

interactive

par contre, quand on utilise un mode interactif, c’est-à-dire soit

alors dans tous ces modes de fonctionnement, Python se comporte comme un REPL

c’est quoi un REPL ? ça signifie Read Eval Print Loop
dit autrement, la logique de Python dans ce mode c’est

en pratique

je vous montre la différence avec ce programme totalement bidon

run_or_repl.py
# un programme bidon
# qu'on va exécuter d'abord normalement
# puis ensuite dans le notebook en 4 cellules

10 + 10

###

def double(x):
    return x + x

###

double(10)

###

print("au beau milieu")

double("truc")

normal run

d’abord si je l’exécute normalement, je vois .. combien de lignes affichées ?

!python run_or_repl.py
au beau milieu

interactivement dans le notebook

# cellule 1

10 + 10
20
# cellule 2

def double(x):
    return x + x
# cellule 3
double(10)
20
# cellule 4

print("au beau milieu")

double("truc")
au beau milieu
'tructruc'

vous voyez que là on a beaucoup plus de texte affiché:

en effet les choses qui sont affichées en tant que “résultat (du dernier code) de la cellule” sont affichées en mode “plus développeur”

et ici par exemple la cellule 4 a pour résultat la valeur retournée par double("truc"), qui est une chaine, du coup on la montre (en mode dével) avec les ' autour

plusieurs remarques

Une fois qu’on a dissipé cette source de confusion, reprenons...

Et posons-nous la question de savoir si c’est une bonne idée d’écrire une fonction qui imprime toujours son résultat ?

Imaginons le cas d’une fonction qui calcule le cube

La réponse est simple: une fonction c’est fait pour calculer quelque chose; donc l’appelant doit pouvoir écrire quelque chose comme

c = cube(10)

on a deux choix

# une version qui ne fait qu'imprimer le cube
def cube_qui_print(x):
    print(x*x*x)
# une version qui retourne proprement le résultat
def cube_qui_return(x):
    return x*x*x

print()

# regardons ce que ça donne
c = cube_qui_print(10)
1000

alors effectivement on a imprimé 1000, mais attention

# dans c on a None
print(c)
None

question: il se passerait quoi si dans la cellule du dessus j’avais mis juste c au lieu de print(c)

return

# alors que avec return
c = cube_qui_return(10)

on n’a rien affiché pendant le calcul, mais on a bien

print(c)
1000

que retenir ?