T - 4.2 Piles

I. Les piles

Exemple de primitive

On donne ci-dessous une possible implémentation de ces fonctions primaire, en utilisant le vocabulaire de la programmation orientée objet que nous avons déjà abordée.
Il existe bien d'autres possibilités pour implémenter ces fonctions primaires.
Dans toute la suite les piles seront affichées entre crochets, comme des list python. Le sommet de la pile est l'élément écrit le plus à droite. Ainsi, si l'on part d'une pile vide, et que l'on empile successivement les entiers 1, puis 2, puis 3, on obtiendra une pile qui s'affichera de la façon suivante : [1, 2, 3]. Le sommet de cette pile est l'entier 3.

Exemple
Une interface de pile en POO

A vous de jouer !

Ecrire ci dessous les instructions qui permettent d'obtenir successivement les affichages suivants :

[12] <- sommet
[12, 14] <- sommet
[12, 14, 8] <- sommet
[12, 14] <- sommet
[12] <- sommet
[] <- sommet

Exercice de code

Autre fonction pour les piles

Alice désire écrire une fonction, qui doit retourner la taille de la pile. Attention, une fois que sa taille a été déterminée, la pile ne doit pas avoir été modifiée...
Elle propose le code suivant :

Le code d'Alice
Exemple

A vous de résoudre ce problème
Ecrire ci-dessous une fonction taille qui remédie à ce problème Aide1
Exercice de code

Applications

Vérifier les parenthèses d'une expression mathématique

Le but de cet exercice est d'écrire une fonction qui contrôle si une expression mathématique, donnée sous forme d'une chaîne de caractères, est bien parenthésée, c'est-à-dire s'il y a autant de parenthèses ouvrantes que de fermantes. On s'interdit d'utiliser des variables qui "comptent" les parenthèses ouvrantes ou fermantes.

Par exemple :

  • (..(..)..) est bien parenthésée.
  • (...(..(..)...) ne l'est pas .

L'algorithme :

On crée une pile. On parcourt l'expression de gauche à droite.
Si on rencontre une parenthèse fermante ")", alors :

  • Si la pile n'est pas vide, on dépile
  • Sinon on renvoie Faux"

À la fin la pile doit être vide...

Source : Stéphan Van Zuijlen

Compléter la fonction suivante :

Exercice de code

Paradigmes de programmation

Les différents paradigmes de programmation

Toutes les situations de ton quotidien peuvent être abordées d’une manière différente. Tu peux choisir de les aborder positivement ou négativement. En programmation, c’est pareil. Il existe plusieurs façons d’approcher la programmation informatique et de traiter les solutions aux problèmes. Ce sont les paradigmes de programmation. Nous allons décrire ici 3 paradigmes de programmation. Un que vous connaissez très bien puisque vous l'utilisez depuis l'année dernière quand vous programmez en Python : la programmation impérative.

Mais il existe d'autres types de paradigme de programmation, et nous en décrirons 2 : la programmation fonctionnelle, et la programmation objet.

1. Programmation impérative

source :ionos.fr

Qu'est ce que la programmation impérative ?

La programmation impérative (du latin imperare = ordonner) est le paradigme de programmation le plus ancien. Ce paradigme définit un programme comme une séquence clairement définie d’instructions informatiques.

Le code source des langages impératifs énonce donc des séquences d’ordres, déterminant quand l’ordinateur doit exécuter quelle action pour atteindre le résultat souhaité. Les valeurs utilisées dans les variables sont alors transformées en durée d’exécution du programme. Pour piloter les ordres, des structures de contrôle, telles que des boucles ou embranchements, sont intégrées au code.

Le paradigme de programmation impérative est très concret et fonctionne en étroite collaboration avec le système. Le code est aisément compréhensible, mais il nécessite l'écriture de nombreuses ligne de code source.

De nos jours, de nombreux langages de programmation se fondent sur le paradigme de programmation impérative.

Cela tient, d’une part, au fait que cette approche correspond au mode de programmation initial. De l’autre, au fait que le paradigme impératif présente des avantages pratiques par rapport aux autres modèles.

Comparativement, ces langages sont faciles à apprendre dans la mesure où le code se lit comme un mode d’emploi, étape par étape. En ce sens, au cours de leur formation professionnelle, les programmeurs commencent généralement leur apprentissage par un langage impératif.In [1]:1

Exemple : Recherche du minimum d une liste en Python
Recherche du minimum en impératif

C'est un code assez explicite, car nous en avons l'habitude.

On commence par évaluer le nombre d'éléments de notre liste, que l'on stocke dans une variable longueur

Puis on teste si la liste est vide, et si c'est le cas on affiche le message correspondant

Sinon, on affecte à la variable mini le premier élément de la liste, puis on teste pour tous les éléments de la liste si cet élément est plus petit que mini.

Si c'est le cas, la variable mini prend comme nouvelle valeur cet élément.

Et une fois la boucle terminée, le programme affiche la valeur de la variable mini.

Exemples de langages de programmation impérative :

C, Pascal, Python, COBOL, etc ...

Attention :

En programmation impérative, nous utilisons des fonctions, qui ne sont que des suites d'instructions informatiques regroupées dans un bloc. Mais cela ne suffit pour prétendre utiliser le paradigme fonctionnel que nous allons décrire ci-dessous :

2. Programmation fonctionnelle

Ce paradigme prend son origine dans le langage mathématique traitant des fonctions. Une fonction, dans son incarnation informatique, accepte des données et produit des données. Une fonction peut être soit primitive, soit formée par une composition de fonctions.

Il n'y a pas de séparation entre données et programmes : une fonction est un objet de première classe sur lequel d'autres fonctions peuvent opérer. Nous ne rentrerons pas plus en détail dans les caractéristiques précise de la programmation fonctionnelle. Pour ceux qui veulent s'initier à la programmation fonctionnelle sur Python, vous pouvez consulter ce lien :

Tutoriel pour apprendre la programmation fonctionnelle en Python

Si l'on reprend notre exemple de recherche du minimum dans une liste, nous aurions ceci en programmation fonctionnelle sur Python :

Exemple : Recherche du minimum d une liste en Python
Recherche du minimum (impératif)
Exemple : Recherche du minimum d une liste en Python
Recherche du minimum (fonctionnel)

Explications :

Dans la version impérative, la fonction incrémente une variable globale (a). La valeur de la variable est donc modifiée quand nous exécutons la fonction.

Dans la version fonctionnelle, la fonction prend un argument (a), puis renvoie une valeur (a+1). Le code ne dépend pas de données se trouvant à l'extérieur de la fonction courante et il ne modifie pas des données à l'extérieur de cette fonction.

3. Programmation Orientée Objet

Programmer avec un langage oreitné-objet amène le programmeur à identifier les acteurs qui composent un problème, puis à déterminer ce qu'est et ce que doit savoir chaque acteur. En regroupant les aspects communs puis en les spécialisatn, le programmeur établit une hiérarchie de classe. Nous détaillerons en détail le fonctionnement inhérent à la programmation orientée objet dans le chapitre suivant.

Exemples de langages de programmation orientée objet :

C++, C#, Java, Python, etc ...

Nous pouvons en Python utiliser les classes pour répondre à notre exemple de recherche de minimum dans une liste :

Exemple : Recherche du minimum d une liste en Python
Recherche du minimum en python

En effet, lors de la création de notre liste, on crée en fait un objet qui est une instance de la classe liste. Et cette classe possède de nombreuses méthodes publiques dont la méthode sort() qui ordonne (de manière croissante) les éléments de la liste. Le minimum de cette liste est donc forcément le premier élément.

Nous allons maintenant revenir sur ce vocabulaire, et expliciter davantage cette manière de programmer en objet ...

S8.1 DS les dictionnaires

Découverte

Nous souhaitons lire avec un code écrit en python des données dans un fichier csv. Nous allons avoir besoin d'un nouveau type de variable : les dictionnaires.

Vous connaissez déjà les listes. Par exemple lst=[1,2,4,1,0] est une liste de nombres, et on sait accéder aux valeur de chaque élément :

Exemple

Finalement, chaque élément de la liste est associé à un indice.

  • 1 est à l'indice 0
  • 2 à l'ndice 1
  • etc...

Dans un dictionnaire, les indices sont remplacés par des descripteurs aussi appelés les clés du dictionnaire. Voila comment pourrait être écrite la liste précédente sous forme d'un dictionnaire :

Exemple

Bon, ça ne sert pas à grand chose vu comme ça ! car ici on a utilisé des clés qui sont strictement identiques aux indices de la liste. Mais supposons qu'on veuille stocker en mémoire une information telle que :

Nombre d'Elèves :34
Numéro de la Classe : 12
PP : M. Le Sann

ça devient beaucoup plus intéressant si ces clés sont des mots décrivant le contenu :

Exemple
Un dictionnaire permet de décrire les valeurs

Exercice

Exercice de code : afficher les valeurs des clés
Dans cet exercice, vous disposez d'un dictionnaire déjà créé. Faire afficher successivement le nom, le prenom et l'année de naissance.

Modifier un dictionnaire

Exemple
Un dictionnaire permet de décrire les valeurs

Nous venons de voir comment modifier la valeur d'une clé existante. Mais comme pour les listes, on peut bien sur aussi ajouter des éléments :

Exemple
Un dictionnaire permet de décrire les valeurs

Dans le cas d'une liste, les indices sont toujours les mêmes : 0, 1, 2 ...

Dans un dictionnaire en revanche, les descripteurs sont spécifiques, et on peut avoir besoin de les connaitre. On utilise pour cela la méthode keys() :

parcourir un dictionnaire

Exemple
rappel : parcours de liste

On peut parcourir de la même manière un dictionnaire, mais comme les indices sont remplacé par des clés, il faut itérer sur les clés. Pour cela on utilise la méthodé keys() qui nous donne la liste des clés.

Exemple
Un dictionnaire permet de décrire les valeurs

Exercice

Exercice de code : implementez et afficher un dictionnaire
Voici ci dessous un court extrait de la liste des 72 noms de scientifiques, gravés sur la tour Eiffel. Il s'agit d'une petit partie de ceux gravés sur la face Trocadéro.
Représentez l'information de ce tableau dans trois dictionnaire avec les descripteurs suivants :
  • numéro
  • nom
  • prenom
  • naissance
  • deces
  • metier
(vous n'incluerez pas le Titre dans les dictionnaires).
Le code, à partir de la ligne 6, vous est donné : on va regrouper les 3 dictionnaires dans une liste et afficher cette liste, d'abord dans un parcours de liste, puis d'un seul bloc.
FACE TROCADÉRO
No  Nom en abrégé inscrit sur la tour Eiffel Prénom Dates de naissance et de mort Métier(s) Titres de gloire
1 SEGUIN Marc 1786-1875 Mécanicien Constructeur de ponts suspendus - Inventeur de la chaudière tubulaire
2 LALANDE Joseph 1732-1807 Astronome Nombreux travaux d'astronomie et d'hydrologie
3 TRESCA Henri 1814-1885 Ingénieur et mécanicien Auteur du critère de Tresca (résistance des matériaux)
: Le jardin coloré

photo librairie PIL

Nous allons maintenant utliser la libraire PIL de python qui permet de traiter les images.

Qu'est ce qu'une librairie

C'est un ensemble de fonctions qu'on peut utiliser, on peut dire une extension de python qui lui rajoute des instructions.

Concrètement on écrit :

import PIL

et on peut dès lors utiliser les fonction de la librairie. Par exemple l'instruction :

img = PIL.Image.open('pomme.jpg')

crée une variable img qui contient les données de l'image.

Cette variable est un objet python qu'on peut manipuler avec des instructions comme :

img.save('nom_du_fichier','JPG')

pour sauvegarder l'image au format JPG
Ou encore :
img.size qui nous donnera par exemple (300,500) si l'image fait 300 pixels de larges et 500 pixels de hauteur.

Les tuples : un nouveau type de variable

En Python, (300,500) est appelé un tuple, c'est un type de variable. Nous pouvons l'utiliser par exemple ainsi :
Exemple

Nous aurons également besoin de manipuler les valeurs des 3 couleurs rouge, vert et bleu, d'un pixel.

La couleur d'un pixel est un tuple de 3 valeurs, comme par exemple : (120, 30, 200). Ce tuple indique la couleur :

rouge=120 vert=20 bleu=200

Pour récupérer les valeurs des 3 couleurs nous feront comme pour la taille :

Exemple

Boucles imbriquées

Enfin une dernière chose dont nous allons avoir besoin : une image est un ensemble de pixels de coordonnées (x,y). Pour lire tous les pixels nous allons utiliser 2 boucles imbriquées. Examinons un cas simple, d'une image constituée de 6 pixels dont les couleurs sont indiquées ci-dessous :

(100,10,10)(200,40,10)(100,200,100)
(10,10,10)(20,40,60)(10,200,30)

si on veux afficher les 2 pixels de coordonnées (0,0) et (0,1) ;

Exemple

Exercice

Exercice de code : utiliser getpixel
Comme dans l'exemple précédent, on a défini une image de 6 pixels (légèrement différente de la première) avec encore 2 lignes et 3 colonnes
Ajoute une ligne de code pour afficher la couleur du pixel situé en bas à droite de l'image.

Mais si on veux afficher tous les pixels ?

C'est là qu'on va faire 2 boucles imbriquées :

On commence par récuppérer la taille de l'image, avec la fonction image size(). size renvoie la taille en nombre de pixels, largeur x hauteur.

ATTENTION : la largeur est le nombre de colonnes, et la hauteur est le nombre de lignes !

Ensuite on lit tout les pixels, lignes par ligne, et pour chaque ligne toutes les colonnes.

x (numéro de ligne) varie de 0 à 1

pour chaque valeur de x, y (numéro de colonne) varie de 0 à 2

Exemple

Exercice

Exercice de code : lire toute l'image
Tel quel, ce code ne fonctionnera pas. En effet nous avons modifié l'image qui ne fait plus 2 pixels de large et 3 pixels de haut.
Dans le code, on utilise img.size() qui permet de connaitre la largeur l et la hauteur h (en nombre de pixels) de l'image. Il faut utiliser l et h dans la boucle pour pouvoir afficher tous les pixels....

Et pour modifier l'image ?

C'est possible, bien entendu. Au lieu de getpixel, qui permet de "lire" la couleur d'un pixel, on va utiliser putpixel, qui permet d'écrire :

Exemple

S1.3 Instructions conditionnelles

Bases en Pyhon 5 : Les instructions conditionnelles 

Si ...

Les conditions sont un concept essentiel en programmation. Elles vont vous permettre de faire une action précise si, par exemple, une variable est positive, une autre action si cette variable est négative, ou une troisième action si la variable est nulle.

Si...

Comme un bon exemple vaut mieux que plusieurs lignes d'explications, voici un exemple clair d'une condition prise sous sa forme la plus simple.

Exemple

Bien sur ce code affiche que ABC est triangle, puisque 25 est bien égal a 9 + 16. Notez bien le ==. Ce n'est pas une faute de frappe, on a vraiment mis deux fois le signe =. En python :

  • a = 1 est une affectation (a prend la valeur 1)
  • a == 1 est une comparaison utilisant l'opérateur comparatif ==. Cet opérateur permet de tester une égalité : (ici la proposition est : a = 1 ? e
  • a == 1 peut prendre deux valeurs : Vrai ou Faux. En Python (comme dans la majorité des langages de programmation) c'est True ou False. C'est donc une proposition booléenne.
  • On dénomme très souvent condition les propositions booléennes.

La structure de cette instruction conditionnelle. est :

if condition :
   Instruction(s)
Les instructions indentées qui suivent le if ne sont exécutées que si la condition est vraie.

Changeons un peu le code de départ :

Exemple

Cette fois la condition n'est pas vérifiée car BC**2 == AB**2 + AC**2 est faux.

Exercices

1Revenir sur la feuille Wims et faire l'exercice interactif n°1 (en bas de la page)

2Exercice de codage

Exercice de code
Le correcteur va générer deux nombres a et b. Pour chaqun de ces deux nombre vous devez tester s'il est pair et si oui, l'afficher ainsi : si les 2 sont pairs on aura : "a est pair" "b est pair" si a est pair et b impair on aura : "a est pair" si a est impair et b pair on aura : "b est pair" si les deux sont impairs on aura aucune sortie en console.
Le code sera éxécuté avec différentes valeurs de a qui seront générées automatiquement pour vous.

Si... et sinon...

Notre code précédent permet de dire qu'un triangle est rectangle. Mais lorsque le triangle n'est pas rectangle, notre code n'affiche rien, et avouez, c'est un peu dommage. Bien sur il est possible de décider ce que l'on veux faire si la condition est fausse :

Si... et sinon...
Exemple

Cette fois le code va afficher que le triangle n'est pas rectangle. Mais.... est-ce bien correct ??? Regarde ceci :

Exemple

Que va afficher ce code ? Est-ce correct ?

Bien sur que non. Il aurait pu afficher que le triangle n'est pas rectangle en A, et ce serait correct. Mais encore une fois c'est un peu dommage que ce code ne nous renseigne pas mieux, en nous indiquant que le triangle est rectangle, mais cette fois en C. Comment faire ?

On peut par exemple tester tous les cas :

Exemple

C'est mieux non ? En effet cette fois, le code affichera toujours si le triangle est rectangle. Mais problème.... s'il n'est pas rectangle, il ne va rien afficher. Bien sur, on pourrait s'en contenter, après tout, s'il ne dit rien, c'est qu'il n'est pas rectangle. Mais ceci n'est pas complètement satisfaisant. Nous verrons un peu plus loin comment faire mieux, mais avant, entraine toi un peu...

Exercice

3Revenir sur la feuille Wims et faire l'exercice interactif n°2 (en bas de la page)

4Exercice de code

Dans l'exercice qui suit, nous allons découvrir la fonction random.randrange()
Elle a un nom en 2 parties car elle ne fait pas partie des fonctions de base de python, elle se trouve dans un module qui s'appelle random

Pour l'utiliser on doit commencer par importer le module avec import random

Puis ont utilise randrange() ainsi par exemple :

a = random.randrange(0,4)



ici, a prendra une valeur aléatoire entre 0 et 3. Tout celà est en partie précodé dans l'exercice.
Exercice de code : lancer d'un dé
Nous allons créer un jeu très simple : Nous lançons 3 fois de suite un dé à 6 face, et à chaque lancé :
  • Si on obtient 6 on gagne 2€
  • sinon on gagne 1€.
Le lancé du dé s'écrira :

de = random.randrange(...)
A vous de remplacer les ... par ce qu'il faut pour obtenir un nombre entre 0 et 6, randrange fonctionne de la même façon que range.

Sinon, si...

Non seulement notre code n'affiche rien si le triangle n'est pas rectangle, mais il y a un autre petit problème. Imaginons que le triangle est rectangle en A. Dans ce cas, les 2 autres tests ne servent à rien... Pas très grave, c'est l'ordinateur qui fait les calculs pour rien. D'accord. Mais quand même ça n'est pas très malin.

Si... et sinon si...

Dans un cas comme celui là on peut enchainer les tests ensembles avec elif. Cette instruction est la contraction de else et if, et signifie : sinon, si...

Laissons de coté Pythagore un moment, nous y reviendrons. Prenons un autre exemple :

2 amies, Marie et Julie, veulent aller visiter une 3ème amie qui habite à 10km. Mais ont-elles une voiture ?

Si Marie a une voiture 
   alors c'est bon
Sinon Si : Julie a une voiture
   alors c'est bon
Sinon
   c'est mort
Si on répond OUI à la première question :
         le problème est réglé, et on ne va pas regarder ce qu'il faudrait fait sinon.
Sinon, si on répond oui à la seconde
              le problème est quand même réglé et ne s'occupe pas du sinon qui suit
Sinon :
           On  répondu non aux deux. Marie et Julie restent à la maison.
En Python ce code ressemblerait à ceci :

if Marie a une voiture 
   alors c'est bon
elif Julie a une voiture :
   alors c'est bon
else :
    c'est mort
Vous vous dites peut-être que cela ne ressemble pas vraiment à un code informatique. Pourtant ce n'est pas bien loin, regardez :

Exemple

Revenons à Pythagore

Exemple

Comment ça va fonctionner ? traduisons chaque ligne en langage normal :

AB = 5
AC = 4
BC = 3
Si BC**2 == AB**2 + AC**2 Alors :
         print("ABC est un triangle rectangle en  A")
Sinon Si : AB**2 == AC**2 + BC**2 : :Alors :
         print("ABC est un triangle rectangle en C")
Sinon Si : AC**2 == AB**2 + BC**2 : :Alors :
         print("ABC est un triangle rectangle en B")
Sinon : 
         print("ABC n'est pas un triangle rectangle ")
si la première condition est vraie, le code n'exécutera aucun des Sinon :. Mais si elle est fausse il va passer au premier Sinon Si :

Si la 2ème condition est vraie le code n'exécutera pas les autres Sinon. Mais si elle est fausse il passera au 2ème Sinon Si :.

Si cette 3ème condition est vraie il n'exécutera pas le Sinon final. Mais si elle est fausse, il passera a ce dernier sinon, et cette fois il n'y a pas de si, donc il affichera: le triangle n'est pas rectangle.

Et c'est correct, car les 3 tests ont échoué, donc en effet on est sur qu'il n'est pas rectangle.

Exercices

3Revenir sur la feuille Wims et faire l'exercice interactif n°3 (en bas de la page)

Deux exercices de codage

Trouver le plus grand

1 - Exercice de codage

Exercice de code : trouver le plus grand
Écrivez un programme pour trouver un maximum entre trois nombres (que l'utilisateur va choisir) en utilisant 3 if successifs.
Le correcteur va automatiquement générer des valeurs pour les 3 nombres a b et c, distincts et strictement positifs.
Votre code doit afficher la valeur du plus grand des 3 nombres.
 
Contrainte : Même si vous avez déjà appris à utiliser and, vous ne devez pas l'utiliser dans cet exercice (nous ne l'avons pas encore vu).

Déroulez le code pour les valeurs : a = 2, b = 3 et c = 1

2- est-ce que ça marche ?

Examinez le code ci-dessous :

Exemple : trouver le plus grand
Chercher le plus grand avec if..elif...else...

Est-ce que ce code fonctionne ? (justifiez)

3- Des tests plus précis et efficaces

Nous avons utilisé une variable nbMax que nous avons initialisée à 0. Ceci n'est pas forcément naturel. En effet, on aurait plutôt tendance a dire que :

Algorithme de détermination de la plus grande des 3 valeurs :

si a > b ET a > c : a est le plus grand
et sinon, si b > a et b > c : b est le plus grand
et sinon c'est c le plus grand.

en python, on écrira par exemple :

if a > b and a > c :

Reprenez l'exercice avec and en suivant l'algorithme donné ci-dessus.

Exercice de code : trouver le plus grand (avec and)
Écrivez un programme pour trouver un maximum entre trois nombres entiers distincts en utilisant if elif (éventuellement plusieurs elif) et else. Votre code doit afficher la valeur du plus grand des 3 nombres.
 
Contrainte : Vous devez écrire les conditions en utilisant and.
3 dés

Exercice de code
Bob a trouvé un jeu de hasard en ligne très simple : il doit cliquer 3 fois de suite sur la touche "lancer le dé". A chaque fois cela affiche un entier entre 1 et 6.
  • S'il obtient 3 nombres identiques, il gagne 3 euros.
  • S'il obtient 2 nombres identiques, il gagne 2 euros.
  • S'il obtient trois nombres tous différents, il perd 1 euro.
Vous devez écrire le programme qui demande les trois nombres entiers a, b et c, puis détermine et affiche le nombre d'entiers identiques. on appelera n_identiques la variable donnant ce nombre. Par exemple :
  • Pour a = 1, b = 3, c = 2 il doit trouver n_identiques = 0
  • Pour a = 1, b = 3, c = 1 il doit trouver n_identiques = 2
  • Pour a = 1, b = 1, c = 1 il doit trouver n_identiques = 3

Notez bien : ici nous n'avons pas de Else...

La raison est qu'on n'en a pas besoin. Si une condition est vraie, on agit en conséquence, et sinon on ne fait rien. Le sinon n'est donc pas utile.

A faire seulement si vous avez déjà étudié les listes en Python : détermination de la médiane

Déterminer la médiane d'une série statistique

Rappel de l'algorithme de la médiane

Soit lst=[x1,x1,...xN] une série de nombres (la série contient N éléments) ordonnée dans l'ordre croissant.

  • Si N est pair la médiane est la moyenne des valeurs de rang N/2 et N/2+1
  • Si N et impaire, la médiane est la valeur de rang (N+1)/2

Exercice de code : Déterminer la médiane
Ecrire un code qui calcule la valeur médiane d'une liste de nombres.
 
PRECODE : avant votre code, une liste lst sera générée par le correcteur.
 
Aide 1 Aide 2 Aide 3

T - 4.1 Listes

introduction

Exemple d'implémentation en Python du type LISTE

Les listes

Le langage de programmation Lisp (inventé par John McCarthy en 1958) a été un des premiers langages de programmation à introduire cette notion de liste (Lisp signifie "list processing").


On trouve différentes définitions du type abstrait liste.

Dans ce cours, nous définirons une liste comme une structure de donnée permettant de regrouper des données. C'est une structure linéaire qu'on ne peut parcourir qu'en partant du début. Elle est définie par son interface, c'est à dire l'ensemble des fonctions (méthodes), appelées des primitives qui vont permettre de creer et gérer la liste.

Il y a de nombreuses possibilités pour implémenter ce type abstrait, et vous n'avez pas besoin de connaître cette implémentation. Il vous suffit de connaître les spécifications des fonctions primitives, pour pouvoir les utiliser et éventuellement écrire d'autres fonctions.


Attention : ce que nous appelons listes dans ce chapitre n'est pas la même chose que les listes que vous connaissez en python. Il s'agit ici de types abstraits qui n'existent pas nécessairement de façon native dans tous les langages, mais peuvent être implémentés.


Le type abstrait liste est différent du type list. Nous le noterons dans ce cours, pour bien le différencier, en majuscules : LISTE.

Pour résumé, une LISTE est composée de :

  • sa tête (souvent noté car), qui correspond au dernier élément ajouté à la liste (en tête de liste)
  • et sa queue (souvent noté cdr) qui correspond au reste de la liste.

Écriture d'une liste

La manière dont sont affichées les listes dépend de leur implémentation. Dans ce qui suit nous avons choisi un affichage qui ressemble à celui du type list de python :

  • Une liste vide s'écrit []
  • Exemple de liste : [1, 2, 3]


Comprendre le fonctionnement des primitives
:
lisez attentivement les spécifications de chaque primitive, car elles vous permettront de comprendre leur fonctionnement.
Exercice de code : Que font les primitives ?
Vous disposez des fonctions "primitives" suivantes :
  • Vide():
  • Liste(x, liste):
  • est_vide(liste):
  • tete(liste):
  • queue(liste) :
Pour connaître les spécifications, vous pouvez utiliser la fonction help(). Regardez les toutes et notez bien ces spécifications, vous allez les utiliser ensuite.

A vous d'utiliser les primitives
:
Exercice de code : essais à faire pour chacune des primitives
Vous devez compléter le code pour effectuer :
  • afficher pour list1 True ou False selon que lst1 est vide ou pas
  • créer une LISTE lst2 en ajoutant 2 en tête de lst1 et afficher lst2
  • puis afficher si lst2 est vide ou pas
  • ajouter 3 en tête de list2 et afficher list2
  • retirer 3 en tête de list2 et afficher list2

Dans quel ordre implémenter la liste ?
:
Exercice mêlé : créer la liste ['a', 'b', 'c']
mettre les lignes dans le bon ordre pour obtenir la liste demandée
(vous pouvez déplacer les lignes du code)
  • lst_exemple = Vide()
  • lst_exemple = Liste('a', lst_exemple)
  • lst_exemple = Liste('c', lst_exemple)
  • lst_exemple = Liste('b', lst_exemple)
  • print(lst_exemple)


Exemple : On peut imbriquer ces fonctions comme dans l'exemple suivant :


A vous maintenant !

Exercice de code : créer la liste ['a','b','c'] en utilisant l'imbrication

Autres fonctions

On peut maintenant construire toutes les fonctions qui nous viennent à l'esprit.
Voici quatre exercices à réaliser ci-dessous, pour implémenter de nouvelles fonctions.
Pour chacun de ces exercices, vous ne pouvez utiliser que les fonctions "primitives" définies précédemment, ou une fonction que vous avez vous-même implémentée dans un des exercices ci-dessous.
Vous ne devez donc pas utiliser les instructions usuelles en python pour le type list, notamment accéder un élément avec ma_liste[0] par exemple.

Pour la réalisation des différentes fonctions, vous n'avez pas le droit d'utiliser len, append et []
exercice 1 :
Exercice de code : Compléter cette fonction qui doit renvoyer la longueur de la liste, sans utiliser de fonction récursive.

exercice 2
Exercice de code : Compléter cette fonction qui doit renvoyer la longueur de la liste, en utilisant une fonction récursive.

exercice 3
Exercice de code : Compléter cette fonction qui enlève la tête de la liste

exercice 4
Exercice de code : Compléter cette fonction qui doit permettre de savoir si un élément x est dans la liste. Vous ne pouvez utiliser ni len, ni for, ni while, ni in


exercice 5
Dans cet exercice, vous ne pouvez utiliser ni len, ni for, ni while, ni in
Exercice de code : Compléter cette fonction qui doit retourner élément de rang n.
Votre fonction doit renvoyer la chaine de caractères "n hors limite" si n n'est le rang d'aucun élément de la liste

modele

Intro


sdfsdf


/


La variable cpt

Exemple : Mon script
Ce code sert à
Exercice de code : mon exo
Consignes : a et b sont définis pour vous par le correcteur
https://repl.it/join/lasmubyf-mcoilhac
Publié dans Non classé

S 1 - Bases en Python - les boucles

le cours

Premier exemple

Exemple : première boucle
Voici un premier code très simple
Mais à quoi sert la variable i ?
En fait, dans le cas de ce code très simple : i ne sert à rien !

→ i est un compteur de la boucle : une variable qui augmente de 1 à chaque passage.
  • Au départ, i vaut 0
  • puis 1
  • puis 2.

Affichons les valeurs de i dans la boucle

Exemple : Afficher le compteur
Affichons les valeurs successives de i dans la boucle
Les valeurs de i sont bien, successivement, 0 puis 1 puis 2, et on s'arrête donc là. On a bien répété 3 fois.
Et une fois sorti de la boucle, est-ce que i vaut quelque chose ? Regardons !

Valeur du compteur quand la boucle est terminée

Exemple : Le compteur après la fin de la boucle
Et que vaut i à la fin de la boucle ?

Un premier exercice

Exercice de code : Afficher la table de 9
Compète le code pour afficher la table de 9.
Tu dois :
  1. Compléter le in range(..,..) : pour faire une boucle allant de 1 à 10
  2. Complétez l'instruction print(...)
par exemple, quand i=1, print affichera :
1 * 9 = 9

L'indentation

En scratch, les boucles sont des boites qui marquent bien le début et la fin :

Les instructions à l'intérieur de la boucle sont identifiées dans le bloc répéter 3 fois

En python, les : marquent le début de la boucle, et tout le bloc à 'lintérieur de la boucle est indenté (décalé vers la droite).

Exemple : #affiche a dans la boucle:
ne pas confondre avec :
Exemple : #affiche a en dehors de la boucle:

Dans cet exemple, le print(a) n'est donc pas dans la boucle, conformément à ce qu'on voit dans le code en Scratch.

Avec une variable définie en dehors de la boucle

Souvent une boucle va effectuer des opération en utilisant des variables qui ont déjà une valeur en dehors de cette boucle, et qui seront modifiées durant l'exécution de la boucle.

Voyons un exemple simple :

Exemple : Avec une variable définie avant la boucle
Avant la boucle on INITIALISE a à la valeur 1.
On va ITERER 3 fois :
    Dans la boucle on INCREMENTE a de 1
    et on affiche sa valeur.
on affiche enfin la valeur de a après la boucle

Avant le début de la boucle, a vaut 1.
Au premier passage dans la boucle, a=a+1 (donc a vaut 2) avant qu'on affiche sa valeur.
Au second passage dans la boucle, a=a+1 (donc a vaut 3) avant qu'on affiche sa valeur.
Au 3ème passage dans la boucle, a=a+1 (donc a vaut 4) avant qu'on affiche sa valeur.
A la sortie de la boucle a vaut toujours 4 (on ne l'a pas modifiée).

ATTENTION
Regardons ce code, très légèrement différent du précédent ;

Exemple : Modifions légèrement le code
Comme précédement, avant la boucle on INITIALISE a à la valeur 1. puis on va ITERER 3 fois.
En revanche, dans la boucle on INCREMENTE a de 1 APRESl'affichage de sa valeur.


le TP

Sissa et l'échiquier du roi Shirham

L'érudit musulman Abu-l'Abbas Ahmad Ibn Khallikan (1211-1282) semble être, en 1256, le premier à débattre de l'histoire du grand vizir Sissa ben Dahir, auquel, selon la légende, le roi indien Shirham aurait demandé quelle récompense il souhaitait pour avoir inventé le jeu d'échecs.

Sissa répondit ainsi : « Majesté, je serais heureux si vous m'offriez un grain de blé que je placerais sur la première case de l'échiquier, deux grains pour la deuxième case, quatre grains pour la troisième, huit grains pour la quatrième, et ainsi de suite pour les soixante-quatre cases ».

Exercice mêlé : L'echiquier de Sissa partie 1
Le code ci-dessous doit afficher le nombre de grains sur chacune des 4 premières cases de l'échiquier, mais il ne fait pas le travail correctement. Saura tu remettre les lignes dans l'ordre, pour le réparer ?
(tu peux déplacer les lignes du code)
  • #initialisons le nombre de grains sur la première case :
  • n=1
  • #Debut de la boucle :
  • for case in range(4 ):
  • n=2*n
  • print(n)

Bien, nous savons calculer le nombre de grains sur chaque cases. Nous l'avons obtenu pour 4 cases, il est trivial de le faire pour les 64 cases. Mais il faudrait aussi calculer le nombre total de grains...
Restons sur nos 4 première cases. Essaye de compléter le code ci-dessous pour obtenir le nombre total de grains sur les 4 premières cases.

Exercice de code : L'echiquier de Sissa
Complète le code ci-dessous pour calculer le nombre total de grains sur l'échiquier après seulement 4 cases Aide1 Aide2

15 grains seulement ? Le roi était ravi de s'en tirer à si bon compte....
Mais il avait tort ! Recopie ton code précédent ici, et change le pour connaitre le nombre total de grains sur les 64 cases de l'échiquier..

Exercice de code : L'echiquier de Sissa
Complète le code ci-dessous pour calculer le nombre total de grains sur l'échiquier après seulement 4 cases

VAL modeles

Définition

On trouve différentes définitions du type abstrait liste.
Dans ce cours, nous définirons une liste comme une structure de donnée permettant de regrouper des données. C'est une structure linéaire qu'on ne peut parcourir qu'en partant du début. Elle est définie par son interface, c'est à dire l'ensemble des fonctions (méthodes), appelées des primitives.
Il y a de nombreuses possibilités pour implémenter ce type abstrait, et vous n'avez pas besoin de connaître cette implémentation. Il vous suffit de connaître les spécifications des fonctions primitives, pour pouvoir les utiliser et éventuellement écrire d'autres fonctions.
Le type abstrait liste est différent du type list. Nous le noterons dans ce cours, pour bien le différencier, en majuscules : LISTE.
Pour résumé, on peut dire qu'une LISTE est constituée d'une "tête" et d'une "queue". On le comprend bien en regardant quelles "primitives" existent pour ce type abstrait LISTE.

Exemple d'implémentation en Python du type liste

Les primitives

Exercice de code : implémentation des graphes avec une classe
Vous disposez des fonctions "primitives" suivantes :
  • Vide() :
  • Liste(x,liste) :
  • est_vide(liste) :
  • tete(liste) :
  • queue(liste) :
Pour connaître leurs spécifications, vous pouvez utiliser la fonction help().
Recherchez ci-dessous les spécifications de toutes les "primitives

tatata

Exemple : implémentation des graphes avec une classe
Vous disposez des fonctions "primitives" suivantes :
  • Vide() :
  • Liste(x,liste) :
  • est_vide(liste) :
  • tete(liste) :
  • queue(liste) :
Pour connaître leurs spécifications, vous pouvez utiliser la fonction help().
Recherchez ci-dessous les spécifications de toutes les "primitives
Exercice de code
Exercice de code : test nouveau
Consigne : ...... Aide1

Recherchez ci-dessous les spécifications de toutes les "primitives"

BASE PY 3 : découverte des listes

Des boucles avec des listes

premier pas

prenons la liste t1 = [1, 2, 3, 4]

Les éléments sont numérotés, comme ça on peut facilement les retrouver, les modifier, etc... mais en python (et dans la plupart des langages informatiques) le premier élément ne porte pas le n°1, mais ne n° 0.
Au début c'est déroutant, mais on s'y habitue. En fait c'est comme les boucles, ça commence à 0 et pas à 1.

Pour connaitre l'élément 0 d'une liste, par exemple de t1 on utilise t1[0] (qui vaut 1). Évidement t1[1] sera le deuxième élément (qui est 2) et ainsi de suite...

Les boucles et les listes sont très amies, les premières permettant de "parcourir" facilement les secondes. Et cela permet de faire beaucoup de choses bien pratiques.

Exercice à réponse courte
Que va afficher ce code :
t1 = [1, 2, 3, 4]
print(t1[3])

Correct !
Exercice à réponse courte
Que va afficher ce code :
t2=["Armelle", "Julie", "Rose", "Pelajie"]
print(t2[1])

Correct !
Exercice à réponse courte
Que va afficher ce code :
t3=["Lyon", "15h10", "Paris", "16h00", "Marseille", "16h30", "Strasbourg", "18h12","Saint-Etienne", "20h40"]
print(t3[5])

Correct !

Parcours de listes

parcourir une liste

Un exemple avec t1 :

Exemple : parcourir une liste

Dans cette boucle for i prend les valeurs 0 1 2 et 3, on affiche donc t[0] puis t[1] puis t[2] et en dernier t[3].

On dit qu'on parcourt la liste, lorsque pour chacune des valeurs de la liste on fait quelques chose (ici simplement afficher la valeur)

Parcourir une liste et modifier les éléments

Dans tout les exmples ou exercices qui suivront, les 3 listes ci-dessus sont définie par le correcteur et n'apparaissent plus dans les codes.

Exemple : parcourir une liste

Dans ce cas on a modifiés tout les éléments de t1, on les a multipliés par 2. Maintenant t1 est devenue : [2, 4, 6, 8]

Bon évidement ça marche pareil pour une liste de chaines, mais rapellez vous que "Aie" * 3 = "AieAieAie":

Exemple : parcourir une liste

Des boucles un peu plus rusées...

boucles rusées

Faisons la même chose avec la liste t3 définie plus haut. Celle-ci a 8 éléments :

Exemple : parcourir une liste

Ce qui n'est pas intéressant ni très joli. En fait ici, on aimerais bien afficher sur la même ligne la destination et l'heure... Pour cela il faudrait grouper les éléments 2 à 2. Il y a des moyens pour cela en python, que nous avons déjà vu : faire une boucle avec un pas de 2 !

Exemple : parcourir une liste

Ici, i ira comme d'habitude de 0 à 7, mais on a ajouté ,2, donc il ira de 2 en 2. Ainsi i prendra les valeurs 0,2,4,6
Et on s'arrête à 6, car la valeur suivante serait 8, qui est notre limite exclue.

Il a bien affiché un élément sur 2, commençant au 1er (indice 0) jusqu'au 9ème (indice 8). Mais du coup on n'a plus les heures !
Nous allons les afficher en même temps que les villes :

Changeons juste un peu le code :

Exemple : parcourir une liste

Cest déjà beaucoup mieux non ? Bon mais ce serait encore mieux si on mettait un peu de texte dans tout ça :

Exemple : parcourir une liste

Exercice

ex 1
Exercice de code : 1 parcourir une liste
Ecrire un code qui, utilisant la liste eleve, affiche leurs nom, prénoms, et note (sans texte suplémentaire)
ex 2
Exercice de code : 2 parcourir 2 listes et faire la somme
Ecrire un code qui, utilisant les 2 listes de nombres (de même longueur), va parcourir dans une boucle la liste lst1 en la modifiant ainsi : pour chaque valeur dans lst1, la nouvelle valeur sera la somme de l'élément i de lst 1 et de l'élément i de lst2.
Par exemple, avec lst1= [1, 2, 5, 2] et lst2=[4, 2, 1, 4] la liste finale serait :[5, 4, 6, 6]