Intro Python
Intro Python
Intro Python
Vincent Tolleron
Juin 2014
1 Introduction 3
7 Tableaux de synthèse 25
1
Table des matières Table des matières
Toutes les images sont la propriété de leurs auteurs respectifs. Cette œuvre est mise à dis-
position selon les termes de la Licence Creative Commons Attribution - Pas d’utilisation
Commerciale - Partage à l’identique 3.0 non transposé.
Vous êtes libre de reproduire, distribuer, communiquer et adapter l’œuvre selon les condi-
tions suivantes :
• Vous n’avez pas le droit d’utiliser cette œuvre à des fins commerciales.
• Si vous modifiez, transformez ou adaptez cette œuvre, vous n’avez le droit de distribuer
votre création que sous une licence identique ou similaire à celle-ci.
1 Introduction
Ce document se veut une introduction au langage de programmation python. Le propos n’est pas
d’être exhaustif (la documentation officielle de Python, quantité d’ouvrages ou de documents sur
le net le sont), mais de proposer une première approche — destinée aux enseignants et aux élèves
— d’un langage de programmation moderne.
Les sections de ce document vont par niveau de « difficulté » croissante. Dans le cadre d’une utilisa-
tion avec les élèves (et notamment d’une alternative à Algobox) on peut se contenter du niveau 1.
Le contenu de ces page est en grande partie issu du cours dispensé aux terminales scientifiques
suivant la spécialité ISN 1 du lycée Frantz Fanon, à Trinité (Martinique). Des erreurs peuvent sub-
sister dans ce document, le lecteur voudra bien m’en excuser et me les signaler le cas échéant
(vincent.tolleron@me.com ). Je ne suis pas informaticien mais professeur de mathématiques,
aussi les « professionnels de la profession » voudront bien me pardonner les quelques approxima-
tions que j’ai pu commettre.
Caractéristiques de Python 2
1000
X 1
Les quatre programmes suivants calculent et affichent le résultat.
n=1 n2
En C
# include <stdio.h>
double Invsqr(double n)
{
return 1/(n*n);
}
int main(int argc, char *argv[]){
int i, start=1, end=1000;
for(i=start ; i<= end; i++)
sum +=Invsqr((double)i);
printf("%16.14f\",sum);
return 0;
}
En Java
public class Sum{
public statif double f(double x){
return 1/(x*x);
}
public statif voir main(String[] args){
double start=1;
double end=1000;
sum=0;
for(double x=start ; x<=end , x++)
sum+=f(x);
System.out.println(sum);
}
}
En Algobox
1 VARIABLES
2 i EST_DU_TYPE NOMBRE
3 sum EST_DU_TYPE NOMBRE
4 DEBUT_ALGORITHME
5 sum PREND_LA_VALEUR 0
6 POUR i ALLANT_DE 1 A 1000
7 DEBUT_POUR
8 sum PREND_LA_VALEUR sum+1/(i*i)
9 FIN_POUR
10 AFFICHER sum
11 FIN_ALGORITHME
En Python
print (sum(1/(x*x) for x in range(1,1001)))
?? ???? ??? ?
Never forget that most of the programming languages speak english !
Code
>>> 14 % 3
2
Pour obtenir des puissances :
Code
>>> 2**3
8
>>> 1.05**12.5
1.8402051355485856
Python manipule les nombres complexes :
Code
>>> (1+1j)**2
2j
>>> 1/(1+1j)
(0.5-0.5j)
• Toute ligne de code commençant par # est un commentaire, ignoré lors de l’exécution du pro-
gramme.
• Un bon programme doit être abondamment commenté !
Code
from math import *
u=0
for i in range(20):
print(u)
u=sqrt(1+u)
Analyse de l’exemple
• ligne 1 : importation du module math
• ligne 2 : on affecte à une variable u la valeur 0
• ligne 3 : début de la boucle « pour »
• ligne 4 : affichage du terme courant
• ligne 5 : calcul du terme suivant, affectation au terme courant, et fin de la boucle
Premières remarques
• les variables utilisées (ici u et i) ne sont pas à déclarer
• l’affectation d’une valeur à une variable se fait au moyen du symbole =
• range(20) correspond à la liste des entiers naturels de 0 jusqu’à 19 (20 est donc exclu)
• pas de ; à la fin des lignes
• pas de « end » à la fin de la boucle
Le code obtenu est ainsi plus concis que dans la plupart des autres langages de programmation.
Parfait, mais . . .
• s’il y a une deuxième boucle après ?
• s’il y a une boucle dans une boucle ?
• comment fait python pour s’y retrouver ?
L’indentation
• En Python, les blocs d’instructions ne sont pas délimités par des mots (endIf, enfFor) ni des sym-
boles ( ; en C), mais par des lignes indentées (décalées) d’un nombre fixe de caractères (4 espaces
ou une tabulation en général).
• On peut indenter « à la main » en appuyant 4 fois sur la barre espace, ou une fois sur la touche de
tabulation.
• Les bons éditeurs de code feront cela automatiquement.
• Une mauvaise indentation va provoquer des erreurs.
Un petit exercice
Qu’affichera le programme suivant (on ne triche pas . . . ) ?
Code
for i in range(3):
print(i)
for j in range(2):
print(i+j)
Un petit exercice
Déterminer le plus petit entier n à partir duquel 1,05n > 100000
Code solution
n=0
while 1.05**n<= 100000:
n=n+1
print("le plus petit entier cherché est: ",n)
• <= signifie É
• dans une boucle while, l’incrémentation n’est pas automatique
Un test
Code
for a in range(20):
if a%3 == 0:
print(a,'est multiple de 3')
elif a%3==1:
print(a,'est congru à 1 modulo 3')
else :
print(a,'est congru à 2 modulo 3')
Lançons un dé 50 fois
Code
from random import *
for lancer in range(50):
print(" lancer n°",lancer," : ",randint(1,6))
Code
def f(x):
return x**3-3*x+1
for x in range(3,11):
print("f(",x,")=",f(x))
• une fonction (python) débute par le mot-clé def et retourne une valeur (tout type possible)
• la commande range(3,11) donne la liste des entiers de 3 à 10 inclus.
Code
>>> maListe=[1,3,"a",3.1416,"lol"]
>>> maListe[1]
3
>>> maListe[-1]
'lol '
>>> len(maListe)
5
• Attention : l’indice du premier élément est 0.
• On peut compter à partir de la fin avec des indices négatifs
Code
>>> a='Ceci est un texte'
>>> print(a)
Ceci est un texte
>>> b=”éèàçù§"
>>> print(b)
éèàçù§
• python 3 supporte l’encodage utf-8 et donc les caractères accentués
Code
>>> maChaine="Je suis heureux d’apprendre Python et je veux progresser"
>>> len(maChaine)
56
La fonction len() retourne la longueur de la chaine (espaces comprises).
Code
>>> maChaine.upper()
"JE SUIS HEUREUX D’APPRENDRE PYTHON ET JE VEUX PROGRESSER"
De même, la méthode .lower() met toute la chaîne en minuscules.
Code
>>> maChaine.count("eu")
3
La séquence de lettres eu apparaît trois fois dans la chaîne.
Code
>>> maChaine.find("Python")
28
La chaine "Python" apparaît à l’indice 28 dans la chaîne (les indices démarrent à zéro).
Code
>>> maChaine.replace("Python","les maths")
"Je suis heureux d’apprendre les maths et je veux progresser"
Code
>>> maChaine[3]
's'
On a obtenu le caractère d’indice 3 dans la chaîne (attention, les indices démarrent à zéro).
Pour obtenir la sous-chaîne allant de l’indice 3 (inclus) à l’indice 15 (exclus) :
Code
>>> maChaine[3:15]
'suis heureux'
Un truc joli :
Code
>>> 'Python' in maChaine
True
Concaténation de chaînes :
Code
>>> tex1='belle marquise '
>>> tex2='vos beaux yeux '
>>> tex3=” me font mourir d’amour ”
>>> monTexte=tex1+tex2+tex3
>>> print(monTexte)
belle marquise vos beaux yeux me font mourir d’amour
>>> print(monTexte*4)
Code
>>> x=y=z=3
>>> print(x,y,z)
3 3 3
Affectations parallèles
Il est possible d’affecter plusieurs valeurs à plusieurs variables en une seule ligne de commande :
Code
>>> anne,mois,jour,nomJour=2014,'juin',12,'jeudi'
>>> print(nomJour,jour,mois,annee)
jeudi 12 juin 2014
Les affectations parallèles sont bien pratiques pour échanger le contenu de deux variables :
Code
>>> u,v=1,3
>>> print(u,v)
1 3
>>> u,v=v,u
>>> print(u,v)
3 1
Il n’est donc pas nécessaire, en python, de faire appel à une variable auxiliaire pour échanger le
contenu de deux variables.
Types
En Python, le typage est dynamique : il est inutile de déclarer le type de la variable, la valeur que
l’on attribue à la variable suffit à Python pour le définir.
Code
>>> x=500
>>> type(x)
<type 'int'>
>>> x=x+0.12
>>> type(x)
<type 'float'>
>>> nomLycee="Frantz Fanon"
<type 'str'>
>>> affixe=1+3j
<type 'complex'>
Cela peut perturber les habitués d’autres langages :
Code
>>> y=10
>>> type(y)
<type 'int'>
>>> z=10.0
>>> type(z)
<type 'float'>
>>> y==z
True
>>> y is z
False
Remarques.
• Bien que de types différents, les variables y et z sont déclarées égales par Python (ou plutôt leurs
valeurs le sont) ;
• toutefois, les « objets » y et z sont distincts (je sais, c’est subtil) :
◦ la commande y==z est un test qui retourne True lorsque les valeurs sont égles, et False sinon ;
◦ la commande is est un test qui retourne True lorsque les « objets » sont identiques.
• On n’est pas obligé de raconter tout ça aux élèves !
• Le typage étant dynamique, on ne retiendra finalement, comme sur Algobox, que les types :
◦ nombres (sans rentrer dans les détails) ;
◦ chaînes de caractères ;
◦ listes.
Exemple de récursivité
La suite de Fibonacci est définie par ses deux premiers termes : 0 et 1. Chaque terme est ensuite la
somme des deux précédents. Cette suite commence donc par :
0 1 1 2 3 5 8 13 21 . . .
maFonction()
print(maFonction.__doc__)
Code
>>> from math import *
>>> print(e)
2.718281828459045
>>> a=3
>>> c=4
>>> e=a+c
>>> print(e)
7
La valeur de la constante e a été perdue !
Une solution :
Code
>>> import math
>>> print(math.e)
2.718281828459045
>>> a=3
>>> c=4
>>> e=a+c
>>> print(e)
7
>>> print(math.e)
2.718281828459045
Autre solution :
Code
>>> from math import e as E
>>> e=3
>>> print(e)
3
>>> print(E)
2.718281828459045
Code
from monModule import *
a=binomiale(10,0.5,3)
print(a)
b=ln(1)
c=ln(e)
print(b,c)
On obtiendra, après exécution :
Code
>>>
0.1171875
0.0
1.0
On peut ainsi, à l’échelle d’un lycée, d’une académie (cf. Amiens), créer un module spécifique ré-
pondant à des besoins particuliers.
On peut raffiner :
Code
from pylab import *
x=arange(-3,4,0.01)
plot(x,x**2)
axis([-3,4,-1,16])
axhline()
axvline()
show()
Encore mieux :
Code
from pylab import *
x=arange(-3,4,0.01)
plot(x,x**2)
axis([-3,4,-1,16])
axhline(color="k")
axvline(color="k")
show()
Les boutons servent à naviguer dans la fenêtre graphique, à zoomer, à sauvegarder la figure, etc.
Création d’un histogramme à pas inégaux :
Code
from pylab import *
valeurs=[2,5,5,5,7,8,8,9,9,9,10,10, 12,13,13,15,17,18,19]
bornes=[0,6,8,10,12,15,18,20]
hist(valeurs,bornes,normed=True)
show()
Création d’un nuage de 1000 points aléatoires dans [0, 1] × [0, 1] (avec la loi uniforme) :
Code
from pylab import *
X=np.random.uniform(0,1,1000)
Y=np.random.uniform(0,1,1000)
scatter(X,Y,color=’r’)
axis([-0.2,1.2,-0.2,1.2])
axhline(color=’k’)
axvline(color=’k’)
show()
Exercice
Approximation de π par une méthode de Monte-Carlo
• on choisit des points au hasard (uniformément) dans le carré [0, 1] × [0, 1] ;
• on colorie en bleu ceux qui sont à l’intérieur du quart de disque de centre (0, 0) et de rayon 1 ;
• on colorie en rouge ceux qui sont au dessus ;
nb. de points bleus
• pour un grand nombre de points, le quotient nb. total de points donne une approximation de π4 , et
donc de π
Les possibilités de matplotlib sont innombrables :
• tous type de graphiques statistiques ;
• graphiques en 3D ;
• utilsiation de curseurs, de boutons ;
• etc.
Pour en savoir plus, voir : http://matplotlib.org
Les dictionnaires
• Au lieu de repérer un élément par son indice (liste, tuple) on le repère par une clé
• Les dictionnaires sont modifiables
• Ils sont délimités par des accolades, la syntaxe générale d’un dictionnaire est :
{ clé1 : valeur1, clé2 : valeur2, etc.}
Le stock d’une marchande de glaces (en litres) est résumé dans le dictionnaire stock :
Code
stock={'vanille': 5,'coco':3.5, 'chocolat':3}
print(stock)
Testons si la marchande possède de la glace au chocolat, de la glace à la fraise :
Code
print('chocolat' in stock)
print('fraise ' in stock)
La marchande ajoute 5 litres de glace « passion » à son stock :
Code
stock['passion']=5
Pour obtenir la liste des parfums (clés) :
Code
print(stock.keys())
Pour obtenir la liste des quantités (valeurs) :
Code
print(stock.values())
On peut utiliser un boucle for pour parcourir un dictionnaire (au moyen des clés).
Par exemple notre marchande souhaite ajouter 3 litres à chacun de ses parfums en stock.
Code
for parfum in stock:
stock[parfum]+=3
print(stock)
Pour enlever des éléments d’un dictionnaire (par exemple la glace passion) :
Code Suppression d’un élément
del stock['passion']
print(stock)
Pour supprimer tous les éléments :
Code On efface tout
stock.clear()
print(stock)
À retenir . . .
Les trois principaux modes d’ouverture d’un fichier, avec la méthode open :
w write (création/écrasement)
a append (ajout)
r read (lecture)
7 Tableaux de synthèse
Les types de données Python
On peut toutefois se passer très largement au niveau lycée des types tuples et dictionnaires.
Opérateurs de comparaison
Opérateur Signification
x == y Est-ce que x est égal à y ?
x != y Est-ce que x est différent de y ?
x > y Est-ce que x est strictement supérieur à y ?
x < y Est-ce que x est strictement inférieur à y ?
x >= y Est-ce que x est supérieur ou égal à y ?
x <= y Est-ce que x est inférieur ou égal à y ?
x is y Est-ce que x et y représentent le même objet ?
Opérateurs logiques
Opérateur Signification
x or y retourne True ssi l’un des deux booléens
(au moins) est vrai
x and y retourne True ssi les des deux booléens
sont vrais
not x retourne la valeur booléenne contraire
de x
Zen of python
import this
1. Préfèrer le beau au laid,
2. l’explicite à l’implicite,
3. le simple au complexe,
4. le complexe au compliqué,
5. le déroulé à l’imbriqué,
6. l’aéré au compact.
7. La lisibilité compte.
8. Les cas particuliers ne le sont jamais assez pour violer les règles,
9. même s’il faut privilégier l’aspect pratique à la pureté.
10. Ne jamais passer les erreurs sous silence,
11. ou les faire taire explicitement.
12. Face à l’ambiguïté, ne pas se laisser tenter à deviner.
13. Il doit y avoir une – et si possible une seule – façon évidente de procéder,
14. même si cette façon n’est pas évidente à première vue, à moins d’être Hollandais.
15. Mieux vaut maintenant que jamais,
16. même si jamais est souvent mieux qu’immédiatement.
17. Si l’implémentation s’explique difficilement, c’est une mauvaise idée.
18. Si l’implémentation s’explique facilement, c’est peut-être une bonne idée.
19. Les espaces de nommage sont une sacrée bonne idée, utilisons-les plus souvent !