Introduction à Python¶
Dans cette série, vous allez vous familiariser avec le langage Python.
Exercice 1 : Lire l’introduction à Python¶
Lisez le tutoriel de Python. Si vous souhaitez travailler chez vous, téléchargez Python depuis le site officiel. Pour les séances d’exercices, vous aurez besoin de la version 3.x de Python (ou ultérieure). Attention : les exercices ne sont pas compatibles avec Python 2.x.
Linux¶
Sous Linux, vous pouvez éditer vos fichiers sources avec votre éditeur préféré (vi, nano, ...). Cependant, nous vous recommandons d’utiliser gedit car il reconnaît la syntaxe de Python. Il existe plusieurs façons d’exécuter du code. La plus simple est la suivante :
python3 monfichier.py
Python dispose d’une interface interactive permettant de débugger et de tester différentes commandes. Pour appeler l’interface, il faut lancer python3 dans un terminal. Pour quitter l’interface, un simple exit() (ou Ctrl-D) suffit.
Windows¶
Utilisez Linux... Sinon, PyScripter est un environnement open-source de développement Python. Une fois le fichier zip téléchargé, vous pouvez le décompresser dans le répertoire de votre choix, puis lancer l’exécutable.
Vous pouvez également utiliser un éditeur qui reconnaît la syntaxe de Python comme Notepad++ ou PSPad. Vous pouvez ensuite exécuter votre code en ligne de commande en utilisant l’installation standard de Python :
python3 monfichier.py
Le chemin vers l’exécutable python3 doit être présent dans le paramètre système %PATH%.
Introduction rapide à la programmation objet en Python¶
Dans les séries à venir, nous utiliserons des types de structures de données abstraits (TDA). Python offre la possibilité de créer des classes et de manipuler des objets. La syntaxe complète pour la gestion des classes se trouve au Chapitre 9 du tutoriel de Python.
Afin de vous familiariser avec la syntaxe de Python, voici un petit exemple :
class Personne:
def __init__(self, nom, age):
""" Constructeur. """
self.nom = nom
self.age = age
def anniversaire(self):
self.age += 1
class Etudiant(Personne): # Héritage
def __init__(self, nom, age, section):
""" Constructeur. """
Personne.__init__(self, nom, age) # Héritage
self.section = section
def __str__(self):
""" Surcharge la fonction qui retourne une représentation de l'objet\
sous forme de string.
"""
return 'Etudiant {} a {} ans et est en section: {}'.format(self.nom,
self.age,
self.section)
def change_section(self, section):
self.section = section
def affiche_etudiants(etudiants):
print('Listes des étudiants:')
for etudiant in etudiants:
print('\t' + str(etudiant))
toto = Etudiant('Toto', 23, 'SSC')
print(toto)
toto.anniversaire()
toto.change_section('INF')
print(toto)
L’exemple ci-dessus affichera :
Etudiant Toto a 23 ans et est en section: SSC
Etudiant Toto a 24 ans et est en section: INF
Étudions plus en détail cet exemple.
- Tout d’abord, nous commençons par définir une classe
Personne. Ensuite, nous définissons un constructeur (__init__ (self,...)), qui met à jour les attributsnometage, et une méthodeanniversaire, qui incrémente d’une unité l’âge de la personne. - De plus, nous définissons une autre classe
Etudiant, qui est elle-même une sous-classe dePersonne. Comme vous pouvez le constater, le constructeur de la classeEtudiantfait appel au constructeur de la classePersonnepour initialiser les attributsnometage(vu qu’ils sont hérités). - La méthode
__str__(self)est une méthode de la classeobject. Elle est donc héritée, mais peut être surchargée. Dans la classeEtudiant, la méthode__str__(self)retourne une string donnant une description de l’objet .
Note
Contrairement à de nombreux langages de programmation, Python ne vous laisse pas choisir par quelle méthode sont passés les paramètres (par référence ou par valeur). Python travaille en object-reference, qui est en fait une combinaison du passage par référence et par valeur. Plus concrètement, si le paramètre est un objet mutable (une liste, un dictionnaire, notre classe Personne), alors l’objet est passé par référence. Si l’objet n’est pas mutable (nombre, string, tuple), alors le paramètre est passé par valeur.
Note
Vu l’ambiguïté causée par le passage en paramètre, certaines fonctions (comme append, extend, sort) retournent None lorsqu’on travaille sur des listes mutables (comme c’est le cas dans notre exemple). Ceci est normal, car il y a eu beaucoup de confusion dans le passé pour décider si ces fonctions devaient retourner un nouvel objet ou plutôt une référence sur l’ancien. La solution la plus simple est de ne pas directement retourner le résultat.
Pour mieux comprendre ce problème, considérez l’exemple ci-dessous :
toto = Etudiant('Toto', 23, 'INF')
titi = Etudiant('Titi', 22, 'SSC')
tata = Etudiant('Tata', 25, 'SSC')
etudiants=[toto, titi, tata]
print(etudiants.sort(key = lambda e : e.age))
qui affichera
None
tandis que
toto = Etudiant('Toto', 23, 'INF')
titi = Etudiant('Titi', 22, 'SSC')
tata = Etudiant('Tata', 25, 'SSC')
etudiants=[toto, titi, tata]
etudiants.sort(key = lambda e : e.age)
affiche_etudiants(etudiants)
affichera
Liste des étudiants:
Etudiant Titi a 22 ans et est en section: SSC
Etudiant Toto a 24 ans et est en section: INF
Etudiant Tata a 25 ans et est en section: SSC