Le langage Python

Vaste domaine

Des projets pour la maison...

L'interpreteur

Avant tout le langage python est un langage interprété

OpérateurSignification littéraleExempleSortie
+addition2+35
-soustraction2-3-1
*multiplication2*36
/division2/30.666666
/division entière10//33
%reste de la division entière10%31
#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.classesSignification littéraleExempleSortie
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 ou
ma_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 liste

Insé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 variableDésignation (anglais)Désignation (français)
intintegerentier
strstringchaine de caractère
floatfloatvirgule flottante
boolboolean True or FalseBooléen Vraie ou Faux
listlistListe
dictDictonnaryDictionnaire

La fonction « print»

Cette fonction permet d'afficher la valeur d'une ou plusieurs variables.
ex : a=3
b = 32
print("a =", a, "et b =", b)
->a=3 et b=32

Les structures conditionnelles

La fonction « if/else»

ex: a = 5
if 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érateurSignification 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 * valeur

L'instruction «lambda»

Permet créer des fonctions extrêmement courtes car limitées à une seule instruction f = lambda x: x * x
f(5)
25

Le mot-clé «break»

Permet de sortir d'une boucle

Le 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 math
Nous 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 path
On 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 os
os.chdir("C:/tests python")

Lecture et écriture dans un fichier

mode d'ouverture
ChaineSignification 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 = open("fichier.txt", "r")
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 pickle
with 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écialeSignification 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 taper
class 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érateurMéthode spécialeRé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

issubclass
Comme 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