Les fonctions de Python

abord de la pensée algorithmique sur un exemple
mercredi 20 mars 2019
par  Alain BUSSER

Le problème que l’on se propose d’étudier ici est relativement simple : Calculer la somme des entiers de moins de 3 chiffres 1+2+3+...+99

Et on le fera en Python version 3 qui est le langage choisi au programme.

Première méthode : Avec une calculatrice (par exemple la console Python)

On entre, au clavier, la séquence de touches suivantes : 0,+,1,+,2,+,3,+,4,+,5,+,6,+,7,+,8,+,9,+,1,0, etc

Vous je sais pas mais moi je n’ai pas eu la patience d’arriver à 99...

Il arrive fatalement un moment où on se dit que l’ordinateur (ou la calculatrice) doté d’une console Python, devrait pouvoir faire le boulot pénible à la place de l’humain, après tout c’est bien pour ça qu’on l’a inventé (l’ordinateur, pas l’humain, quoique...).

C’est là qu’on se dit que peut-être, avant de se précipiter sur la machine, on pourrait s’arrêter un instant pour réfléchir, en l’occurrence à la manière dont ladite machine peut nous aider. Et c’est là qu’apparaît une première composante de la pensée algorithmique : Se mettre à la place de la machine, voir ce qu’elle peut faire et penser comme elle, autant que faire se peut.

Deuxième méthode : Un algorithme (de programmation impérative séquentielle)

On propose d’utiliser deux variables :

  • La variable contenant les nombres entiers à additionner, que l’on propose d’appeler entier ;
  • Une autre variable, destinée à contenir, in fine, le total à calculer, et que l’on propose donc d’appeler total

Voici alors le script obtenu (clic droit pour ouvrir dans un autre onglet du navigateur).

L’idée de base est d’initialiser la variable total à 0 puis d’y ajouter, au fur et à mesure, les nombres à additionner. Ce qui, en Python, donne

total = 0
for entier in range(0,100):
        total = total + entier
print(total)

Ah oui c’est vrai, l’usage « normal » de Python sur une calculatrice, c’est la console. Dans ce cas on a un peu plus simple :

total = 0
for entier in range(100):       total = total + entier
total

Ce script répond à la question mais il apparaît deux problèmes :

  1. La plupart des élèves, s’ils savent programmer l’algorithme, ne savent pas l’inventer, ni même, souvent, le retrouver de mémoire [1] ;
  2. Il est peut-être exagéré de qualifier d’algorithme une méthode ne permettant que de résoudre un problème bien particulier et non toute une classe de problèmes.

Il apparaît donc le besoin de généraliser comme le suggère J. Wing. Avec un bénéfice inattendu :

Troisième méthode : Avec une fonction

À quel moment exactement a-t-on utilisé le fait qu’il y a 100 nombres à moins de 3 chiffres (de 0 à 99) ? Jamais. On peut donc directement modifier le programme précédent pour obtenir des sommes similaires, mais aussi le dire, ou plutôt l’écrire, en Python, sous la forme de définition d’une fonction. Dans un module on écrirait

def S(n):
        total = 0
        for entier in range(n+1):
                total = total + entier
        return total

et on n’aurait plus qu’à écrire, dans la console,

S(99)

pour avoir la réponse à la question.

Avec l’avantage qu’on n’a plus résolu un problème particulier (une « instance » du problème) mais toute une classe de problèmes (une infinité dénombrable, pour être précis). Cela résout la seconde difficulté évoquée ci-dessus, mais pas la première : Pourquoi tant d’élèves de 2nde éprouvent-ils du mal à inventer cet algorithme de sommation ?

Quatrième méthode : Avec une fonction récursive

Peut-être parce que la méthode de sommation en question est basée sur une récursivité latente ? En effet, la somme des 99 premiers entiers est égale à 99 plus la somme des 98 premiers entiers, laquelle est égale à 98 plus la somme des 97 premiers entiers, etc.

Autrement dit, si dans le programme ci-dessus on a avait rédigé la fonction S de la manière qui suit :

def S(n):
        if n==0:
                return 0
        else:
                return n+S(n-1)

on aurait eu le même affichage dans la console, avec

S(99)

Ceci montre

  • qu’il peut y avoir plusieurs manières différentes de calculer la même fonction (ou plusieurs algorithmes différents résolvant un même problème)
  • que la récursivité se cache parfois là où on ne l’attend pas
  • l’intérêt qu’il y a à généraliser (on est passé de 99 dans la description de l’algorithme récursif, à n dans sa programmation en Python)

Efficacité des algorithmes

En dehors de la difficulté conceptuelle accrue (la récursivité n’est pas au programme de 2nde), est-ce que les deux versions de la fonction S reviennent vraiment au même ?

Le script suivant permet de mesurer le temps de calcul de S(99) :

t = time()
S(99)
t = time() - t
print(t)

Il fournit typiquement les résultats suivants :

Algorithme « itératif » Algorithme récursif Avec sum
25 µs 65 µs 25 µs

La leçon à tirer de cela est qu’il est plus efficace, en général, de programmer itératif (impératif) que récursif. La récursivité étant avantageuse essentiellement lorsqu’on veut verbaliser l’algorithme, pas forcément lorsqu’on veut le programmer.

Cependant, le compilateur du langage Haskell est conçu pour optimiser les algorithmes récursifs et il est à la fois plus facile de programmer récursif qu’itératif (en Haskell) et efficace de le faire (toujours en Haskell).

Ce saut paradigmatique amène à aller encore plus loin dans la pensée algorithmique, en se disant que puisque le langage (Python ou Haskell) peut faire tout le travail (exécuter au lieu de dérécursifier) à notre place, pourquoi pas utiliser toutes ses possibilités, y compris celles qu’on n’avait même pas prévues (résoudre un problème de sommation par exemple) ?

Cinquième méthode : Demander à Python de faire l’addition

La plupart des langages modernes possèdent une fonction somme ou sum qui fait le travail à notre place. Elle s’applique à une liste de nombres.

Construction d’une liste (ou pas)

Le tout est de construire la liste [0,1,2,...,99]. Cela peut se faire

  • par compréhension
    [k for k in range(100)]
  • par conversion depuis un itérateur
    list(range(100))
  • pas du tout, puisque la fonction sum de Python peut s’appliquer directement à l’itérateur
    range(100)

Une fois cette liste (ou cet itérateur) obtenue, il suffit de lui appliquer la fonction sum qui donne la somme de ses éléments.

La fonction S devient alors

def S(n):
    return sum(range(n+1))

Dans le bloc sur l’efficacité des algorithmes, on voit que cette fonction est à peu près aussi rapide que la version itérative : Comme avec Haskell, on peut avoir confiance en le fait que Python fait les choses au mieux et lui déléguer les basses besognes (variables, boucles, ...).

On en fait quoi ?

Pour circonvenir (en partie) la difficulté que pose cette histoire d’addition avec variables, on peut

  • utiliser Sofus qui sait comment additionner entier à total et libère de la difficulté à se demander comment on gère les variables
  • donner un script incomplet (comme on le fait souvent au bac) à compléter ; le script donnant déjà la sommation
  • donner un script de calcul de la somme, mais comportant une (ou plusieurs) erreur, à corriger...

Mais si on se permet d’aller directement vers la programmation fonctionnelle, l’heure qui n’est plus passée à faire recréer l’algorithme de sommation, peut être consacrée à se demander non plus comment on fait, mais pourquoi. Avec cette application en classe inversée :

def moyenne(tableau):
    return sum(tableau)/len(tableau)

la question de voir comment les fonctions sum et len sont programmées, pouvant être réservée aux meilleurs élèves, ou à plus tard.

Sixième méthode : Sans Python

On conjecture que S(n)=n(n+1)/2 et on calcule directement 99×100/2=4950. Reste à voir comment on peut prouver le résultat utilisé (récurrence, dessin, ...)


[1Ce qui est gênant vu la tâche d’additionner beaucoup de nombres est récurrente, avec par exemple le calcul d’intégrales par la méthode des rectangles, ou déjà en 2nde, le calcul de la moyenne de beaucoup de nombres : Le numérateur de cette moyenne est la somme des nombres ; et en plus le dénominateur se calcule de façon analogue en additionnant des « 1 »


Documents joints

Texte - 1.8 ko
Texte - 1.8 ko
Texte - 2.4 ko
Texte - 2.4 ko

Commentaires

Annonces

Prochains rendez-vous de l’IREM

Séminaire EDIM-IREM

- Mercredi 10 avril 2019, 14h-18h, campus du Tampon.

Colloque EDIM-IREM

- Mercredi 5 juin 2019, 9h-12h et 14h-17h, Saint-Denis.


Brèves

Elwyn Berlekamp

jeudi 18 avril

Elwyn Berlekamp, connu des lecteurs de ce site pour son jeu des interrupteurs, était un spécialiste du jeu de Go ainsi que de la Pipopipette, d’Édouard Lucas que Berlekamp admirait énormément.

Notation au bac

lundi 11 décembre 2017

Une nouvelle notation sera pratiquée à partir de la session 2018 pour les algorithmes au bac. Elle est décrite avec de nombreux exemples, ici.

Décès de Roger Mohr

mardi 27 juin 2017

On sait bien que Nicolas Bourbaki n’était pas le nom d’une personne mais le pseudonyme d’un groupe. L’équivalent en informatique théorique est Claude Livercy, auteur de la théorie des programmes. Roger Mohr était un des membres de Claude Livercy.

À travers les labyrinthes : algorithmes et fourmis

dimanche 1er septembre 2013

Quand les chercheurs mettent au point des modèles d’optimisation et de recherche de plus court chemin qui s’inspirent du comportement de masse de colonies de fourmis...
À écouter : Sur les Épaules de Darwin, émission diffusée sur France Inter samedi 31 août 2013.

Rencontres Mondiales du Logiciel Libre à St-Joseph

mardi 20 août 2013

Les RMLLd se dérouleront pour la 2e fois à Saint-Joseph du 22 au 25 août.
C’est une opportunité pour les élèves qui suivent la spécialité ISN et les passionnés d’informatique.

Voici pour le samedi et le dimanche quelques interventions choisies :
- http://2013.d.rmll.info/Raspberry-votre-ordinateur-au-format-carte-de-credit?lang=fr
- http://2013.d.rmll.info/Materiel-libre-et-DIY?lang=fr
- http://2013.d.rmll.info/Arduino-de-l-electronique-libre?lang=fr

Noter aussi les conférences Art et Culture du dimanche, ainsi qu’une conférence plus engagée.

Le programme complet se trouve ici. Une radio sera ouverte pour l’occasion.
Des plaquettes à distribuer se trouvent ici.

Hyper-vidéos pour l’algorithmique au lycée

dimanche 19 août 2012

Olivier Roizès, à la demande de l’ADIREM, a réalisé une collection d’hyper-vidéos de présentation de logiciels et environnements de programmation. Ces hyper-vidéos, c’est-à-dire des vidéos contenant des éléments clicables, devraient être utiles aux enseignants désireux de se familiariser avec Python, CaRMetal, R, Rurple, Scilab ou Xcas.

Ouverture du SILO

mardi 1er novembre 2011

Le SILO (Science Informatique au Lycée : Oui !) est un espace collaboratif documentaire de partage et de formation collégiale, à destination des professeurs appelés à enseigner l’informatique au lycée.

Une initiative du CNDP, de l’INRIA et de Pasc@line, à laquelle se sont associés SPECIF, fuscia, EPI et ePrep.

Sur le Web : Site du SILO

Introduction à la science informatique

lundi 12 septembre 2011

Le CRDP de Paris publie le premier ouvrage destiné aux professeurs chargés d’enseigner la nouvelle spécialité « Informatique et sciences du numérique » en Terminale S à la rentrée 2012. Cet ouvrage a été coordonné par Gilles Dowek, directeur de recherche à l’INRIA.

Sur la création de la spécialité ISN, on pourra également consulter l’interview donnée au Café pédagogique par l’inspecteur général Robert Cabanne.

Sur le Web : CRDP de Paris

Deux publications sur l’algorithmique

samedi 17 octobre 2009

L’IREM d’Aix-Marseille publie une brochure de 73 pages, téléchargeable librement, intitulée Algorithmes et logique au lycée. Ces notions sont illustrées et déclinées sur des exercices du programme de spécialité mathématique en série L, mais sont adaptables aux programmes à venir.

Le hors série thématique n° 37 du magazine Tangente, disponible actuellement en kiosque, s’intitule « Les algorithmes. Au cœur du raisonnement structuré ». Extrait de l’éditorial : « La rédaction de Tangente a conçu la quasi-totalité de ce hors série thématique pour qu’il puisse être lu par des élèves de Seconde ».

Une carte mentale pour l’algorithmique

jeudi 10 septembre 2009

Sur son site, Jean-Jacques Dhénin a publié une carte mentale géante qui renvoie vers plus de 30 documents en ligne sur l’algorithmique. Tout ce qu’il faut — et même davantage — pour faire face au nouveau programme de Seconde !

Statistiques

Dernière mise à jour

lundi 22 avril 2019

Publication

822 Articles
Aucun album photo
139 Brèves
11 Sites Web
142 Auteurs

Visites

668 aujourd'hui
1416 hier
2789480 depuis le début
64 visiteurs actuellement connectés