# Permet de tout executer au lancement du notebook + conserver le notebook actif pendant 2h
from IPython.display import Javascript
from masquer import *
Javascript("""
function repeter(){
IPython.notebook.kernel.execute("a=1");
}
// execute a = 1 en python toutes les 8 minutes pendant 2h
let timerId = setInterval(() => repeter(), 4800);
setTimeout(() => { clearInterval(timerId); alert('fin de cession'); }, 7200000);
// Supprimer la taille limite pour la sortie d'une cellule
IPython.OutputArea.prototype._should_scroll = function(lines) {
return false;
};
IPython.notebook.kernel.execute("url = '" + window.location + "'");
// Exécuter toutes les cellule du notebook
require(
['base/js/namespace', 'jquery'],
function(jupyter, $) {
jupyter.actions.call('jupyter-notebook:run-all-cells-below');
jupyter.actions.call('jupyter-notebook:save-notebook');
Jupyter.actions.call('jupyter-notebook:hide-header')
}
);""")
Hello world (traduit littéralement en français par « Bonjour le monde ») sont les mots traditionnellement écrits par un programme informatique simple dont le but est de faire la démonstration rapide de son exécution sans erreur. (Wikipédia)
En Python :
print()
est une fonction qui permet l’affichage de texte dans la console.print("Hello World")
permet l’affichage dans la console de la chaîne de caractères : Hello WorldQ1. Ecrire et éxecuter le code python pour faire afficher Hello World.
# Question 1
En Python, une chaîne de caractères s’écrit entre guillemets (" ") ou entre quotes (' '), les lignes suivantes donnent donc la même chose :
print("Ceci est une chaîne de caractères")
print('Ceci est une chaîne de caractères')
Q2. Tester les deux instructions ci-dessus avec la chaine de caractère : C'est la rentrée
. Quelle conclusion en tirez-vous ?
# Question 2
Une variable comme son nom l’indique c’est variable...
Par exemple, le code suivant stocke la phrase précédente dans la variable maphrase et
ensuite l’affiche :
maphrase = "Ceci est une chaîne de caractères."
print(maphrase)
En Python, l’opérateur = permet l’affectation d’une valeur à une variable : variable = valeur.
Q3. Que se serait-il passé si on avait inversé les deux lignes de codes précédentes ? Et pourquoi ?
# Questions 3
REMARQUE : Si vous exécutez d'abord les 2 lignes de code dans le bon ordre, puis dans le mauvais, vous ne remarquerez rien de particulier.
Par contre, si vous relancez le noyau Python avec le bouton Redémarrer de la barre d'outils (voir image ci-dessous) avant d'exécuter les lignes dans le mauvais ordre, un problème devrait apparaître. Essayez de comprendre pourquoi relancer Python change quelque chose.
Bien entendu, le contenu d'une variable peut être modifié à tout moment.
Q4. Ajouter une cellule de code (bouton $+$ de la barre d'outils) pour tester le code ci-dessous.
maphrase = 'Ceci est une chaîne de caractères' print(maphrase) maphrase = 'Ceci est une autre chaîne de caractères' print(maphrase) maphrase = 23 print(maphrase)
Vous voyez que la même instruction print(maphrase)
donne un résultat différent suivant le moment où on l'exécute. C'est comme si on vous demandait de vider votre sac, suivant le moment où l'on vous le demande, on n'y trouvera pas la même chose.
CONCLUSION :
Une variable est un conteneur dans le contenu peut varier. Si il ne varie pas, on parle souvent de constante.
En informatique on manipule des données, elles peuvent être de types simples (nombres, mots, booléens(Vrai ou Faux)) ou, comme nous le verrons plus tard, de types construits (listes, tuples, dictionnaires) et même structurées (tableaux, base de données).
int
, pour integer.float
, pour nombre à virgule flottante.Remarque : Du fait de la limitation de la place en mémoire, en informatique tous les nombres réels sont forcément des nombres décimaux, c'est-à-dire des nombres dont le nombre de chiffres après la virgule fini. Cela est à l'origine d'approximations dans les calculs qui peuvent parfois s'avérer problématiques. Aussi bizarre que cela puisse paraitre, en général, les ordinateurs calculent faux !! Sauf si on se limite aux nombres entiers ...
str
, pour String.bool
, pour boolean. Un booléen ne peut avoir que deux valeurs : True
ou False
.En Python :
type()
permet de connaître le type d'une variable existante.Q5. Pour mettre en évidence ce typage implicite, compléter puis exécuter le code suivant dans lequel on affecte des valeurs à des variables puis on affiche leur type.
n= # affecter un entier x= # affecter un floatant maphrase= # affecter une chaîne de caractère test= # affecter un booléen print(type(n)) print(type(x)) print(type(maphrase)) print(type(test))
# Question 5
En Python, la fonction input()
permet à l’utilisateur de rentrer une donnée au clavier pour une utilisation ultérieure dans le programme.
Le texte tapé par l’utilisateur est toujours de type str
mais il est possible d'en modifier le type à l'aide des fonctions int()
ou float()
par exemple.
Q6. Exécuter les deux programmes suivants en entrant les mêmes nombres au clavier. Ces 2 programmes se ressemblent beaucoup mais il y a pourtant une différence fondamentale entre eux, laquelle ?
n1=input('Entrer un nombre :') n2=input('Entrer un nombre :') print(n1+n2, type(n1+n2))
n1=int(input('Entrer un nombre :')) n2=int(input('Entrer un nombre :')) print(n1+n2, type(n1+n2))
# Question 6
CONCLUSION :
Le typage implicite rend l'usage de Python assez facile mais aussi assez piégeux. Il faut être très vigilant sur le type des variables utilisées. Lorsqu'un programme fonctionne mais ne donne pas le résultat attendu, commencer par vérifier le type des variables utilisées, sachant qu'il peut varier au cours du programme.
Les différentes opérations possibles dépendent du type de données manipulées : numérique, booléen, chaîne de caractères, ...
+
-
*
/
//
($5\, // \, 2 = 2$ car $2\times 2 < 5 < 3\times 2$)%
($5 \, \% \, 2 = 1$ car $5 =2\times 2 + 1$)**
En Python :
sqrt()
(pour la racine carrée), sin()
, cos()
, exp()
, ... nécessitent d'importer la bibliothèque math
en ajoutant l'instruction from math import *
au début du programme.Q7. On considère les variables $a = 51$, $b = 7$, $c = 21.4$, calculer et faire afficher les résultats des opérations suivantes : $a + b$, $b - c$, $a\, /\, b$, $a \times b$, $a\, //\, b$, $a\, \%\, b$, $b^4$ et $\sqrt{\frac{a + c}{b^2}}$. Attention aux parenthèses, les règles de priorités des opérateurs s'appliquent, comme en mathématiques.
# Question 7
Remarques :
L'opération qui consiste à assembler bout à bout 2 chaînes de caractère s'appelle une concaténation.
En Python, la concaténation se fait simplement avec l'opérateur +
, comme une addition de nombres.
Q8. Corriger les lignes de code suivantes pour qu'elles affichent 'Ceci est une chaîne de caractères.'
en utilisant la concaténation.
ch1='Ceci est une' ch2='chaîne de caractères.' print(ch1)
# Question 8
Questions subsidiaires : D'après vous, que produirait les instructions :
print(ch1,ch2)
?print(3*ch1)
?Faire le test après y avoir bièvement réfléchi.
En Python, une chaîne de caractères est dite itérable, cela signifie que l’on peut accéder à chacun de ses caractères grâce à son indice : mais ATTENTION le premier caracrère porte l'indice 0, le deuxième l'indice 1, ...
Si la variable maphrase
est une chaîne de caractère, on accède à son caractère d'indice i (i est un entier) grâce à l'expression maphrase[i]
.
La fonction len()
renvoie la longueur d’une chaîne de caractères, c'est-à-dire le nombre de caractères qui la compose.
Q9. Soit la chaîne de caractères 'Ceci est une chaîne de caractère'
:
maphrase
.maphrase
puis son 4ème caractère (c'est un "i" !).# Question 9
En Python, on peut aussi accèder directement à une sous-chaîne (un morceau) d'une chaîne de caractères grâce aux slices.
Supposons que la variable maphrase
contienne un chaîne de caractères, alors :
maphrase[p:q]
correspond à la sous-chaîne allant de l'indice p à q-1.maphrase[p:]
correspond à la sous-chaîne depuis l’indice p jusqu’à la fin de la chaîne.maphrase[:q]
pour la sous-chaîne depuis l’indice 0 jusqu’à l’indice q - 1 de la chaîne.Q10. En utilisant les 3 expressions précédentes, faire afficher les mots 'Ceci', 'chaîne' et 'caractères.' en découpant la chaîne 'Ceci est une chaîne de caractères.'
.
# Question 10
Une instruction conditionnelle est une instruction qui ne s'éxecute que si une certaine condition est réalisée. Cette condition s'écrit le plus souvent sous la forme d'un test de comparaison. En général, l'instruction conditionnelle n'est exécutée que si le résultat de ce test est vrai.
Soient x et y deux variables numériques, alors on peut tester :
x == y
x != y
x >= y
x <= y
x > y
x < y
Dans tous les cas, ces tests ne peuvent valoir que True ou False ; ce sont donc des booléens.
Remarques :
Par exemple, exécuter la cellule ci-dessous. Etonnant, non ? Quand je vous dis que les ordinateurs ne savent pas calculer ...
x=3*0.1
print (x == 0.3)
False
En Python, comme en mathématiques, il existe des règles de priorité sur les opérateurs qui peuvent rendre l'utilisation de parenthèses nécessaires. Dans le doute, mettez des parenthèses !!
Q11. D'après vous que vaut l'expression 3*7%3 == 0
? Après y avoir réfléchi, faire afficher la valeur de cette expression dans python et comparer à celle de 3*(7%3) == 0
. Que peut-on en déduire sur la priorité de l'opérateur * par rapport à % ?
# Question 11
En Python, une structure conditionnelle s'écrit en toute généralité de la façon suivante :
if test == True : instruction1 else : instruction2
Cela signifie que instruction1
sera exécutée si le résultat du test est vrai et que sinon, c'est l'instruction2
qui sera exécutée.
Comme la véracité du test est la condition par défaut pour exécuter la première instruction, le code précédent est complétement équivalent au code suivant :
if test : instruction1 else : instruction2
IMPORTANT :
if
et else
est obligatoire. Il indique le début des blocs d'instructions qui seront exécutés dans chacune des cas.Si vous ne respectez pas cette syntaxe, le programme ne fonctionnera pas, ou pire, il fonctionnera mal !
Remarques :
else
n'est pas obligatoire.instruction1
si le résultat du test est faux en mettant comme condition test == False
ou test != True
ou encore not(test)
(la dernière expression est la meilleure).and
, or
et not
("et", "ou" et "non"). Par exemple, l'expression (test1 and test2) == true
n'est vraie que si test1 et test2 sont vrais simultanément.Q12. Avec les lignes de code suivantes, préciser quelles doivent être les valeurs (True ou False ou N'importe) de test1 et test2 pour que chacune des 5 instructions soient exécutées. Pour cela modifier le tableau réponse de la question 12 ci-dessous en mettant "False" ou "N'importe" à la place de True lorsque c'est nécessaire (double-cliquer sur la cellule pour la modifier).
if test1 == True: instruction1 if test2 == False: instruction2 else: instruction3 else: instruction4 instruction5
# Question 12
Instruction | test1 | test2 |
---|---|---|
instruction1 | True | True |
instruction2 | True | True |
instruction3 | True | True |
instruction4 | True | True |
instruction5 | True | True |
Une structure itérative permet de répéter une instruction ou un bloc d'instructions un nombre entier de fois.
Ce nombre de répétitions peut être fixé à l'avance (boucle for
) ou bien il peut dépendre de la réalisation d'une condition (boucle while
).
En Python, les façons les plus courantes d'écrire une boucle for
sont :
for i in range(10): # i varie de 0 à 9 par pas de 1 ==> 10 exécutions des instructions instructions
for i in range(1,10): # i varie de 1 à 9 par pas de 1 ==> 9 exécutions des instructions instructions
for i in range(0,10,2): # i varie de 0 à 9 par pas de 2 ==> 5 exécutions des instructions instructions
for i in range(10,0,-1): # i varie de 10 à 1 par pas de -1 ==> 10 exécutions des instructions instructions
Remarques :
for
finit par un ":" et la suivante est indentée afin de délimiter le bloc d'instructions à répéter.range(debut, fin, pas)
qui renvoie en réalité une liste d'entier dont la première valeur est égale à debut
et les suivantes sont incrémentées de pas
en s'arrêtant juste avant d'atteindre ou de dépasser fin
.# déclaration de la variable maphrase maphrase='Ceci est une chaîne de caractères.' # pour chaque valeur de l'indice i dans l’intervalle [0,len(maphrase)-1] for i in range(len(maphrase)): print(maphrase[i])
# déclaration de la variable maphrase maphrase='Ceci est une chaîne de caractères.' # pour chaque(for) caractère(car) dans(in) maphrase for car in maphrase: print(car)
En Python, on peut par exemple écrire une boucle while de la façon suivante :
i=0 pas=1 while i<10 : instructions i=i+pas
Tant que la condition i < 10 est vérifiée, les instructions contenues dans la boucle while sont exécutées.
Dans cet exemple, $i$ vaut $0$ au premier tour de boucle, puis $1$ au suivant et ainsi de suite jusqu'à $i=9$ pour le dernier tour de boucle. La valeur de $i$ passe alors à $10$ et la condition $i<10$ n'est plus remplir pour un nouveau passage dans la boucle. Les instructions contenues dans la boucle seront donc exécutées 10 fois (de $i=0$ à $i=9$).
Cette boucle while est donc équivalente à une boucle for i in range(10)
.
Il faut faire très attention avec une boucle while car si la condition reste toujours vraie, on crée une boucle infinie de laquelle le programme ne pourra jamais sortir. Pour éviter cette boucle infinie, il faut toujours s'assurer que les instructions contenues dans la boucle while sont à même de rendre fausse la condition de sortie de la boucle.
Q13. Pour chacun des 3 programmes ci-dessous, essayer de prévoir ce que vaudra x à la fin de la boucle puis le vérifier en exécutant ces programmes.
#pgm1 x = 0 for i in range(5): x = x + i #pgm2 x = 20 for i in range(1,6): x = x - i #pgm3 x = 1 i=0 while i < 1: x = x + 1 i = i + 0.2
# Question 13
Q14. Modifier ce programme pour qu'il compte également les "e" accentués puis pour qu'il compte toutes les voyelles, accentuées ou non.
Remarque : Il est préférable de tester le programme sur d'autres phrases pour vérifier qu'il fonctionne correctement.
# Question 14
Q15. Écrire un programme qui demande à l’utilisateur de rentrer un texte, puis qui affiche le pourcentage de "e" contenu dans le texte.
# Question 15
Le principe est simple, l’ordinateur choisit aléatoirement un entier compris entre 1 et 100, et l’utilisateur doit le trouver.
Nous aurons besoin de la bibliothèque random
pour utiliser la fonction randint(a,b)
qui renvoie un nombre entier aléatoire entre a et b compris.
Dans cet algorithme, on initialise une variable nombre_a_tester
à 0, puis, tant que le nombre n'est pas trouvé, on invite l’utilisateur à entrer un nombre et on lui indique si le nombre cherché est plus grand ou plus petit.
Voilà le programme:
from random import * nombre_a_trouver = randint(1,100) nombre_a_tester = 0 while nombre_a_tester != nombre_a_trouver: nombre_a_tester = int(input("veuillez entrer un entier entre 1 et 100 : ")) if nombre_a_tester > nombre_a_trouver : print("C’est moins !") if nombre_a_tester < nombre_a_trouver : print("C’est plus !") print("Bravo ! Vous avez trouvé :",nombre_a_tester)
Q16. Modifier le programme pour qu'il affiche aussi le nombre d'essais dont a eu besoin l'utilisateur pour gagner.
# Question 16
Q17. Que fait le programme suivant ?
from random import * lettres = "abcdefghijklmnopqrstuvwxyz" lettre_a_trouver = lettres[randint(0,len(lettres)-1)] lettre_a_tester = "0" compteur=0 while lettre_a_tester != lettre_a_trouver : lettre_a_tester = input("veuillez entrer une lettre en minuscule(non accentuée).") compteur=compteur+1 if lettre_a_tester > lettre_a_trouver : print("C’est avant !") if lettre_a_tester < lettre_a_trouver : print("C’est après !") print("Bravo ! Vous avez trouvé ",lettre_a_tester, " en " , compteur , " essais.")
# Question 17
Une fonction est une sorte de raccourci vers un morceau de code qui réalise une tâche bien précise et que l'on compte utiliser plusieurs fois.
En général, la fonction prend des variables en entrée, on les appelle les paramètres de la fonction et renvoie un résultat (qu'il soit numérique ou pas). On parle souvent de procédure pour les fonctions qui ne renvoient pas de résultat (elle modifie seulement les paramètres ou elle affiche quelque chose par exemple).
L'intérêt d'une fonction est à la fois de rendre plus lisible un programme en le découpant en tâches simples réalisées par des fonctions aux noms explicites et de le simplifier en évitant de recopier plusieurs fois des morceaux de codes presques identiques.
Une fonction peut être sauvegardée dans un fichier séparé et importée dans le programme principal.
En Python, une fonction nommée mafonction
qui prend en entrée les paramètres parametre1
et parametre2
est définie par l'instruction suivante :
def mafonction(parametre1, parametre2, ...):`
A l'intérieur de la fonction parametre1
et parametre2
sont des variables locales dont la valeur n'est pas définie tant que la fonction n'a pas été appelée.
Appeler la fonction revient à donner une valeur à ces variables locales puis à exécuter les instructions contenues dans la fonction. Les instructions contenues dans une fonction ne sont donc exécutées pour la première fois que lors du premier appel de la fonction.
L'instruction return
permet de préciser ce que renvoie la fonction.
Quelques exemples de fonctions à tester :
# définition d'une fonction f(x) qui prend 1 paramètre en entrée et renvoie un résultat def f(x) : return x**2+1 # on appelle la fonction f(x) pour x=i avec i variant de 0 à 4 et on affiche le résultat for i in range(5) : print(f(i))
# définition d'une fonction mafonction() qui ne prend pas de paramètre et ne renvoie rien (elle se contente d'afficher des ) def mafonction() : for i in range(5) : print(i'*') # On appelle la fonction mafonction() mafonction()
# définition d'une fonction max(a,b) qui prend 2 paramètres et renvoie un résultat def max(a,b) : if a >= b : return a else : return b # on affiche le résultat de la fonction max(a,b) pour a = 25 et b = 13 print(max(25,13))
ATTENTION :
Les fonction f(x)
et max(a,b)
telles que définies ci-dessus n'affichent rien, elles renvoie juste un résultat. Ainsi l'instruction max(25,13)
seule fait le calcul demandé mais c'est tout et sans le print()
, on peut avoir l'impression qu'il ne s'est rien passé (tout dépend de l'environnement dans lequel on exécute le programme).
On peut aussi utiliser une fonction pour affecter une valeur à une variable avec m=max(25,13)
puis faire un print(m)
si nessécaire.
Q.18 Prévoir puis vérifier ce que renvoie l'instruction print(max(2,7),max(max(54,10),58))
.
# Question 18
Pour bien faire, toute fonction se doit d’être spécifiée, c'est-à-dire d'être livrée avec son mode d'emploi. (Mais on ne le fera pas tout le temps par souci de gain temps.)
En Python, il suffit pour cela d’écrire en début de fonction entre des triples guillemets le type des paramètres d’entrées (entier, booléens, ...) et éventuellement les conditions sur ces paramètres (positif, négatif, ...), ce que fait la fonction et enfin ce qu'elle renvoie.
Par exemple pour notre fonction max(a,b)
précédente cela pourrait donner :
def max(a,b): """ a est un entier, b est un entier. Compare les valeurs de a et b et renvoie le plus grand des 2.""" if a >= b : return a else : return b
En Python, l’instruction help(max)
affichera alors les spécifications de la fonction pour permettre à l'utilisateur de savoir comment l'utiliser :
Help
max(a, b)
a est un entier, b est un entier. Compare les valeurs de a et b et renvoie le plus grand des 2.```
Q.19 Afficher l'aide de la fonction print
. Que signifie le fait que la valeur par défaut du paramètre end
est '\n'? Tester le paramètre sep
et décrire son utilisation.
# Question 19
Q.20 Après les avoir tester si nécessaire, écrire les specifications des 3 programmes suivants :
def table_mult(a): for i in range(11): print(a, " x ", i, " = ", a*i)
def est_premier(n): if n==2: return True if n%2 == 0 or n == 1: return False for i in range(3,n,2): if n%i == 0: return False return True
def palindrome(mot): l=len(mot) for i in range(l//2): if mot[i] != mot[l-i-1]: return False return True
# Question 20
Ces exercices ont pour objectif de vous faire utiliser ce qui a été vu tout au long de ce TD.
ATTENTION : Les consignes sur ce que font les fonctions doivent être respectées scrupuleusement ! En particulier, elles doivent renvoyer ce qui est demandé et prendre les paramètres demandés.
Définir une fonction inverse(mot)
qui prend en paramètre un mot et qui renvoie le mot écrit à l’envers.
Exemple : bonjour → ruojnob
REMARQUE : La fonction en elle-même ne doit rien afficher mais vous pouvez faire afficher son résultat si besoin.
La distance de Hamming entre deux mots de même longueur est le nombre d’endroits où les lettres sont différentes.
Par exemple, prenons les mots 'japon' et 'savon'. La première lettre de japon est différente de la première lettre de savon, les troisièmes aussi sont différentes. La distance de Hamming entre 'japon' et 'savon' vaut donc 2.
Écrire une fonction qui calcule la distance de Hamming entre deux mots entrés par l’utilisateur.
REMARQUE : Cette fonction renvoie un résultat mais ne prend pas de paramètres.
Le latin-cochon : On transforme un mot commençant par une consonne selon la recette suivante :
Ainsi, par exemple, VITRE devient ITREVUM.
Écrire une fonction qui transforme un mot en majuscules, donné en argument, en latin-cochon et renvoie le résultat obtenu.
REMARQUE : Le mot à transformer peut être entré au clavier par l'utilisateur mais pas dans la fonction elle-même.
Écrire une fonction qui affiche, séparés par des tirets, les diviseurs d’un entier donné en argument.
Exemple : 126 → 1-2-3-6-7-9-14-18-21-42-63-126
Un nombre de Armstrong est un entier positif égal à la somme des cubes de ses chiffres.
Exemple : 153 = 1 +125 +27
Écrire une fonction qui prend en paramètre un entier $n>0$, qui affiche sur des lignes différentes tous les nombres de Armstrong inférieur ou égal à $n$ et retourne le nombre total de nombres d'Amstrong trouvés.
REMARQUE : En dehors de 1, il n'existe que 4 nombres d'Amstrong et ils sont tous entre 100 et 500.
La suite de Fibonacci est définie par $f_0 = 0$, $f_1 = 1$ et $f_{n+2} = f_{n+1} + f_n$.
Écrire une fonction qui prend en paramètre un entier $n$ et qui affiche les $n$ premiers termes de la suite de Fibonacci sur des lignes distinctes.
# Exercices