Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

Complément - niveau intermédiaire

Nous reprenons le cas de la fonction fibonacci que nous avons déjà vue, mais cette fois nous voulons que l’utilisateur puisse indiquer l’entier en entrée de l’algorithme, non plus en répondant à une question, mais sur la ligne de commande, c’est-à-dire en tapant :

$ python3 fibonacci.py 12

Avertissement :

Attention, cette version-ci ne fonctionne pas dans ce notebook, justement car on n’a pas de moyen dans un notebook d’invoquer un programme en lui passant des arguments de cette façon. Ce notebook est rédigé pour vous permettre de vous entraîner avec la fonction de téléchargement au format Python, qu’on a vue dans la vidéo, et de faire tourner ce programme sur votre propre ordinateur.

Le module argparse

Cette fois nous importons le module argparse, c’est lui qui va nous permettre d’interpréter les arguments passés sur la ligne de commande.

from argparse import ArgumentParser

Puis nous répétons la fonction fibonacci :

def fibonacci(n):
    "retourne le nombre de fibonacci pour l'entier n"
    # pour les deux premières valeurs de n, on peut renvoyer n
    if n <= 1:
        return n
    # sinon on initialise f2 pour n-2 et f1 pour n-1
    f2, f1 = 0, 1
    # et on itère n-1 fois pour additionner
    for i in range(2, n + 1):
        f2, f1 = f1, f1 + f2
#        print(i, f2, f1)
    # le résultat est dans f1
    return f1

Remarque :

Certains d’entre vous auront évidemment remarqué que l’on aurait pu éviter de copier-coller la fonction fibonacci comme cela ; c’est à ça que servent les modules, mais nous n’en sommes pas là.

Un objet parser

À présent, nous utilisons le module argparse, pour lui dire qu’on attend exactement un argument sur la ligne de commande, et qu’il doit être un entier. Ici encore, ne vous inquiétez pas si vous ne comprenez pas tout le code. L’objectif est de vous donner un morceau de code utilisable tout de suite, pour jouer avec votre interpréteur Python.

# à nouveau : ceci n'est pas conçu pour être exécuté dans le notebook !
parser = ArgumentParser()
parser.add_argument(dest="entier", type=int,
                    help="entier d'entrée")
input_args = parser.parse_args()
entier = input_args.entier
The history saving thread hit an unexpected error (OperationalError('disk I/O error')).History will not be written to the database.
usage: ipykernel_launcher.py [-h] entier
ipykernel_launcher.py: error: argument entier: invalid int value: '/github/home/.local/share/jupyter/runtime/kernel-1a3905db-2338-427c-b792-74d99bc6bcc1.json'
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2
/__w/course/course/venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py:3709: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

Nous pouvons à présent afficher le résultat :

print(f"fibonacci({entier}) = {fibonacci(entier)}")
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[4], line 1
----> 1 print(f"fibonacci({entier}) = {fibonacci(entier)}")

NameError: name 'entier' is not defined

Vous pouvez donc à présent :

$ python3 fibonacci.py 56

(sans taper le signe $ qui indique simplement le prompt du terminal.)