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.
A vous de jouer !
Ecrire ci dessous les instructions qui permettent d'obtenir successivement les affichages suivants :
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
A vous de résoudre ce problème
Ecrire ci-dessous une fonction taille qui remédie à ce problème
Aide1
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 :
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.
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
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 :
Si l'on reprend notre exemple de recherche du minimum dans une liste, nous aurions ceci en programmation fonctionnelle sur Python :
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 :
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 ...
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 :
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 :
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 :
Exercice
Modifier un dictionnaire
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 :
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
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.
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 :
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 :
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) ;
Exercice
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
Exercice
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 :
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.
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 :
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
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...
Cette fois le code va afficher que le triangle n'est pas rectangle. Mais.... est-ce bien correct ??? Regarde ceci :
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 :
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.
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 :
Revenons à Pythagore
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
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 :
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.
3 dés
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
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.
A vous d'utiliser les primitives
:
Dans quel ordre implémenter la liste ?
:
A vous maintenant !
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 2
exercice 3
exercice 4
exercice 5
Dans cet exercice, vous ne pouvez utiliser ni len, ni for, ni while, ni in
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
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
Un premier exercice
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).
ne pas confondre avec :
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 :
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 ;
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 ».
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.
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..
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
tatata
Recherchez ci-dessous les spécifications de toutes les "primitives"
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 :
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.
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":
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 :
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 !
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 :
Cest déjà beaucoup mieux non ? Bon mais ce serait encore mieux si on mettait un peu de texte dans tout ça :
Exercice
ex 1
ex 2
Utiliser une pile intermédiaire qui servira à empiler ce qui a été dépilé, pour ensuite pouvoir le récupérer
Pour savoir si N est pair, tester N%2 == 0
Les indices sont des entiers... utilisez la division entière !
ATTENTION : la valeur de rang N/2 à pour indice N/2 - 1
Dans la boucle tu dois ajouter les grain au total puis recalculer le nombre de grains sur la prochaine case...
Avant boucle le nombre de grains sur l'échiquer est égal à 0
la position de la tete et de la queue est importante pour la liste