L'interpreteur
Avant tout le langage python est un langage interprété
Opérateur | Signification littérale | Exemple | Sortie |
---|---|---|---|
+ | addition | 2+3 | 5 |
- | soustraction | 2-3 | -1 |
* | multiplication | 2*3 | 6 |
/ | division | 2/3 | 0.666666 |
/ | division entière | 10//3 | 3 |
% | reste de la division entière | 10%3 | 1 |
# | commentaires |
Variable :
assigne 3 à la variable bonjour ex: bonjour=3
assigne bonjour*2 à la variable bonjourx2 ex: bonjourx2=2*bonjour
ajoute 2 à la variable bonjour bonjour+=2
assigne 3 à x et y ex: x = y = 3
Permutation de deux variable :
a = 5
b = 32
a,b = b,a # permutation
Chaine de caractères:
bonjour="Salut les p'tits loups" ou bonjour='Salut les p\'tits loups' ou bonjour="""Salut les p'tits loups"""
sur plusieurs ligne /n (retour à la ligne)
fonction associées
objets.classes | Signification littérale | Exemple | Sortie |
---|---|---|---|
bonjour.upper() | Renvoie la chaine en majuscule | ||
bonjour.lower() | Renvoie la chaine en minuscule | ||
bonjour.center(20) | Center la chaine sur 20 espaces | ||
bonjour.upper().center(20) | Center la chaine en majuscule sur 20 espaces | ||
bonjour.replace('e','o') | remplace le caractère 'e' par 'o' dans une chaine |
Pour l'aide des fonctions de chaine help("str")
La fonction format
prenom = "Paul"nom = "Dupont"
age = 21
print("Je m'appelle {0} {1} et j'ai {2} ans.".format(prenom, nom, age))
->Je m'appelle Paul Dupont et j'ai 21 ans.
Exemple 2 : les Dates
date = "Dimanche 24 juillet 2011"
heure = "17:00"
print("Cela s'est produit le {}, à {}.".format(date, heure))
->Cela s'est produit le Dimanche 24 juillet 2011, à 17:00.
Opération sur les chaines
Concater deux chaines message = "J'ai " + str(age) + " ans."Recuperer une partie de chaine message[0:2] ou message[:2] -> "J'"
"Il a"+message[4:] ->'il a 21 ans.'
Accéder à un caractère chaine[position_dans_la_chaine]
Listes et tuples
ma_liste = list() # On crée une liste vide ouma_liste = [1, 2, 3, 4, 5] # Une liste avec cinq objets
print(ma_liste)
->[1, 2, 3, 4, 5]
Les listes peuvent contenir n'importe quel type d'objet.
ma_liste = [1, 3.5, "une chaine", []]
Pour ajouter un argument à la liste
ma_liste.append(56) # On ajoute 56 à la fin de la listeInsérer un élément dans la liste
ma_liste = ['a', 'b', 'd', 'e']ma_liste.insert(2, 'c') # On insère 'c' à l'indice 2
print(ma_liste)
['a', 'b', 'c', 'd', 'e']
Le mot-clé «del»
del ma_liste[3] ->['a', 'b', 'c', 'e']La méthode «remove»
la méthode remove qui prend en paramètre non pas l'indice de l'élément à supprimer, mais l'élément lui-même.ma_liste =['a', 'b', 'c', 'd', 'e']
ma_liste.remove('c') ->['a', 'b', 'e']
La méthode «enumerate»
ma_liste = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']for i, elt in enumerate(ma_liste):
print("À l'indice {} se trouve {}.".format(i, elt))
Les Tulpes
Les Tulpes sont des listes immuables, qu'on ne peut modifier.Un tuple se définit comme une liste, sauf qu'on utilise comme délimiteur des parenthèses au lieu des crochets.
tuple_vide = ()
tuple_non_vide = (1,)
tuple_non_vide = (1, 3, 5)
Création et édition de dictionnaires
Créer un dictionnaire
mon_dictionnaire = dict() ou mon_dictionnaire = {}Ajouter des clés et valeurs dans notre dictionnaire vide
mon_dictionnaire["pseudo"] = "6pri1"
mon_dictionnaire["mot de passe"] = "*"
->mon_dictionnaire
{'mot de passe': '*', 'pseudo': '6pri1'}
Autre exemple:
fruits = {"pommes":21, "melons":3, "poires":31}
for cle in fruits.keys():
print(cle) -> melons
poires
pommes
for valeur in fruits.values():
print(valeur) ->3
31
21
fruits.pop("pommes")
En plus de supprimer la clé et la valeur associée, la méthode pop renvoie cette valeur. Cela peut être utile parfois.
Les fonctions :
syntaxe : nom_de_la_fonction(parametre_1,parametre_2,…,parametre_n).
La fonction « type »
Cette fonction permet de déterminer le type de la variable paramètre
ex : type(3.2) -> <class 'float'>
Type de variable | Désignation (anglais) | Désignation (français) |
---|---|---|
int | integer | entier |
str | string | chaine de caractère |
float | float | virgule flottante |
bool | boolean True or False | Booléen Vraie ou Faux |
list | list | Liste |
dict | Dictonnary | Dictionnaire |
La fonction « print»
Cette fonction permet d'afficher la valeur d'une ou plusieurs variables. ex : a=3b = 32
print("a =", a, "et b =", b) ->a=3 et b=32
Les structures conditionnelles
La fonction « if/else»
ex: a = 5if a > 0: # Si a est supérieur à 0
print("a est supérieur à 0.")
else:print("a est inférieur ou égal à 0.")
->a est supérieur à 0.
L'instruction « elif»
Le mot clé elif est une contraction de « else if », que l'on peut traduire très littéralement par « sinon si ».
if a > 0: # Positif
print("a est positif.")
elif a < 0: # Négatif
print("a est négatif.")
else: # Nul
print("a est nul.")
->a est supérieur à 0.
Les opérateurs
Opérateur | Signification littérale |
---|---|
< | Strictement inférieur à |
> | supérieur à |
<= | Inférieur ou égal à |
>= | Supérieur ou égal à |
== | Égal à |
!= | Différent de |
La fonction « input»
Cette fonction permet de saisir une variable sous forme de chaine.
annee = input("Saisissez une année : ")
Par contre si nous voulons convertir cette variable en numérique entier
annee = int(annee)
Les boucles
La boucle while
nb = 7
i = 0
while i < 10:
print(i + 1, "*", nb, "=", (i + 1) * nb)
i += 1 # On incrémente i de 1 à chaque tour de boucle
La boucle for
syntaxe : for element in sequence:
chaine = "Bonjour les ZER0S"
for lettre in chaine:
print(lettre)
Autre exemble
chaine = "Bonjour les ZER0S"
for lettre in chaine:
if lettre in "AEIOUYaeiouy": # lettre est une voyelle
print(lettre)
else: # lettre est une consonne... ou plus exactement, lettre n'est pas une voyelle
print("*")
Création de fonctions
syntaxe : def nom_de_la_fonction(parametre1, parametre2, parametre3, parametreN):
def table_par_7():
nb = 7
i = 0
while i < 10:
print(i + 1, "*", nb, "=", (i + 1) * nb)
i += 1
Particularité :
def table(nb, max=10): # La valeur par défaut de max est 10 si omis
"""Fonction affichant la table de multiplication par nb de 1*nb à max*nb (max >= 0)"""
i = 0
while i < max:
print(i + 1, "*", nb, "=", (i + 1) * nb)
i += 1
L'instruction «return»
L'instruction permet de retourner une valeur à partir d'une fonction def carre(valeur): return valeur * valeurL'instruction «lambda»
Permet créer des fonctions extrêmement courtes car limitées à une seule instruction f = lambda x: x * xf(5)
25
Le mot-clé «break»
Permet de sortir d'une boucleLe mot-clé «continue»
Le mot-clé continue permet de… continuer une boucle, en repartant directement à la ligne du while ou for.Les modules
Les modules sont des bouts de codes à inclure directement dans le programme
La méthode import
import mathNous avons maintenant accès à plusieurs fonction mathématique qu'il faut appeler sous la forme :
math.pi nous donne pi. Pour avoir la liste des instructions help("math")
pour une seule instruction help("math.sqrt")
On peut également changer le nom de l'espace math import math as mathematiques
mathematiques.sqrt(25)
Si nous voulons importer qu'une fonction du module from math import pi
Emprisonnons notre programme dans un fichier pour en faire un module (.py)
Avec un exemple sous éditeur de texte# -*-coding:Latin-1 -* import os # On importe le module os qui dispose de variables # et de fonctions utiles pour dialoguer avec votre # système d'exploitation # Programme testant si une année, saisie par l'utilisateur, est bissextile ou non annee = input("Saisissez une année : ") # On attend que l'utilisateur fournisse l'année qu'il désire tester annee = int(annee) # Risque d'erreur si l'utilisateur n'a pas saisi un nombre if annee % 400 == 0 or (annee % 4 == 0 and annee % 100 != 0): print("L'année saisie est bissextile.") else: print("L'année saisie n'est pas bissextile.") # On met le programme en pause pour éviter qu'il ne se referme (Windows) os.system("pause")
Et on sauve se fichier en "bissextile.py"
Le Shell
Pour lancer les fichiers avec des arguments
Les fichiers
os.listdir(path) renvoie une liste contenant les noms de tous les fichiers et répertoires de pathOn peut également utiliser la fonction glob.glob(path) qui renvoie une liste contenant le chemin complet des fichiers ou répertoire contenu dans path avec la fonction import glob
Changer le répertoire de travail courant
import osos.chdir("C:/tests python")
Lecture et écriture dans un fichier
mode d'ouvertureChaine | Signification littérale |
---|---|
'r' | ouverture en lecture (Read). |
'w' | ouverture en écriture (Write). Le contenu du fichier est écrasé. Si le fichier n'existe pas, il est créé. |
'a' | ouverture en écriture en mode ajout (Append). On écrit à la fin du fichier sans écraser l'ancien contenu du fichier. Si le fichier n'existe pas, il est créé. |
On peut ajouter à tous ces modes le signe 'b' pour ouvrir le fichier en mode binaire. |
mon_fichier
-> <_io.TextIOWrapper name='fichier.txt' encoding='cp1252'>
type(mon_fichier)
-> <class '_io.TextIOWrapper'>
Fermer le fichier
mon_fichier.close()Lire l'intégralité du fichier
mon_fichier = open("fichier.txt", "r")contenu = mon_fichier.read()
print(contenu)
->C'est le contenu du fichier. Spectaculaire non ?
mon_fichier.close()
Écriture dans un fichier
mon_fichier = open("fichier.txt", "w") # Argh j'ai tout écrasé !mon_fichier.write("Premier test d'écriture dans un fichier via Python")
->50
mon_fichier.close()
La méthode write n'accepte en paramètre que des chaînes de caractères.
Le mot-clé «with»
with open('fichier.txt', 'r') as mon_fichier:texte = mon_fichier.read()
Il est inutile de fermer le fichier à la fin du bloc with, Python va le faire tout seul.
Enregistrer des objets dans des fichiers
import picklewith open('donnees', 'wb') as fichier:
mon_pickler = pickle.Pickler(fichier) # enregistrement
Exemple 2:
score = {
"joueur 1": 5,
"joueur 2": 35,
"joueur 3": 20,
"joueur 4": 2,
}
with open('donnees', 'wb') as fichier:
mon_pickler = pickle.Pickler(fichier)
mon_pickler.dump(score)
Récupérer nos objets enregistrés
with open('donnees', 'rb') as fichier:mon_depickler = pickle.Unpickler(fichier)
score_recupere = mon_depickler.load()
Pour le reste des fonctions faire un help("os")
Portée des variables et références
La portée des variables
La portée de nos variables définies dans un corps de fonction sont local.Les références
ma_liste1 = [1, 2, 3]ma_liste2 = ma_liste1
ma_liste2.append(4)
print(ma_liste2)
[1, 2, 3, 4]
print(ma_liste1)
[1, 2, 3, 4]
Ma_liste1 et ma_liste2 contiennent une référence vers le même objet.
Modifier une liste sans toucher à l'autre
ma_liste1 = [1, 2, 3]ma_liste2 = list(ma_liste1) # Cela revient à copier le contenu de ma_liste1
ma_liste2.append(4)
print(ma_liste2)
[1, 2, 3, 4]
print(ma_liste1)
[1, 2, 3]
Exemple 2
ma_liste1 = [1, 2]
ma_liste2 = [1, 2]
ma_liste1 == ma_liste2 # On compare le contenu des listes
True
ma_liste1 is ma_liste2 # On compare leur référence
False
Première approche des classes
Il est préférable d'utiliser pour des noms de classes la convention dite Camel Case.Cette convention n'utilise pas le signe souligné _ pour séparer les mots. Le principe consiste à mettre en majuscule chaque lettre débutant un mot, par exemple : MaClasse.
Pour définir une nouvelle classe, on utilise le mot-clé class.
Sa syntaxe est assez intuitive : class NomDeLaClasse:.
Nos premiers attributs
class Personne: # Définition de notre classe Personne """Classe définissant une personne caractérisée par : - son nom - son prénom - son âge - son lieu de résidence""" def __init__(self, nom, prenom): """Constructeur de notre classe""" self.nom = nom self.prenom = prenom self.age = 33 # Cela n'engage à rien self.lieu_residence = "Paris"
jean = Personne("Micado", "Jean")
jean.nom
'Micado'
jean.prenom
'Jean'
jean.age
33
jean.lieu_residence
'Paris'
jean.lieu_residence = "Berlin" # Jean déménage
jean.lieu_residence
'Berlin'
La définition de notre constructeur. Comme vous le voyez, il s'agit d'une définition presque « classique » d'une fonction.
Elle a pour nom __init__, c'est invariable : en Python, tous les constructeurs s'appellent ainsi.
Les noms de méthodes entourés de part et d'autre de deux signes soulignés (__nommethode__) sont des méthodes spéciales.
Notez que, dans notre définition de méthode, nous passons un premier paramètre nommé self.
Attributs de classe
class TableauNoir: """Classe définissant une surface sur laquelle on peut écrire, que l'on peut lire et effacer, par jeu de méthodes. L'attribut modifié est 'surface'""" def __init__(self): """Par défaut, notre surface est vide""" self.surface = "" def ecrire(self, message_a_ecrire): """Méthode permettant d'écrire sur la surface du tableau. Si la surface n'est pas vide, on saute une ligne avant de rajouter le message à écrire""" if self.surface != "": self.surface += "\n" self.surface += message_a_ecrire
test
tab = TableauNoir()
tab.surface
''
tab.ecrire("Coooool ! Ce sont les vacances !")
tab.surface
"Coooool ! Ce sont les vacances !"
tab.ecrire("Joyeux Noël !")
tab.surface
"Coooool ! Ce sont les vacances !\nJoyeux Noël !"
print(tab.surface)
Coooool ! Ce sont les vacances !
Joyeux Noël !
Les propriétés en action
class Personne: """Classe dénissant une personne caractérisée par : son nom ; son prénom ; son âge ; son lieu de résidence""" def __init__(self, nom, prenom): """Constructeur de notre classe""" self.nom = nom self.prenom = prenom self.age = 33 self._lieu_residence = "Paris" # Notez le souligné _ devant le nom def __repr__(self): """Quand on entre notre objet dans l'interpréteur""" return "{} {}, âgé de {} ans".format(self.prenom, self.nom, self.age) def __del__(self): """Méthode appelée quand l'objet est supprimé""" print("C'est la fin ! On me supprime !") def _get_lieu_residence(self): """Méthode qui sera appelée quand on souhaitera accéder en lecture à l'attribut 'lieu_residence'""" print("On accéde à l'attribut lieu_residence !") return self._lieu_residence def _set_lieu_residence(self, nouvelle_residence): """Méthode appelée quand on souhaite modifier le lieu de résidence""" print("Attention, il semble que {} déménage à {}.".format(self.prenom, nouvelle_residence)) self._lieu_residence = nouvelle_residence # On va dire à Python que notre attribut lieu_residence pointe vers une propriété lieu_residence = property(_get_lieu_residence, _set_lieu_residence)
test
jean = Personne("Micado", "Jean")
jean.nom
'Micado'
jean.prenom
'Jean'
jean.age
33
jean.lieu_residence
On accède à l'attribut lieu_residence !
'Paris'
jean.lieu_residence = "Berlin"
Attention, il semble que Jean déménage à Berlin.
jean.lieu_residence
On accède à l'attribut lieu_residence !
'Berlin'
Les méthodes spéciales
Méthode spéciale | Signification littérale |
---|---|
Les objets | |
__init__ | Prend un nombre variable d'arguments et permet de contrôler la création de nos attributs |
__del__ | Va être appelée au moment de la destruction de l'objet. |
__repr__ | Affecte la façon dont est affiché l'objet quand on tape directement son nom. |
__str__ | Utilisée pour afficher l'objet avec print |
Les attributs | |
__getattr__ | Définit une méthode d'accès aux attributs. |
__setattr__ | Définit l'accès à un attribut destiné à être modifié. |
__delattr__ | Supprimer un attribut de l'objet. |
Les conteneurs | |
__getitem__ | |
__setitem__ | |
__delitem__ | |
__contains__ | |
__len__ |
Exemples
Exemple complet
Sous un éditeur de texte taperclass Duree: """Classe contenant des durées sous la forme d'un nombre de minutes et de secondes""" def __init__(self, min=0, sec=0): """Constructeur de la classe""" self.min = min # Nombre de minutes self.sec = sec # Nombre de secondes def __str__(self): """Affichage un peu plus joli de nos objets""" return "{0:02}:{1:02}".format(self.min, self.sec) def __repr__(self): """Quand on entre notre objet dans l'interpréteur""" return "{0:02}:{1:02}".format(self.min, self.sec) def __iadd__(self, objet_a_ajouter): """L'objet à ajouter est un entier, le nombre de secondes""" # On travaille directement sur self cette fois # On ajoute la durée self.sec += objet_a_ajouter # Si le nombre de secondes >= 60 if self.sec >= 60: self.min += self.sec // 60 self.sec = self.sec % 60 # On renvoie self return self def __eq__(self, autre_duree): """Test si self et autre_duree sont égales""" return self.sec == autre_duree.sec and self.min == autre_duree.min def __gt__(self, autre_duree): """Test si self > autre_duree""" # On calcule le nombre de secondes de self et autre_duree nb_sec1 = self.sec + self.min * 60 nb_sec2 = autre_duree.sec + autre_duree.min * 60 return nb_sec1 > nb_sec2
Enregister le par exemple c:\Python34\duree.py puis sous python :
os.chdir('c:\Python34')
import duree
d1=duree.Duree(5,30)
print(d1)
05:30
d1+=128
d1
07:38
Exemple
class Exemple: """Un petit exemple de classe""" def __init__(self, nom, prenom): """Exemple de constructeur""" self.nom = nom self.prenom = prenom self.age = 33 self.autre_attribut = "une valeur" def __del__(self): """Méthode appelée quand l'objet est supprimé""" print("C'est la fin ! On me supprime !") def __str__(self): """Méthode permettant d'afficher plus joliment notre objet""" return "{} {}, âgé de {} ans".format(self.prenom, self.nom, self.age) def __getattr__(self, nom): """Si Python ne trouve pas l'attribut nommé nom, il appelle cette méthode. On affiche une alerte""" print("Alerte ! Il n'y a pas d'attribut {} ici !".format(nom))
mon_objet = Exemple("un premier exemple")
Opérateur | Méthode spéciale | Résumé |
---|---|---|
== | def __eq__(self, objet_a_comparer): | Opérateur d'égalité (equal). Renvoie True si self et objet_a_comparer sont égaux, False sinon. |
!= | def __ne__(self, objet_a_comparer): | Différent de (non equal). Renvoie True si self et objet_a_comparer sont différents, False sinon. |
> | def __gt__(self, objet_a_comparer): | Teste si self est strictement supérieur (greather than) à objet_a_comparer. |
>= | def __ge__(self, objet_a_comparer): | Teste si self est supérieur ou égal (greater or equal) à objet_a_comparer. |
< | def __lt__(self, objet_a_comparer): | Teste si self est strictement inférieur (lower than) à objet_a_comparer. |
<= | def __le__(self, objet_a_comparer): | Teste si self est inférieur ou égal (lower or equal) à objet_a_comparer. |
Première approche du tri
etudiants = [("Clément", 14, 16),("Charles", 12, 15),("Oriane", 14, 18),("Thomas", 11, 12),("Damien", 12, 15)]sorted(etudiants)
[('Charles', 12, 15), ('Clément', 14, 16), ('Damien', 12, 15), ('Oriane', 14, 18), ('Thomas', 11, 12)]
lambda colonnes: colonnes[2]
>>> sorted(etudiants, key=lambda colonnes: colonnes[2])
[('Thomas', 11, 12), ('Charles', 12, 15), ('Damien', 12, 15), ('Clément', 14, 16), ('Oriane', 14, 18)]
Attention colonnes[0], c'est le nom
Trier une liste d'objets
class Etudiant: """Classe représentant un étudiant. On représente un étudiant par son prénom (attribut prenom), son âge (attribut age) et sa note moyenne (attribut moyenne, entre 0 et 20). Paramètres du constructeur : prenom -- le prénom de l'étudiant age -- l'âge de l'étudiant moyenne -- la moyenne de l'étudiant""" def __init__(self, prenom, age, moyenne): self.prenom = prenom self.age = age self.moyenne = moyenne def __repr__(self): return "<Étudiant {} (âge={}, moyenne={})>".format(self.prenom, self.age, self.moyenne)
etudiants = [
Etudiant("Clément", 14, 16),
Etudiant("Charles", 12, 15),
Etudiant("Oriane", 14, 18),
Etudiant("Thomas", 11, 12),
Etudiant("Damien", 12, 15),
]
sorted(etudiants, key=lambda etudiant: etudiant.moyenne)
[<Étudiant Thomas (âge=11, moyenne=12)>, <Étudiant Charles (âge=12, moyenne=15)>, <Étudiant Damien (âge=12, moyenne=15)>, <Étudiant Clément (âge=14, moyenne=16) >, <Étudiant Oriane (âge=14, moyenne=18)>]
sorted(etudiants, key=lambda etudiant: etudiant.age, reverse=True)
[<Étudiant Clément (âge=14, moyenne=16)>, <Étudiant Oriane (âge=14, moyenne=18)>, <Étudiant Charles (âge=12, moyenne=15)>, <Étudiant Damien (âge=12, moyenne=15) >, <Étudiant Thomas (âge=11, moyenne=12)>]
L'héritage
class Personne: """Classe représentant une personne""" def __init__(self, nom): """Constructeur de notre classe""" self.nom = nom self.prenom = "Martin" def __str__(self): """Méthode appelée lors d'une conversion de l'objet en chaîne""" return "{0} {1}".format(self.prenom, self.nom) class AgentSpecial(Personne): """Classe définissant un agent spécial. Elle hérite de la classe Personne""" def __init__(self, nom, matricule): """Un agent se définit par son nom et son matricule""" # On appelle explicitement le constructeur de Personne : Personne.__init__(self, nom) self.matricule = matricule def __str__(self): """Méthode appelée lors d'une conversion de l'objet en chaîne""" return "Agent {0}, matricule {1}".format(self.nom, self.matricule)
agent = AgentSpecial("Fisher", "18327-121")
agent.nom
'Fisher'
print(agent)
Agent Fisher, matricule 18327-121
agent.prenom
'Martin'
Deux fonctions très pratiques
issubclassComme son nom l'indique, elle vérifie si une classe est une sous-classe d'une autre classe. Elle renvoie True si c'est le cas, False sinon.
issubclass(ess2.AgentSpecial, ess2.Personne)
True
issubclass(AgentSpecial, object)
True
issubclass(Personne, AgentSpecial) # Personne n'hérite pas d'AgentSpecial
False
isinstance
isinstance permet de savoir si un objet est issu d'une classe ou de ses classes filles.
agent = AgentSpecial("Fisher", "18327-121")
isinstance(agent, AgentSpecial) # Agent est une instance d'AgentSpecial
True
isinstance(agent, Personne) # Agent est une instance héritée de Personne
True