Instructions et structures de base pour la programmation Python : kit de survie
Commentaires
Les commentaires permettent de rendre le code plus compréhensible.
En Python, les commentaires sont précédés du caractère #
.
Remarque : les documentations des modules, classes et fonctions sont réalisés à l'aide de commentaires spéciaux, les « doc strings », délimités par des double cotes (1 ou 3 : """
) et accessibles à l'exécution contrairement aux commentaires standards.
def dire_bonjour():
"""
Cette fonction dit bonjour.
Je n'ai rien d'autre à dire, mais si c'était
le cas, je pourrais bien l'écrire dans cette
jolie doc string.
"""
print "Bonjour" # Toute la magie opère sur cette ligne très complexe
Types de données prédéfinis
Les types de données de base les plus importants en Python sont :
- Les nombres entiers (
int
etlong
), réels (float
) et complexes (complex
) - Les chaînes de caractères (
str
) et les chaînes de caractères unicode (unicode
) - Les booléens (
bool
)
Pour connaître le type d'une variable, il existe une fonction pratique type()
:
>>> chaine = 'pascal'
>>> type(chaine)
<type 'str'>
Il est possible de convertir de manière explicite (cast) une variable d'un type vers un autre type :
>>> a = '4'
>>> type(a)
<type 'str'>
>>> entier_a = int(a)
>>> entier_a
4
>>> type(entier_a)
<type 'int'>
Les listes, tuples, ensembles et dictionnaires
Les listes, tuples, ensembles et dictionnaires sont des structures de données qui peuvent être vus comme des conteneurs de plusieurs éléments. Ils ressemblent à des tableaux, dans lesquels on peut stocker n'importe quel type d'objet.
Listes
Une liste est représentée par une suite d'éléments délimitée par des crochets et séparés par des virgules. Une fois créée, on peut modifier une liste, en lui ajoutant, modifiant ou supprimant des éléments. Quelques exemples :
>>> maliste = [0, 1, 1, 2, 2, 3, 5, 8, 13] # Je crée une liste
>>> print maliste # Je l'affiche
[0, 1, 1, 2, 2, 3, 5, 8, 13]
>>> type(maliste) # Quel est le type de ma variable "maliste" ?
<type 'list'> # Ouf, c'est bien une liste !
>>> maliste[6] # J'accède au 7e élément de la liste (les index commencent à 0)
5
>>> maliste.pop(4) # Je retire le 5e élément de la liste
2
>>> maliste
[0, 1, 1, 2, 3, 5, 8, 13] # C'est le début de Fibonacci !
>>> maliste.append(21) # J'ajoute un élément à la fin
>>> print maliste
[0, 1, 1, 2, 3, 5, 8, 13, 21]
>>> autreliste = ['etc.'] # Je crée une autre liste, qui elle ne comporte qu'un élément
>>> maliste + autreliste # Je concatène mes deux listes avec l'opérateur +
[0, 1, 1, 2, 3, 5, 8, 13, 21, 'etc.']
>>> maliste[2:] # J'extrais les éléments de la position 3 jusqu'au bout
[1, 2, 3, 5, 8, 13, 21]
>>> maliste[:2] # J'extrais les deux premiers éléments
[0, 1]
>>> maliste[3:5] # J'extrais les éléments de la position 4 à 6 (les index commencent à 0)
[2, 3]
>>> len(maliste) # Quelle est la longueur de ma liste ?
9
>>> maliste[len(maliste)-3:] # J'extrais les 3 derniers éléments de la liste
[8, 13, 21]
>>> maliste[2] = 'coucou' # Je modifie un élément (celui qui est en 3e position !)
>>> print maliste
[0, 1, 'coucou', 2, 3, 5, 8, 13, 21]
Les listes Python viennent avec un outil extrêmement puissant : la compréhension de liste (list comprehension). Il s'agit d'utiliser une boucle for
pour construire une liste, potentiellement avec une condition :
print 'Carrés des nombres inférieurs à 4 :'
print [x ** 2 for x in range(4)]
Carrés des nombres inférieurs à 4 :
[0, 1, 4, 9]
Un exemple de compréhension de liste, plus compliqué :
Codeetudiants = [
{'nom': 'Dupont', 'promo': 'M1'},
{'nom': 'Durand', 'promo': 'M2'},
{'nom': 'Dupontel', 'promo': 'M1'},
{'nom': 'Antoine', 'promo': 'M1'},
]
etudiants_m1 = [e for e in etudiants if e['promo'] == 'M1']
etudiants_m2 = [e for e in etudiants if e['promo'] == 'M2']
print "Inscrits en M1 :", etudiants_m1
print "Inscrits en M2 :", etudiants_m2
ExécutionInscrits en M1 : [{'promo': 'M1', 'nom': 'Dupont'}, {'promo': 'M1', 'nom': 'Dupontel'}, {'promo': 'M1', 'nom': 'Antoine'}]
Inscrits en M2 : [{'promo': 'M2', 'nom': 'Durand'}]
Tuples
Les tuples ressemblent très fort aux listes, sauf qu'ils ne sont pas modifiables (on dit « immutable »).
Les tuples sont écrits entre parenthèses.
>>> montuple = (0, 1, 1, 2, 2, 3, 5, 8, 13)
>>> print montuple
(0, 1, 1, 2, 2, 3, 5, 8, 13)
>>> type(montuple)
<type 'tuple'>
>>> montuple[6]
5
>>> 9 in montuple
False
>>> 8 in montuple
True
>>> montuple.pop(4) # Non non, on ne peut pas !
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'pop'
>>> montuple[2] = 'coucou' # Non plus...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Ensembles (sets et frozensets)
Python propose une autre structure, les sets, qui permet de représenter des ensembles (collections non-ordonnées sans doublons) :
>>> liste_avec_doublons = ['pascal', 'pierre', 'paul', 'pierre']
>>> set(liste_avec_doublons)
set(['pascal', 'pierre', 'paul'])
Un autre type d'ensemble est disponible, le frozenset. Les propriétés des frozensets sont analogues à celles des sets, à la différence près que les frozensets sont immutables. On retrouve grosso-modo la même relation entre un frozenset et un set qu'entre un tuble et une liste :
Dictionnaires
Les dictionnaires Python sont l'équivalent de ce que l'on appelle parfois par ailleurs « tableaux associatifs ». Ils contiennent des éléments indexés par des clés. Les gens qui connaissent Javascript par exemple, devraient se trouver familiers avec ces constructions.
Voici quelques exemples :
>>> berti = {'nom': 'Bertignac', 'prenom': 'Louis', 'instruments': ['guitare', 'chant']}
>>> print berti
{'nom': 'Bertignac', 'prenom': 'Louis', 'instruments': ['guitare', 'chant']}
>>> berti['nom']
'Bertignac'
>>> berti['instruments']
['guitare', 'chant']
>>> berti['groupes'] = ['Higelin', 'Telephone', 'Bertignac et les visiteurs']
>>> berti
{'nom': 'Bertignac', 'prenom': 'Louis', 'groupes': ['Higelin', 'Telephone', 'Bertignac et les visiteurs'], 'instruments': ['guitare', 'chant']}
>>> del berti['instruments']
>>> berti
{'nom': 'Bertignac', 'prenom': 'Louis', 'groupes': ['Higelin', 'Telephone', 'Bertignac et les visiteurs']}
De manière analogue à ce que nous avons vu sur les listes avec la compréhension de liste, il est possible de construire des dictionnaires en compréhension : outil très puissant ! Voici un exemple :
personnes = ['PAUL', 'Pierre', 'jean']
print {p.lower(): len(p) for p in personnes}
{'jean': 4, 'paul': 4, 'pierre': 6}
Structures conditionnelles
Comme tout langage de programmation, Python fournit les structures conditionnelles nécessaires à toutes les applications (if/else/elif
) :
if expression:
instructions
elif expression_2:
instructions
else:
instructions
if age_du_capitaine < 16:
print "Le capitaine doit aller à l'école"
elif age_du_capitaine >= 60:
print "Le capitaine peut partir en retraite"
else:
print "Le capitaine est actif (ou étudiant...)"
Voici une illustration de l'utilisation d'une structure conditionnelle sur un exemple un peu plus compliqué :
# -*- coding: UTF-8 -*-
import re
nom = raw_input('Quel est votre prénom ')
if len(re.split('[ -]', nom)) > 1:
print "Vous avez un prénom composé !"
else:
print "Votre prénom ne contient qu'un mot."
…donnera à l'exécution :
$ python hello_world.py
Quel est votre prénom ? Pascal
Votre prénom ne contient qu'un mot.
$ python hello_world.py
Quel est votre prénom ? Jean-Pascal
Vous avez un prénom composé !
$ python hello_world.py
Quel est votre prénom ? Pierre Antoine
Vous avez un prénom composé !
Structures itératives
Les structures itératives sont plus généralement connues sous le nom de « boucles ». On retrouve notamment en Python les classiques boucles while
et for
.
Boucle while
Assez classique…
compteur = 1
while compteur < 5:
print "Et de {nombre}".format(nombre=compteur)
compteur = compteur +1
Et de 1
Et de 2
Et de 3
Et de 4
Boucle for
La boucle for
de Python peut parfois être déroutante pour les débutants. En effet, elle ne fonctionne pas comme un compteur, comme c'est le cas dans beaucoup de langages, mais comme une implémentation du design pattern itérateur. Donc, grosso modo, comme un « foreach » :
for personne in ['Jean', 'Paul', 'Simon']:
print personne
Jean
Paul
Simon
On peut faire en sorte que la boucle for de Python fonctionne comme une boucle for traditionnelle. Pour cela, on utilise généralement la fonction intégrée range()
:
for index in range(10):
print index
0
1
2
3
4
Il est également possible, en itérant sur une liste, de récupérer l'élément et son index, grâce à la fonction enumerate()
:
for index, nom in enumerate(['Jean', 'Paul', 'Simon']):
print index, nom
0 Jean
1 Paul
2 Simon
Enfin, quand on travaille sur un dictionnaire, il est possible d'itérer sur les éléments du dictionnaires (paires clé/valeur), grâce à la fonction items()
:
berti = {'nom': 'Bertignac', 'prenom': 'Louis', 'instruments': ['guitare', 'chant']}
for cle, valeur in berti.items():
print cle, valeur
nom Bertignac
prenom Louis
instruments ['guitare', 'chant']
Fonctions
La déclaration d'une fonction Python peut se faire à peu près partout dans le code d'un programme : au début, à l'intérieur d'une autre fonction, dans une classe (on parle alors de méthode bien que la syntaxe soit identique)… On utilise pour cela le mot clé def
:
def dire_bonjour(nom):
return 'Bonjour {qui}'.format(qui=nom)
print dire_bonjour('Pascal')
Bonjour Pascal
Opérateurs
Les opérateurs arithmétiques fonctionnent de manière analogue à ce que l'on peut voir dans la plupart des langages.
En particulier :
- L'addition (
+
) - La soustraction (
-
) - La multiplication (
*
) - La division (
/
) - Le modulo (
%
) - La puissance (
**
)
Idem pour la comparaison :
- Égalité (
==
) - Non égalité (
!=
) - Inférieur, inférieur ou égal (
<
,<=
) - Supérieur, supérieur ou égal (
>
,>=
)
Enfin, Python fournit des opérateurs de conjonction d'expressions :
and
or
not
Bien entendu, les opérateurs peuvent être utilisés conjointement :
print 1 < 2 or 1 > 2
True
Variables et affectation
Comme dans beaucoup de langages, les variables en Python sont nommées (en commençant par une lettre ou un underscore), et de manière sensible à la casse. Exemple : ma_variable = 5
.
Lectures conseillées
- L'intéressante intervention d'Alex Gaynor à PyCon 2011 : The Data Structures of Python (et son fameux crash d'ordinateur en pleine présentation :)
Testez vos connaissances
1+2*5
?- Elle calcule 2*5 puis y ajoute 1.
- Elle calcule 1+2 puis multiplie le résultat par 5.
- Elle fait le café.
- Elle réalise des opérations arithmétiques.