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.

Example

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 :

Example

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

Coding Exercise
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...
Example

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

Example

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 :

Example

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.
Coding Exercise: 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 :

Example

Revenons à Pythagore

Example

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

Coding Exercise: 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 :

Example: 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.

Coding Exercise: 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

Coding Exercise
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

Coding Exercise: 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.
Coding Exercise: 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
:
Coding Exercise: 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 ?
:
Scramble Exercise: 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)


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


A vous maintenant !

Coding Exercise: 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 :
Coding Exercise: Compléter cette fonction qui doit renvoyer la longueur de la liste, sans utiliser de fonction récursive.

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

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

exercice 4
Coding Exercise: 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
Coding Exercise: 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

S 1 - Bases en Python - les boucles

le cours

Premier exemple

Example: 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

Example: 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

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

Un premier exercice

Coding Exercise: 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).

Example: #affiche a dans la boucle:
ne pas confondre avec :
Example: #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 :

Example: 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 ;

Example: 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 ».

Scramble Exercise: 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.

Coding Exercise: 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..

Coding Exercise: 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

Coding Exercise: 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

Example: 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
Coding Exercise
Coding Exercise: 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.

Short Answer Exercise
Que va afficher ce code :
t1 = [1, 2, 3, 4]
print(t1[3])

Correct!
Short Answer Exercise
Que va afficher ce code :
t2=["Armelle", "Julie", "Rose", "Pelajie"]
print(t2[1])

Correct!
Short Answer Exercise
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 :

Example: 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.

Example: 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":

Example: 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 :

Example: 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 !

Example: 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 :

Example: 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 :

Example: parcourir une liste

Exercice

ex 1
Coding Exercise: 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
Coding Exercise: 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]

BASE PY 1 : boucles for

1. Les entiers de 0 à 11
Coding Exercise: Afficher les entiers de 0 à 11
2. Les entiers de 10 à 21
Coding Exercise: Afficher les entiers de 10 à 21
Aide
3. faire une somme
Coding Exercise: Afficher la somme des entiers de 1 à 101
Ecrivez ci-dessous un code qui calcule la somme 1 + 2 + 3 + ..... + 101 et l'affiche à la fin (il faut ici utiliser un accumulateur, cf ci-dessus)
4. affichage décroissant
Coding Exercise: Afficher les entiers 97, 91, 85, 79
Ecrivez un code qui affiche les entiers 97, 91, 85, 79 (en utilisant la boucle For i in range) Aide

retour sur les exercices 2 et 4
Il existe des façon plus astucieuses de réaliser les boucles dans certains cas. Par exemple, pour l'exercice 2 : afficher les entiers de 10 à 21, on pouvais écrire :
Example
for i in range(start,stop) : la boucle début avec i=start et stoppe avec i=stop-1
mais :
for i in range(10,4) : commençant à 10 et finissant à 3, cette boucle ne sera pas exécutée !
Cependant... il est possible de faire aussi des boucles décroissantes. A l'exercice 4 on demandait d'afficher les entiers 97, 91, 85, 79. Cela est réalisé par :
Example
Le troisième nombre, ici -6, est le pas.
for i in range(start,stop,pas) : la boucle débute avec i=start i augmente de pas à chaque itération. On arrete quand on atteint ou dépasse stop.
ainsi:
for i in range(10,14,3) : commençant à 10, puis 13 et on stoppe là, la valeur suivante serait 16 dépasse 13
for i in range(10,4,-3) : commençant à 10, puis 7 et on stoppe là, la valeur suivante serait 4 atteint la limite 4
Coding Exercise: Lucky Sevens
Ecrire un programme, uyilisant une for boucle for avec un pas de 10, pour afficher tous les nombre à 2 chiffres terminant par 7.

La table de 9
Example
Voici un code qui affiche la table de 9
C'est assez ennuyeux de devoir répéter 10 fois quasiment la même ligne... Complète le code ci-dessous qui fait la même chose avec une boucle
Coding Exercise: Afficher la table de 9
Complète le code ci-dessous pour afficher la table de 9 de 0*9=9 jusqu'à 10*9=90.
Coding Exercise: Afficher la table de 8
Quand tu as validé l'exercice précédent, recopie le ici et modifie le pour afficher la table de 8

les carrés parfaits
Coding Exercise: Les carrés
Ecrivez un code qui affiche les carrés des entiers de 1 à 12 (c'est à dire: 1, 4, 9, 16, .... 144 )
Dans cette première version tu dois utiliser une boucle for commençant à 0
Coding Exercise: Les carrés
Ecrivez un code qui affiche les carrés des entiers de 1 à 12 (c'est à dire: 1, 4, 9, 16, .... 144 )
Dans cette seconde version tu dois utiliser une boucle for commençant à 1

S1-2 les variables

Des erreurs fréquentes

Si vous demandez à Python d'utiliser une variable qui n'est pas définie, vous obtenez une erreur.

NameError

Example: Une variable non définie

Comme vous pouvez le constater, nous obtenons un message d'erreur disant  NameError: name 'trouble' is not defined. Quelquefois, de telles erreurs sont dues à des erreurs de frappes : si vous définissez une variable adresse=32, et ensuite print(adrese), le même type d'erreur est généré.

SyntaxError

Un autre type d'erreur fréquent est généré quand vous écrivez une instruction qui n'a pas de sens pour python.

Par exemple, si vous inversez le sens de l'instruction =.

Example: SyntaxError: can't assign to literal
Cherchez l'erreur...

La première ligne est bien mais la deuxième génère une erreur : Python pense que la deuxième ligne 4 = x essaye de changer la valeur de 4 mais vous n'êtes autorisé qu'à changer la valeur d'une variable, et 4 n'est pas une variable. Si A = B et B = A représentent la même chose en mathématiques, ce n'est pas le cas en programmation.

Autre exemple, si vous omettez quelques chose, par exemple, une parenthèse :

Example: SyntaxError:
Cherchez l'erreur...
L'instruction print(x) est incomplète, il manque la parenthèse fermante. L'interpréteur Python cherche la parenthèse manquante et constate l'erreur seulement quand il passe à la ligne suivante. Pour cette raison, il indique l'erreur à la ligne juste en dessous et non pas à l'endroit ou la parenthèse manque.

IndentationError

Coding Exercise: IndentationError: unexpected indent
Exécutez ce code et corrigez le pour qu'il s'exécute sans erreur...

On s'attendrait que le programme affiche 5, mais il génère une erreur. Examinons-la. Il faudra d'ailleurs prendre l'habitude de décrypter les messages d'erreur pour pouvoir comprendre l'erreur commise. Corrigez l'erreur pour que le code s'exécute correctement.

TypeError

Coding Exercise: TypeError: ...
Exécutez ce code et corrigez le pour qu'il s'exécute sans erreur...

On s'attendrait que le programme affiche 0.5, mais il génère une erreur.

Lisez bien l'erreur et comprenez la :

TypeError: unsupported operand type(s) for /: 'str' and 'int'
Littéralement : Erreur de type : les types des opérandes pour la division ne sont pas supportés : str et int.

En clair : vous effectuez la division d'une chaine par un entier, cela n'a pas de sens et n'est pas supporté par l'interpréteur.

Exercices

Ceci est un échauffement pour vous familiariser avec les variables.

Anatomie Python
Coding Exercise: L'anatomie Python
Ecrivez un code qui compte les têtes, les épaules, les genoux et les orteils à une fête. Le correcteur va automatiquement définir une variable personnes pour vous, elle contiendra le nombre de personnes à la fête.
Votre code doit définir quatre variables :
  • une appelée tetes
  • une appelée epaules
  • une appelée genoux
  • et une appelée orteils
égales au nombre de têtes, épaules, genoux et orteils à la fête. Votre programme ne doit pas générer de sortie. Cliquez ici pour un indice.

Désordre
Scramble Exercise: Calculette vitesse
Vous assistez à une course cycliste qui monte et descend une colline. Le correcteur automatique définira quatre variables pour vous : distanceMontee et distanceDescente donnent la distance (en km) des deux parties de la course, et tempsMonte et tempsDescente donne le temps (en minutes) du temps pris pour compléter chaque partie de la cours. Ecrivez un programme qui indique la vitesse moyenne (en km/min) pour toute la course.
Cliquez et glissez avec la souris pour réarranger les lignes.
Cliquez ici pour un indice si vous êtes bloqué
  • print(vitesseMoyenne)
  • distanceTotale = distanceMontee + distanceDescente
  • vitesseMoyenne = distanceTotale / tempsTotal
  • tempsTotal = tempsMonte + tempsDescente

programme d'échange

Voici un tout premier algorithme, qui est très fréquemment utilisé. Le problème est d'échanger les contenus de deux variables, nommons les x et y.

Par exemple, initialement on a :

x = 4

y = 3

Et on souhaite modifier l'état pour parvenir à :

x = 3

y = 4

On pourrait songer à écrire que x prend la valeur de y et y prend la valeur de x. C'est ce que fait le code ci-dessous, mais vous allez pouvoir constater que celà ne va pas fonctionner....

Coding Exercise: Programme d'échange
Le correcteur va automatiquement définir les variables x et y pour vous, avec des valeurs numériques.

Vous devez modifier le code pour réellement échanger les valeurs :

la valeur de x après que votre code soit exécuté doit être égale à la valeur que y avait avant que votre code s'exécute, et la valeur de y après que votre code s'exécute doit être celle de x avant que votre code s'exécute.

Cliquez sur chaque indice si vous voulez les lire.

T-3.2 Récursivité

Exemples et Exercices

Exemples
Vous savez très bien utiliser une boucle for pour calculer une somme :
  • On initialise la variable somme
  • On itère
  • Dans la boucle on ajoute les éléments
C'est un accumulateur. Exemple :
Example: Calculer la sommes des inverse des carrés des entiers de 1 à n

Pour la petite histoire, cette somme tend vers π²/6, cela peut être démontré mais ce n'est pas notre propos.

Il existe une autre façon de calculer cette somme. L'idée est la suivante :

On ajoute (dans somme) 1/n² puis la somme des inverses des carrés des entiers de 1 à n-1.

Mais en fait nous n'allons pas utiliser de variable somme. On va renvoyer le résultat. En fait on peut écrire :

 \sum\limits_{i=1}^n \frac{1}{i^2} = \frac{1}{n^2} + \sum\limits_{i=1}^{n-1} \frac{1}{i^2}

Ce qui, dans le code, ce traduit par :

somme_inverse_carres(n) = 1/n**2 + somme_inverse_carres(n - 1)

Nous allons voir comment programmer cela. L'idée est donc que la fonction sum_inverse_carres s'appelle elle même. On désigne cela par le terme de fonction récursive.

Toutefois, il faut que le processus s'arrête.... Ici on appelle la fonction avec n-1 donc la valeur de l'argument décroit. Jusqu'où ???

En fait, dans tout programmation récursive on doit définir un cas de base, un cas simple où le résultat est trivial, et on peut renvoyer ce résultat sans rappeler la fonction.

Ici le cas de base est n = 1, et la valeur renvoyée dans ce cas est 1.

Example: version récursive du code précédent

Exercices

Exercice 1 : somme des entiers de 0 à n

Coding Exercise: Somme des entiers de 0 à n
Vous savez programmer cela en itératif avec une boucle for, mais ici vous devez le faire de façon récursive.

COnTRAINTE : vous ne pouvez pas utiliser for ou while dans cet exercice.

Exercice 2 : a^n

Oui... je sais, nous l'avons déjà vu en exemple .... mais saurez vous le refaire ?

Coding Exercise: calculer a^n

Il faut toujours penser à vérifier les cas "limites".
Votre fonction renvoie-t-elle le bon résultat pour 0^0?


Indice 
Réponse 

T1.c Listes en compréhension

Listes en compréhension

Une manière originale et très puissante de générer des listes est d'utiliser une liste en compréhension (ou la compréhension de listes). Pour plus de détails, consultez à ce sujet le site de Python et celui de Wikipédia.

Voici quelques exemples.

Nombres pairs compris entre 0 et 30

Example: comprégension avec un if

Jeu sur la casse des mots d'une phrase

Example: utiliser split, puis upper

Formatage d'une séquence avec 60 caractères par ligne

Exemple d'une séquence constituée de 150 alanines :

Example: Formater un chaine

T1.b copier des listes : ATTENTION


Copier une liste


Cette section est particulièrement importante et doit être bien comprise

Example: Copier une liste ? ATTENTION !

Vous voyez que la modification de x modifie y aussi ! 
Dans python tutor ( cliquer sur visualiser pour acceder à python tutor) vous pouvez voir que x=y n'a pas dupliqué la liste.

Techniquement, Python utilise des pointeurs (comme dans le langage de programmation C) vers les mêmes objets. Python Tutor l'illustre avec des flèches qui partent des variables x et y et qui pointent vers la même liste. Donc, si on modifie la liste x, la liste y est modifiée de la même manière. Rappelez-vous de ceci dans vos futurs programmes car cela pourrait avoir des effets désastreux !

Pour éviter ce problème, il va falloir créer une copie explicite de la liste initiale. Observez cet exemple :

Example: Copier une liste ? ATTENTION !

Si on regarde à nouveau dans Python Tutor (Figure 12), on voit clairement que l'utilisation d'une tranche [:] ou de la fonction list() crée des copies explicites. Chaque flèche pointe vers une liste différente, indépendante des autres

Attention, les deux techniques précédentes ne fonctionnent que pour les listes à une dimension, autrement dit les listes qui ne contiennent pas elles-mêmes d'autres listes.

Example: Copier une liste ? ATTENTION !
Example: Avec deepcopy