Introduction à Python
Python est un langage de programmation dont l'ambition est de proposer une syntaxe claire et peu rebutante tout en offrant des outils adaptés au traitement de problèmatiques diverses. Désormais Python est un langage très populaire, répandu et largement diffusé dans l'industrie, le monde universitaire et chez les pédagogues.
C'est un langage à la syntaxe simple :
- typé dynamiquement
- multiplateforme
- placé souslicence libre
- doté d'outils dehaut niveau
Le but de ce TD est de proposer un initiation à la programmation sous Python sans prérecquis particuliers (même pour des débutants en programmation). Les notions de programmation, ainsi que les particularités au langage Python seront introduites au fur et à mesure, ponctuées de mises en situation, et de cas pratiques. Les énonces bleus sont des exercices d'application direct. Les énoncés verts sont des exercices "fil rouge" sur lesquels on reviendra plusieurs fois dans le TD afin de produire un programme un peu plus complet.
IPrésentation de l'environnement Spyder
Nous utiliserons l'environnement de développement Spyder pour pratiquer la programmation Python.
- La partie en bas à droite est la console : elle permet d'exécuter des commandes simples en Python, tenant généralement sur une ligne. C'est utile pour tester des petites parties indépendantes d'un programme.
- La partie en haut à droite est l'aide : n'hésitez pas à l'utiliser sur les commandes que nous allons découvrir. Si vous sélectionner dans Spyder un mot à la souris et que vous faites Ctrl+I une aide détaillée s'affichera.
- La partie la plus importante à gauche est l'éditeur de scripts : il permet d'écrire des programme complexes sur plusieurs lignes (contrairement à la console) et de les enregistrer. Lorsqu'on exécute un programme, le résultat s'affiche dans la console.
- 2+3
- 2.4*2
- 2**3
- 5/2
- 5//2 et 5%2 .
- Vous pouvez écrire dans l'éditeur. Si il y a déjà un script ouvert : cliquez sur Fichier puis Nouveau Fichier. Un onglet s'ouvre : c'est ici que vous allez écrire votre programme.
- Ecrivez la ligne de code print ("Hello world !")
- Sauvegardez avec Fichier > Enregistrer sous ou avec le raccourci Ctrl+S et appelez le premier_programme.py
-
Exécutez le programme avec le bouton
, ou dans le menu Exécution ou avec le raccourci F5
- Observez le résultat sur la console.
IIVariables, Entrées et Sorties
1Variables

- Dans la console, affectez la valeur 5 à la variable a , puis la chaîne "bonjour" à la variable b .
- Taper a+10 puis a à nouveau. La valeur de a change-t-elle ?
- Ecrivez une affectation permettant d'incrémenter la variable a .
- Ecrivez dans la console des affectations permettant d'échanger les valeurs des variables a et b .
- La valeur de a vaut a+1 ...
- Pour ne pas perdre la valeur d'une variable, on peut toujours la "sauvegarder" temporairement dans une troisième variable
- Pour ajouter une valeur val à une variable a en Python on peut écrire a+=val .
- Pour effectuer plusieurs affectations en une seule ligne on peut aussi écrire a , b = valeur1 , valeur2
- Pour échanger les valeurs de deux variables, Python permet d'écrire a , b = b , a
2Entrées, Sorties
nom=input ("Quel est votre nom ?")
- pour afficher une chaîne de caractères dans la console il faut taper print ("un message très important") .
- pour afficher la valeur d'une variable var , il faut taper print (var) sans les guillemets.
- pour afficher plusieurs messages séparés par des espaces, il faut donner plusieurs arguments à la commande print (a, b, c, ...) (où a , b , c , etc. sont des variables ou chaînes de caractères).
On peut vérifier le fonctionnement de print () sur les exemples suivants :
b=3.14
c="bonjour"
print ("a")
print (a)
print ("la première variable vaut",a)
print ("la deuxième variable vaut",b)
print ("la troisième variable vaut",c)
print ("les trois variables valent",a,",",b,"et",c)
- saluer l'utilisateur et lui demander son nom.
- afficher un message textuel répondant à l'utilisateur en l'appelant par son nom.
- Utiliser une fonction d'entrée input () et affecter son résultat à une variable nom .
- Afficher un message avec une commande de sortie print () prenant plusieurs arguments.
- Attention, l'age donné par le input est une chaîne de caractères "str", il faut la convertir en "int" avec int ()
IIITypes de variables
1Les types de base : int, float, bool, string et list
- le type int qui désigne les entiers comme \(-2,0,5,\)etc.
- le type float qui désigne les nombres flottants comme \(3.14 , -2.5 ,\) etc.
- le type bool qui désigne les booléens, c'est à dire les valeurs de vérité True (vrai) et False (faux).
- le type string qui désigne les chaînes de caractère comme "Bonjour" , "Python est super !!!" ou "ドラゴンボール超" .
- le type list désigne les listes qui sont des objets pouvant en contenir d'autres comme [1,2,3] , [-1, True, 'du texte'] ou [[1,0],[0,1]] .
type (valeur)
- 2
- -3.1
- 2-3.1
- "Je s'appelle Groot"
- print ("hello")
- input ("Quel est votre âge ?")
- print () n'a aucune valeur, elle ne fait qu'afficher un texte. Pas de valeur, pas de type (ou plus exactement un type NoneType et une valeur None)
- input () considère la réponse de l'utilisateur comme une chaîne de caractère.
- saluer l'utilisateur et lui demander son nom.
- lui demander son âge.
- afficher un message textuel d'adressant à l'utilisateur par son nom et lui annonçant dans combien d'années il sera centenaire.
- Affecter l'age à renvoyé par l'utilisateur à une variable age .
- En cas de message d'erreur, demandez vous quel est le type de la variable age .
- Pensez à convertir la variable age en entier pour pouvoir faire une soustraction (avec la fonction int () ).
2Opérations sur les nombres entiers et flottants
- Les opérations arithmétique : addition + , soustraction - , multiplication * , division / et puissance ** .
- La division entière // et le reste par la division %
- La fonction int () peut transformer un nombre flottant en entier.
- La fonction float () peut transformer un nombre entier en flottant.
- inférieur strict < , supérieur strict > , inférieur ou égal <= , supérieur ou égal >=
- égal == , différent !=
- Comparer quelques valeurs. Comment Python répond-il à ces comparaisons ?
- Un nombre flottant et un nombre entier peuvent-ils être considérés comme égaux ?
- Les opérateurs de comparaison peuvent-être vues commes fonctions à deux argument numériques à valeurs dans l'ensemble Bool = {True, False}
- Même si d'un point de vue formel 1 et 1.0 ne sont pas égaux (s'ils l'étaient la fonction type () donnerait le même résultat pour les deux), d'un point de vue pratique, cette largesse permet d'éviter certains écueils. Un programmeur qui souhaite créer un programme s'arrêtant lorsqu'une certaine valeur est nulle ne devrait pas à avoir à se demander si il s'agit d'un entier ou d'un flottant.
3Opérations sur les valeurs booléennes
- Et : and .
- Ou : or .
- Ou exclusif : ^ .
- Vérifiez les opérations booléennes classiques dans la console (vrai ET vrai = vrai, faux OU vrai = vrai,...)
- Les opérations arithmétiques propres aux nombres fonctionnent-elles ? L'opération or et l'opération + sont-elles équivalentes ? Même question pour and et *
- 1==True
- (2 < 1)==False
- (True==False)==False
4Opérations sur les chaînes de caractères
- Une valeur d'un des types précédent peut être transformé en chaîne de caractères : str (valeur) .
- mesurer la longueur : len (chaine) .
- concaténer deux chaînes : chaine1 + chaine2 .
- accéder au i-ème élément : chaine[i] .
- extraire la sous-chaîne du i-ème au j-ème caractère (exclu) : chaine[i:j] .
- Que taper pour obtenir le premier caractère de c ?
- Que taper pour obtenir le dernier caractère de c (même si on change la valeur de c ) ?
- Que taper pour extraire la sous-chaîne commençant au 3ème caractère jusqu'à la fin ?
- Essayer de concaténer c et a . Quelle solution proposer ?
- L'indice du premier caractère est 0, et pas 1.
- L'indice du dernier caractère de c n'est pas len (c)
- Il est possible d'utiliser len (c) , mais on peut aussi taper c[3:]
- L'opération + ne fait pas la même chose pour les int et les string . Il faut convertir l'entier a en chaîne de caractères avec la fonction str (a) .
- Comparez les chaînes de caractères Barry et Alvin avec <
- Comparez les chaînes de caractères Dupont et Dupond .
- Quel semble-être le critère de comparaison ?
- demandera à l'utilisateur d'entrer trois valeurs \(a\), \(b\) et \(c\) d'un polynôme du second degré \(a x^2 + b x + c\)
- calculera le discriminant
- informera l'utilisateur de la valeur du discriminant par une phrase.
- Utiliser input () trois fois et stocker chaque résultat dans des variables a , b et c .
- Attention, les trois variables sont des chaînes de caractères. Il faut les convertir en nombres pour les utiliser dans un calcul.
- Stocker la valeur du discriminant dans une variable d
5Opérations sur les listes
- compter le nombre d'éléments : len (chaine) .
- concaténer deux listes : L1 + L2 .
- accéder au i-ème élément : L[i] .
- extraire la sous-liste du i-ème au j-ème élément (exclu) : L[i:j] .
IVFonctions
...étapes...
...encore des étapes...
return valeur_finale
- mafonction est le nom de la fonction
- arguments est la liste des arguments, c'est à dire des variables utilisées dans les étapes de calcul de la fonction
- valeur_finale est la variable que renverra la fonction lorsqu'elle sera appelée
q=a//b
r=a%b
return [q,r]
print ("Hello !")
- Déclarer une fonction discriminant () qui prend trois argument correspondant aux coefficients d'un polynôme du second degré et renvoie la valeur de son discriminant
- Ne plus utiliser les fonctions input () et print () et tester la fonction discriminant () dans la console sur quelques exemples connus de polynômes.
Python est un langage de programmation permettant d'effectuer des traitement numériques, mais pas de calcul algébrique. Par exemple Python ne sait pas ce que sont les fractions, ni leurs règles de calcul. Nous allons ici créer des fonctions permettant de compenser cette lacune.
Créer un nouveau fichier fractions.py. Dans ce programme, nous représenterons une fractions \(\frac{a}{b}\) par une liste deux deux nombres [a,b] .
- Créer une fonction produit () prenant deux arguments f1 et f2 (représentant deux fractions \(\frac{a}{b}\) et \(\frac{c}{d}\) ) et renvoyant une liste représentant le produit des deux fractions \(\frac{a c}{b d}\).
- Créer une fonction quotient () prenant deux arguments f1 et f2 (représentant deux fractions et renvoyant une liste représentant leur quotient.
- Créer une fonction somme () prenant deux arguments f1 et f2 (représentant deux fractions et renvoyant une liste représentant leur somme.
- Créer une fonction difference () prenant deux arguments f1 et f2 (représentant deux fractions et renvoyant une liste représentant leur différence.
- Tester les fonctions créees sur des calculs tels que \(\frac{5}{2} (\frac{1}{2} + \frac{1}{3})\)
- Cette représentation présente quelques défauts. Lesquels ?
- Si L est une liste à deux éléments représentant une fraction \(\frac{a}{b}\), le numérateur est représenté par L[0] et le dénominateur par L[1] .
- Quelques défauts : un dénominateur nul est accepté, même s'il donne un résultat absurde. Les fractions ne sont pas toujours irréductibles. Un simple nombre en argument aurait un sens dans la plupart des cas, mais encore faut-il en tenir compte. etc.
VTests et conditions
instructions
instructions1
else :
instructions2
instructions1
elif condition2:
instructions2
elif condition3:
instructions3
else:
instructions0
print ("C'est du passé !")
else :
print ("C'est du futur !")
prix = 0
elif age < 12:
prix = 10
elif age < 25:
prix = 20
elif age < 60:
prix = 40
else :
prix = 20
print ("Le prix vaut %i" % prix)
var = condition ? valeur1 : valeur2
signe = -1
else :
signe = 1
Nous allons modifier le fichier second_degré.py :
- créer une fonction racines () qui prend en arguments les coefficients a , b et c d'un polynôme du second degré et renvoie une liste contenant les racines réelles du polynôme.
-
créer une fonction factorise () qui prend en arguments les coefficients a , b et c d'un polynôme du second degré et renvoie une chaîne de caractères représentant la forme factorisée.
Par exemple, factorise (1,0,-1) doit renvoyer la chaîne de caractères "(x-1)(x+1)" et factorise (1,2,1) doit renvoyer la chaîne "(x+1)²" (l'afficher dans la console).
- Ces fonctions devront utiliser la fonction discriminant () .
- Penser à convertir les valeurs numériques avec str () pour les concaténer à une chaîne.
- Penser à différencier les cas où les racines sont positives ou négatives pour ajouter un signe '+' ou '-' si nécessaire
- La fonction valeur absolue est abs () .
- Coller une chaîne de caractères c2 à une autre c1 peut se faire avec c1=c1+c2 ou c1+=c2 .
Nous allons modifier le fichier fractions.py pour prendre en compte les fonctions déjà programmées soient compatibles avec des arguments numériques. Par exemple, on souhaite être capable de calculer la somme \(a + \frac{b}{c}\).
Tester les types des arguments de chaque fonction pour tenir compte des opération entre :
- une fraction et un nombre (entier ou flottant)
- un nombre (entier ou flottant) et une fraction
- deux fractions
- deux nombres
- Pour tester si une variable est de type entier, on peut utiliser la condition type (var)==type (1) ou code (isinstance (var, int)) (float, str, list, bool pour les autres types).
-
Si les arguments ne correspondent à aucun type prévu, vous pouvez toujours générer une erreur vous même comme ceci :
raise ValueError ("Message d'erreur bien détaillé")
VIBoucles
1Boucle for
instructions
print (i)
- Initialiser une variable S à 0
- Dans une boucle faisant varier un indice k de 0 à 100, ajouter k à la variable S
d=L[N-1]
for i in range (1,N):
L[i]=L[i-1]
L[0]=d
- N vaut la longueur de la liste L
- d reçoit la dernière valeur de la liste L
- Dans la boucle, du deuxième élément (i=1) au dernier (i=N), le i-ème élément de la liste est remplacé par son prédécesseur (L[i-1])
- A la sortie de la boucle, tous les éléments de la liste ont été remplacé par le prédécesseur sauf le premier élément (indice 0), qui reçoit donc l'ancien dernier élément d.
instructions
print (c)
Téléchargez le fichier palindrome.py et éditez le dans Idle.
Ce fichier contient déjà une fonction nettoyer () qui prend en argument une chaîne de caractère, et retourne une chaîne similaire en minuscule sans accents et sans espaces.
Le but est d'ajouter les fonctions suivantes :
- Une fonction renverse () qui prend en argument une chaîne de caractères et renvoie la chaîne inversée.
- Une fonction palindrome () qui prend en argument une chaîne de caractères et renvoie True si la chaîne est un palindrome, False sinon. Vous pouvez la tester sur quelques-uns de es palindromes .
- L'indice "miroir" de i dans un mot de longueur N est N-i .
- Une autre solution consiste à utiliser un pas négatif pour reculer dans le mot.
- Afin de sortir d'une boucle avant la fin, il est possible d'utiliser le mot break; , ou utiliser un return à l'intérieur de la boucle.
2Boucle while
instructions
while i>0:
i=i+1
n=0
while x>1:
x=x/2
n=n+1
return n
- La fonction pgcd () qui prend en arguments deux entiers \(a\) et \(b\) et qui renvoie une liste composée de trois entiers \(d, a'\) et \(b'\) tels que \(d\) est le plus grand commun diviseur de \(a\) et \(b\), \(a=d a'\) et \(b=d b'\)
- La fonction simplifier () qui prend en argument une liste représentant une fraction et retourne sa forme irréductible. la fonction ne doit pas générer d'erreur si on lui passe un nombre en argument.
- Modifier les fonctions existantes pour que le résultat se fasse toujours sous forme irréductible.