Introduction
1. Qu’est-ce que Python ?
- Python est un langage de programmation créé en 1989 par Guido van Rossum, nommé d’après la série télévisée Monty Python’s Flying Circus.
- La version actuelle est Python 3 (3.11 depuis octobre 2022). La version 2 est obsolète.
- Organisme officiel : Python Software Foundation.
- Caractéristiques clés :
- Multiplateforme : fonctionne sur Windows, Mac OS X, Linux, Android, iOS, Raspberry Pi, supercalculateurs.
- Gratuit et libre d’installation.
- Langage de haut niveau : facile à apprendre sans connaissances approfondies en informatique.
- Langage interprété : pas besoin de compilation.
- Orienté objet : modélisation d’entités réelles (molécules, protéines, etc.).
- Simple à prendre en main.
- Langage le plus utilisé au monde (classements TIOBE, IEEE Spectrum).
- Très utilisé en bioinformatique, chimie-informatique et analyse de données.
2. Conseils pour l’apprentissage de Python
- Apprendre Python demande du temps et de la pratique régulière.
- Nécessite uniquement un ordinateur et une connexion internet.
- Python est patient et toujours disponible, idéal pour expérimenter et corriger ses erreurs.
3. Conseils pour installer et configurer Python
- Installer Python 3 sur Windows, Mac OS X ou Linux.
- Recommandation : installer Miniconda, qui inclut Python 3 et le gestionnaire de paquets conda.
- Conda facilite l’installation de modules utiles (NumPy, scipy, matplotlib, pandas, Biopython, Jupyter Lab).
- Choix d’un éditeur de texte adapté :
- Débutants : Notepad++ (Windows), BBEdit ou CotEditor (Mac), gedit (Linux).
- Autres possibles : Visual Studio Code, Sublime Text, emacs, vim, geany.
- Ne pas utiliser de traitements de texte (Word, LibreOffice Writer) pour coder.
4. Notations utilisées
- Les commandes et instructions Python sont indiquées dans une police spécifique.
- Les programmes longs sont numérotés ligne par ligne.
- La notation
[...]indique une coupure arbitraire dans un contenu trop long.
5. Introduction au shell
- Un shell est un interpréteur de commandes interactif pour communiquer avec l’ordinateur.
- Le shell sert à lancer l’interpréteur Python.
- L’invite de commande du shell est représentée par
$(sans taper ce symbole). - Exemples d’invites de shell :
- Windows :
PS C:\Users\pierre> - Mac OS X :
iMac-de-pierre:Downloads$ - Linux :
pierre@jeera:~$
- Windows :
6. Premier contact avec Python
-
Python est un langage interprété : chaque ligne est exécutée immédiatement.
-
Lancer l’interpréteur Python dans le shell avec la commande
python. -
L’invite de l’interpréteur Python est
>>>. -
Exemple d’utilisation interactive :
>>> print("Hello world!") Hello world! >>> 1 + 1 2 -
Pour quitter l’interpréteur :
exit()ouCtrl+D(Linux/Mac),Ctrl+Zpuis Entrée (Windows). -
Les longues lignes de code peuvent être coupées avec un
\(backslash) suivi d’un retour à la ligne.
7. Premier programme
-
Pour exécuter plusieurs instructions, on écrit un script Python dans un fichier
.py. -
Exemple minimal :
print("Hello world!") -
Exécuter un script dans le shell avec :
python nom_du_fichier.py.
8. Commentaires
-
Le caractère
#introduit un commentaire : tout ce qui suit sur la ligne est ignoré par Python. -
Les commentaires expliquent le code en langage humain.
-
Exemple :
# Ceci est un commentaire print("Hello world!")
9. Notion de bloc d’instructions et d’indentation
- Un bloc d’instructions est un groupe de lignes indentées (décalées vers la droite).
- L’indentation (recommandée : 4 espaces) délimite les blocs en Python.
- Exemple (pseudo-code) : pour chaque base d’une séquence, afficher la base et compter, puis afficher le total après la boucle.
- L’indentation doit être homogène (espaces ou tabulations, pas les deux mélangés).
10. Autres ressources
- Livres recommandés en français :
- Apprendre à programmer avec Python 3 de Gérard Swinnen (gratuit en ligne).
- Apprendre à programmer en Python avec PyZo et Jupyter Notebook de Bob Cordeau et Laurent Pointal.
- Apprenez à programmer en Python de Vincent Legoff (OpenClassrooms).
- Site officiel : python.org avec documentation et index des modules.
À retenir : Python est un langage interprété, simple, multiplateforme et orienté objet, idéal pour la bioinformatique et l’analyse de données, avec une forte communauté et de nombreuses ressources pour apprendre.
Variables
1. Définition et création
- Variable : zone mémoire stockant une valeur, identifiée par un nom pour le programmeur.
- En Python, déclaration et initialisation se font simultanément :
x = 2. - Python est un langage à typage dynamique : il déduit automatiquement le type de la variable.
- L’opérateur
=est un opérateur d’affectation qui assigne la valeur de droite à la variable de gauche. - L’opérateur
=écrase la valeur précédente si la variable existe déjà.
En Python, taper le nom d’une variable dans l’interpréteur affiche sa valeur, mais pas dans un script.
2. Types de variables
| Type | Description | Exemple |
|---|---|---|
int | Entier | x = 2 |
float | Nombre décimal | y = 3.14 |
str | Chaîne de caractères (texte) | a = "bonjour" |
bool | Booléen (vrai/faux) | var = True |
- Les chaînes doivent être entourées de guillemets simples, doubles ou triples.
- Le séparateur décimal est le point (
3.14), pas la virgule. - Python est sensible à la casse :
test,TestetTESTsont des variables différentes.
3. Nommage des variables
- Autorisé : lettres (
a-z,A-Z), chiffres (0-9), underscore (_). - Interdit : espaces, début par un chiffre, mots réservés (ex.
print,for). - Recommandé : noms explicites, éviter les noms à une lettre sauf cas particuliers.
- Sensible à la casse.
4. Écriture scientifique
- Notation :
$a \times 10^b$s’écritaeben Python. - Exemple :
1e6 # 1 × 10^6 = 1000000.0 (float) 3.12e-3 # 3.12 × 10^-3 = 0.00312 - L’utilisation de l’underscore
_permet de séparer les chiffres pour la lisibilité :
6.022_140_76e23ou8_094_752_749.
5. Opérations
a) Opérations sur nombres
| Opérateur | Description | Exemple | Résultat |
|---|---|---|---|
+ | Addition | 45 + 2 | 47 |
- | Soustraction | 45 - 2 | 43 |
* | Multiplication | 45 * 3 | 135 |
/ | Division (toujours float) | 6 / 3 | 2.0 |
** | Puissance | 2 ** 3 | 8 |
// | Division entière (quotient) | 5 // 4 | 1 |
% | Modulo (reste) | 5 % 4 | 1 |
- Mélanger
intetfloatproduit unfloat. - Parenthèses permettent de gérer la priorité des opérations.
- Opérateurs combinés :
i += 1équivaut ài = i + 1(incrémentation).
Similairement-=,*=,/=.
b) Opérations sur chaînes de caractères
+: concaténation (assemblage de chaînes).
"Salut" + " Python"→"Salut Python"*: duplication (répétition).
"Salut" * 3→"SalutSalutSalut"
Attention :
+et*ont des comportements différents selon le type (numérique ou chaîne).
c) Opérations illicites
- Multiplier une chaîne par un float ou additionner une chaîne et un entier provoque une erreur
TypeError.
6. Fonction type()
- Permet de connaître le type d’une variable :
type(2) # <class 'int'> type(2.0) # <class 'float'> type('2') # <class 'str'> type(True) # <class 'bool'> - Python distingue strictement
2(int),2.0(float) et'2'(str).
7. Conversion de types (casting)
- Fonctions principales :
int(),float(),str(). - Exemples :
str(3) # '3' int('456') # 456 float('3.1416') # 3.1416 - Utile pour convertir entre chaînes et nombres, notamment lors de la lecture/écriture de fichiers.
8. Vocabulaire et syntaxe
- En Python, une variable est aussi appelée un objet.
- Une fonction est appelée avec des parenthèses, ex.
type(x). - L’argument est ce qu’on passe à la fonction entre parenthèses.
- Une fonction effectue une action et peut renvoyer un résultat.
9. Fonctions min() et max()
min()renvoie la plus petite valeur parmi plusieurs arguments.max()renvoie la plus grande valeur.- Exemples :
min(1, -2, 4) # -2 max(2.4, 3.14) # 3.14 - Ces fonctions prennent au moins deux arguments.
À retenir :
Une variable en Python est un nom lié à une valeur stockée en mémoire, avec un type dynamique. L’opérateur=affecte une valeur à une variable, écrasant l’ancienne si elle existe. Les types principaux sontint,float,stretbool. Les opérations arithmétiques et sur chaînes ont des opérateurs spécifiques, et la fonctiontype()permet d’identifier le type d’une variable. Les conversions entre types se font facilement avecint(),float(), etstr().
Affichage
1. La fonction print()
- print() affiche son argument suivi d’un retour à la ligne par défaut.
- Pour supprimer ce retour à la ligne, utiliser l’argument par mot-clé end :
print("Hello world!", end="") - Affichage de plusieurs éléments avec des virgules ajoute un espace entre eux.
Exemple :print(nom, "a", x, "ans") - Modifier le séparateur avec l’argument sep :
print(nom, "a", x, "ans", sep="-") - Pour concaténer deux chaînes sans espace, utiliser soit l’opérateur +, soit sep="" dans print.
2. Messages d’erreur
- Les messages d’erreur (ou Traceback) indiquent :
- Le type d’erreur (ex : SyntaxError, ZeroDivisionError, ValueError).
- La description précise de l’erreur.
- La ligne du script où l’erreur a été détectée.
- Lire les messages d’erreur du bas vers le haut pour comprendre la cause.
- Utiliser une version récente de Python (≥ 3.10) pour des messages plus clairs.
À retenir : Le message d’erreur indique toujours la nature et la localisation précise du problème.
3. Écriture formatée et f-strings
a) Définitions
- Écriture formatée : afficher des variables avec un format précis (ex : nombre de décimales, alignement).
- f-string (formatted string literals) : chaîne de caractères précédée de f qui permet d’insérer des variables ou expressions entre accolades
{}.
b) Utilisation basique des f-strings
- Syntaxe :
print(f"{nom} a {x} ans") - Sans le f, les accolades sont affichées telles quelles.
- On peut utiliser plusieurs fois la même variable dans une f-string.
- Les expressions et valeurs littérales sont aussi valides dans les accolades.
c) Spécification de format
- Syntaxe générale :
f"{variable:format_spec}" - Pour un float avec 2 décimales :
f"{prop_GC:.2f}" - Pour un entier :
f"{nb_G:d}" - Alignement et largeur :
Symbole Description Exemple Résultat >Alignement à droite f"{10:>6d}"" 10"<Alignement à gauche f"{10:<6d}""10 "^Centré f"{10:^6d}"" 10 " - Remplissage avec un caractère :
f"{10:*^6d}" # "**10**" - Pour les chaînes de caractères, utiliser
s:f"{'HN':>4s}" - Combinaison largeur et décimales pour float :
f"{perc_GC:7.3f}"
d) Autres détails
- Pour afficher des accolades littérales dans une f-string, doubler les accolades :
f"{{}}" - Une f-string vide
{}sans expression provoque une erreur de syntaxe. - Une f-string est évaluée avant d’être affichée par print.
e) Expressions dans les f-strings
- Les f-strings acceptent des expressions Python dans les accolades :
print(f"5 * 5 = {5 * 5}") print(f"min(1, -2, 4) = {min(1, -2, 4)}") print(f"Type de 2 : {type(2)}")
4. Écriture scientifique
- Notation scientifique avec e dans les f-strings :
f"{1_000_000_000:e}" # '1.000000e+09' - Précision du nombre de chiffres après la virgule :
f"{avogadro_number:.3e}" - Exemple avec Avogadro :
Format Résultat .0e6e+23.3e6.022e+23.6e6.022141e+23
À retenir :
- print() affiche avec retour à la ligne par défaut, modifiable avec end.
- sep modifie le séparateur entre plusieurs arguments dans print.
- f-strings permettent d’insérer variables et expressions dans des chaînes avec formatage précis.
- Les erreurs Python sont détaillées dans les Tracebacks, à lire du bas vers le haut.
- L’écriture scientifique est accessible via les f-strings avec le format
e.
Listes
1. Définition
- Une liste est une structure de données contenant une collection ordonnée d’objets Python, pouvant être de types différents.
- Elle est définie par des crochets
[]avec des éléments séparés par des virgules. - Exemple :
animaux = ["girafe", "tigre", "singe", "souris"]
2. Accès par indice
- Les éléments d’une liste sont accessibles par leur indice (position), commençant à 0 jusqu’à n−1 pour une liste de taille .
- Exemple :
animaux[0]renvoie"girafe". - Accéder à un indice hors limites provoque une erreur
IndexError.
3. Opérations sur les listes
| Opération | Description | Exemple | Résultat |
|---|---|---|---|
| Concaténation (+) | Fusionne deux listes | ["girafe", "tigre"] + ["singe"] | ["girafe", "tigre", "singe"] |
| Duplication (*) | Répète la liste plusieurs fois | ["girafe", "tigre"] * 3 | ["girafe", "tigre", "girafe", "tigre", "girafe", "tigre"] |
| Ajout d’un élément | Méthode .append() ajoute en fin | liste.append(13) | ajoute 13 à la fin de liste |
- Pour créer une liste vide :
liste = []
4. Indiçage négatif
- Les indices négatifs comptent à partir de la fin :
-1correspond au dernier élément-2à l’avant-dernier, etc.
- Exemple :
animaux[-1]→"souris"animaux[-4]→"girafe"(équivalent àanimaux[0])
5. Tranches (slicing)
- Syntaxe :
liste[m:n]récupère les éléments de l’indice inclus à exclu. - Par défaut, si ou sont omis, la tranche prend respectivement depuis le début ou jusqu’à la fin.
- On peut aussi spécifier un pas :
liste[m:n:p]prend un élément sur . - Exemples :
animaux[0:2]→["girafe", "tigre"]animaux[1:-1]→["tigre", "singe"]x[::2]→ éléments d’indice pair
6. Fonction len()
len(liste)retourne le nombre d’éléments dans la liste.- Exemple :
len(["girafe", "tigre", "singe", "souris"])→4
7. Fonctions range() et list()
range(n)génère une séquence d’entiers de 0 à .list(range(n))convertit cette séquence en liste.- Exemple :
list(range(10))→[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
À retenir : Une liste est une séquence ordonnée et mutable d’objets accessibles par indices positifs ou négatifs, avec de nombreuses opérations natives pour manipuler facilement ses éléments.
Boucles et comparaisons
1. Boucles for
- But : Répéter un bloc d’instructions pour chaque élément d’une séquence (liste, chaîne, etc.).
- Syntaxe :
for variable in séquence: bloc d’instructions - Variable d’itération : prend successivement chaque valeur de la séquence.
- Le bloc d’instructions est délimité par l’indentation (4 espaces recommandés).
- Exemple :
animaux = ["girafe", "tigre", "singe", "souris"] for animal in animaux: print(animal) - La variable d’itération conserve sa dernière valeur après la boucle.
2. Fonction range()
- Génère une séquence d’entiers, utilisée souvent dans les boucles
for. - Syntaxe :
range([début,] fin[, pas])début(optionnel, défaut 0)fin(exclu)pas(optionnel, défaut 1)
- Exemples :
range(5)→ 0,1,2,3,4range(15, 20)→ 15,16,17,18,19range(0, 1000, 200)→ 0,200,400,600,800range(10, 0, -1)→ 10,9,8,...,1
range()est un objet itérable efficace en mémoire (ne crée pas une liste complète).- Pour obtenir une liste, utiliser
list(range(...)).
3. Itération sur éléments vs indices
| Méthode | Description | Exemple | Usage conseillé |
|---|---|---|---|
| Itération directe sur éléments | Parcours chaque élément directement | for animal in animaux: | Plus rapide, plus simple |
| Itération sur indices | Parcours les indices, accès via indice | for i in range(len(animaux)):<br>print(animaux[i]) | Utile si on a besoin des indices |
- Pour obtenir indices et éléments simultanément :
for i, animal in enumerate(animaux): print(f"L'animal {i} est un(e) {animal}")
4. Comparaisons (introduction)
- Les comparaisons permettent de tester des conditions (ex. : égalité, inégalité).
- Elles seront détaillées dans la suite du chapitre.
À retenir : La boucle
foritère efficacement sur des objets itérables comme les listes ou les objetsrange(). Utilisez l’itération directe sur les éléments quand possible, etenumerate()pour accéder simultanément aux indices et éléments.
Tests
1. Définition des tests
- Un test permet à Python de prendre une décision en évaluant une condition avec l’instruction
if. - Syntaxe :
if condition: bloc d’instructions indenté - Le bloc s’exécute uniquement si la condition est vraie (
True).
2. Tests à plusieurs cas : if, elif, else
ifteste une condition.elifteste une autre condition si la précédente est fausse.elses’exécute si toutes les conditions précédentes sont fausses.- Exemple :
if x == 1: ... elif x == 2: ... else: ...
3. Importance de l’indentation
- L’indentation délimite le bloc d’instructions dépendant d’un test.
- Une mauvaise indentation modifie la portée des instructions et donc le comportement du programme.
- Exemple :
- Instruction indentée dans le bloc
if→ s’exécute seulement si la condition est vraie. - Instruction non indentée → s’exécute toujours.
- Instruction indentée dans le bloc
4. Tests multiples avec opérateurs booléens
| Opérateur | Nom | Résultat vrai si... |
|---|---|---|
and | ET | les deux conditions sont vraies |
or | OU | au moins une condition est vraie |
not | NON | inverse la valeur booléenne |
- Exemples :
if x == 2 and y == 2: print("le test est vrai") if not (x == 2): print("x n'est pas 2")
5. Instructions break et continue
break: interrompt immédiatement la boucle en cours (forouwhile).continue: saute le reste du corps de la boucle et passe à l’itération suivante.- Exemple
break:for i in range(5): if i > 2: break print(i) # affiche 0,1,2 - Exemple
continue:for i in range(5): if i == 2: continue print(i) # affiche 0,1,3,4
6. Tests de valeur sur des floats
- Ne jamais tester l’égalité stricte avec
==sur des floats à cause des imprécisions de représentation. - Exemple problématique :
(3 - 2.7) == 0.3 # False car 3-2.7 ≈ 0.2999999999999998 - Bonnes pratiques pour tester l’égalité approchée avec une tolérance
delta:- Encadrement :
- Valeur absolue :
abs(var - 0.3) < delta
- Encadrement :
- Depuis Python 3.5, utiliser la fonction
math.isclose():import math math.isclose(var, 0.3, abs_tol=1e-5) - Conseil : privilégier
math.isclose()pour la lisibilité et la précision.
À retenir
Pour comparer des floats, ne jamais utiliser==mais une comparaison avec une tolérance (ex.math.isclose()).
7. Résumé des opérateurs de comparaison
| Opérateur | Signification |
|---|---|
== | égal à |
!= | différent de |
> | strictement supérieur à |
>= | supérieur ou égal à |
< | strictement inférieur à |
<= | inférieur ou égal à |
- Pour les chaînes de caractères, les comparaisons utilisent l’ordre ASCII (ordre alphabétique).
- Comparaison lexicographique caractère par caractère.
8. Exemple d’utilisation des tests
x = 2
if x == 2:
print("Le test est vrai !")
else:
print("Le test est faux !")
9. Tests imbriqués et multiples conditions
- On peut imbriquer plusieurs
ifou utiliserand/orpour combiner les conditions. - Exemple équivalent :
ouif x == 2 and y == 2: print("le test est vrai")if x == 2: if y == 2: print("le test est vrai")
10. Bonnes pratiques
- Soigner l’indentation pour éviter les erreurs de portée.
- Utiliser
and,or,notpour combiner les conditions. - Pour les floats, éviter
==strict, préférermath.isclose().
11. Récapitulatif opérateurs booléens
| Expression | Résultat attendu |
|---|---|
True or False | True |
True and False | False |
not True | False |
not (True and True) | False |
Fichiers
1. Lecture dans un fichier
- Ouvrir un fichier :
open("nom_fichier", "r")ouvre un fichier en mode lecture ("r"). Le fichier doit être dans le répertoire courant ou préciser son chemin. - Objet fichier : l'ouverture retourne un objet fichier, manipulable avec des méthodes.
- Lire toutes les lignes :
f.readlines()renvoie une liste de chaînes, chaque élément correspondant à une ligne (avec le caractère spécial\nde fin de ligne). - Fermer un fichier :
f.close()ferme le fichier, après quoi toute opération de lecture/écriture échoue. - Bloc with :
with open(...) as f:ouvre un fichier et le ferme automatiquement à la fin du bloc, même en cas d'erreur.
a) Méthodes de lecture
| Méthode | Description | Résultat |
|---|---|---|
.read() | Lit tout le contenu du fichier | Chaîne de caractères unique |
.readlines() | Lit toutes les lignes et les retourne en liste | Liste de chaînes (une par ligne) |
.readline() | Lit une ligne à chaque appel | Chaîne de caractères |
| Itération directe | Parcours ligne par ligne avec for ligne in f: | Itération sur les lignes du fichier |
À retenir : privilégier l'itération directe sur l'objet fichier pour lire ligne par ligne.
2. Écriture dans un fichier
- Ouvrir en écriture :
open("nom_fichier", "w")ouvre un fichier en mode écriture (écrase le contenu existant). - Écrire dans un fichier :
f.write(chaine)écrit une chaîne dans le fichier. Il faut gérer explicitement les retours à la ligne (\n). - Bloc with : assure la fermeture automatique du fichier.
Exemple d’écriture avec retour à la ligne :
with open("fichier.txt", "w") as f:
for ligne in liste:
f.write(f"{ligne}\n")
3. Ouvrir plusieurs fichiers simultanément
Syntaxe compacte avec with :
with open("fichier1.txt", "r") as f1, open("fichier2.txt", "w") as f2:
for ligne in f1:
f2.write("* " + ligne)
4. Retours à la ligne sous Unix et Windows
- Unix (Linux, Mac OS X) utilise
\n(line feed). - Windows utilise
\r\n(carriage return + line feed). - Python 3 gère automatiquement ces différences et normalise les retours à la ligne en
\n.
5. Conversion de types avec les fichiers
- Les méthodes de lecture renvoient toujours des chaînes de caractères.
- Pour manipuler des nombres, il faut convertir explicitement avec
int(),float(), etc. - Pour écrire des nombres, convertir en chaîne avec
str()ou utiliser l’écriture formatée.
6. Résumé des modes d'ouverture
| Mode | Description | Usage principal |
|---|---|---|
"r" | Lecture seule | Lire un fichier existant |
"w" | Écriture (écrase fichier) | Écrire ou créer un fichier |
"a" | Ajout à la fin du fichier | Ajouter sans écraser |
7. Exercices clés
- Moyenne des notes : lire un fichier de notes (une note par ligne), convertir en float, calculer et afficher la moyenne avec 2 décimales.
- Admis ou recalé : lire les notes, écrire dans un nouveau fichier chaque note suivie de "admis" (≥10) ou "recalé" (<10), avec une décimale.
- Spirale : calculer des coordonnées cartésiennes d’une spirale, écrire dans un fichier avec formatage précis, puis visualiser avec matplotlib.
À retenir : la gestion des fichiers en Python repose sur l'ouverture avec
open(), la lecture/écriture via des méthodes adaptées, et la fermeture automatique avecwithpour éviter les erreurs et fuites de ressources.
Dictionnaires et tuples
1. Dictionnaires
- Définition : Un dictionnaire est une collection d’objets accessibles via des clés (souvent des chaînes de caractères), et non par des indices comme dans les listes.
- Syntaxe :
- Dictionnaire vide :
dico = {} - Ajout d’une clé/valeur :
dico["clé"] = valeur - Initialisation multiple :
dico = {"nom": "singe", "poids": 70}
- Dictionnaire vide :
- Accès aux valeurs :
dico["clé"]renvoie la valeur associée à la clé. - Ordre : Depuis Python 3.7, l’ordre d’insertion est conservé lors de l’affichage et l’itération, mais on accède toujours par clé, pas par position.
| Méthode / Opération | Description | Exemple |
|---|---|---|
len(dico) | Nombre de paires clé/valeur | len({"a":1, "b":2}) → 2 |
for key in dico: | Itération sur les clés | for k in dico: print(k, dico[k]) |
dico.keys() | Renvoie un objet itérable des clés | list(dico.keys()) |
dico.values() | Renvoie un objet itérable des valeurs | list(dico.values()) |
dico.items() | Renvoie un objet itérable de tuples (clé, valeur) | for k,v in dico.items(): print(k,v) |
"clé" in dico | Teste si une clé existe | "poids" in dico → True/False |
"valeur" in dico.values() | Teste si une valeur existe | "singe" in dico.values() → True/False |
dico.get("clé", défaut) | Renvoie la valeur ou défaut si clé absente | dico.get("age", 42) |
-
Avantage : Les dictionnaires rendent le code plus lisible en utilisant des noms explicites comme clés plutôt que des indices numériques.
-
Liste de dictionnaires : Permet de gérer des structures complexes, par exemple une liste d’animaux où chaque animal est un dictionnaire.
2. Tuples
- Définition : Les tuples sont des séquences immuables (non modifiables) d’objets, similaires aux listes mais avec des parenthèses
()au lieu de crochets[]. - Syntaxe :
- Création :
t = (1, 2, 3)ou sans parenthèsest = 1, 2, 3(parenthèses recommandées pour la clarté) - Tuple à un élément :
t = (2,)(la virgule est obligatoire)
- Création :
- Immuabilité : On ne peut pas modifier un élément d’un tuple (
TypeErrorsi tentative). Pour ajouter un élément, il faut créer un nouveau tuple :
t = t + (4,) - Opérations :
- Concatenation :
(1,2) + (3,4) → (1,2,3,4) - Répétition :
(1,2) * 3 → (1,2,1,2,1,2)
- Concatenation :
- Conversion :
tuple(objet itérable)transforme une séquence en tuple (ex :tuple([1,2,3]) → (1,2,3)).
3. Affectation multiple et désempaquetage
- Permet d’affecter plusieurs variables en une seule instruction :
x, y, z = 1, 2, 3 - Le nombre de variables doit correspondre au nombre d’éléments.
- Utilisé aussi pour désempaqueter un tuple :
t = (1, 2, 3) x, y, z = t - Syntaxe plus élégante et lisible que d’affecter un par un.
4. Itérations sur plusieurs valeurs simultanément
- Certaines fonctions/méthodes renvoient des tuples, permettant d’itérer sur plusieurs valeurs à la fois :
enumerate(liste)renvoie des tuples(indice, élément)dico.items()renvoie des tuples(clé, valeur)
- Exemple :
for i, val in enumerate([75, -75, 0]): print(i, val) for cle, val in dico.items(): print(cle, val) - On peut aussi itérer sur des listes de tuples avec plusieurs éléments :
liste = [(5,6,7), (6,7,8), (7,8,9)] for x, y, z in liste: print(x, y, z)
5. Fonction divmod()
- Calcule quotient et reste d’une division entière en une seule opération :
quotient, reste = divmod(numérateur, dénominateur) - Exemple :
divmod(754, 60) → (12, 34) # 754 secondes = 12 minutes et 34 secondes - Utile pour convertir des durées (secondes → minutes/secondes, jours → années/mois/jours, etc.).
À retenir :
- Les dictionnaires associent des clés à des valeurs et permettent un accès explicite et rapide aux données.
- Les tuples sont des séquences immuables, utiles pour stocker des données fixes et pour l’affectation multiple.
- La fonction divmod() facilite le calcul simultané du quotient et du reste d’une division entière.
Modules
1. Définition des modules
- Modules : programmes Python contenant des fonctions réutilisables, aussi appelés bibliothèques.
- Python propose plus de 300 modules standards, couvrant de nombreux domaines.
- Toujours vérifier si une fonctionnalité existe déjà dans un module avant de la coder.
2. Importation de modules
-
Syntaxe classique :
import module module.fonction() -
Exemple :
import random random.randint(0, 10) -
Importer une fonction spécifique :
from random import randint randint(0, 10) -
Importer toutes les fonctions d’un module :
from random import *À éviter en pratique pour éviter les conflits de noms.
-
Alias pour un module :
import random as rand rand.randint(1, 10) -
Supprimer un module chargé :
del random
La syntaxe
module.fonction()indique la provenance de la fonction, ce n’est pas une méthode liée à un objet.
3. Obtenir de l’aide sur les modules
- Utiliser
help()pour obtenir la documentation d’un module ou d’une fonction :import random help(random) help(random.randint) - Naviguer dans l’aide avec les flèches, quitter avec
Q, rechercher avec/texte. - Pour lister toutes les fonctions et variables d’un module :
dir(random)
4. Modules courants à connaître
| Module | Usage principal |
|---|---|
| math | Fonctions et constantes mathématiques (sin, cos, pi, e, sqrt, etc.) |
| sys | Interaction avec l’interpréteur, gestion des arguments en ligne de commande |
| pathlib | Gestion des fichiers et répertoires |
| random | Génération de nombres aléatoires |
| time | Gestion du temps, temporisation |
| urllib | Récupération de données sur internet |
| Tkinter | Interfaces graphiques |
| re | Expressions régulières |
5. Module random : génération de nombres aléatoires
-
Fonctions principales :
random.randint(a, b): entier aléatoire entre a et b inclus.random.uniform(a, b): float aléatoire entre a et b.random.shuffle(liste): mélange aléatoire d’une liste.random.choice(liste): tire un élément aléatoire dans une liste.random.choices(liste, k=n): tire n éléments avec remise.
-
Graine aléatoire (
seed) :
Permet de reproduire une même séquence pseudo-aléatoire.random.seed(42) -
Distribution des tirages :
random.random(): float uniforme entre 0 et 1.random.gauss(mu, sigma): tirage selon une distribution gaussienne.
6. Module sys : passage d’arguments en ligne de commande
sys.argv: liste des arguments passés au script, avec le nom du script ensys.argv[0].- Exemple d’utilisation :
import sys print(sys.argv) - Vérification du nombre d’arguments :
if len(sys.argv) != 2: sys.exit("ERREUR : il faut exactement un argument.") - Fonction
sys.exit(message): quitte le script en affichant un message. - Exemple pratique : script qui compte les lignes d’un fichier passé en argument.
7. Module pathlib : gestion des fichiers et répertoires
-
Import classique :
from pathlib import Path -
Méthodes clés :
Path("fichier").exists(): vérifie si un fichier existe.Path().cwd(): chemin du répertoire courant.Path().cwd().name: nom du répertoire courant.Path().cwd().parent: répertoire parent.Path().iterdir(): itère sur le contenu du répertoire courant.Path().glob("**/*.py"): recherche récursive de fichiers.py.
-
Exemple pour vérifier l’existence d’un fichier :
if not Path("toto.pdb").exists(): sys.exit("le fichier est absent")
8. Exercices types (extraits)
- Afficher racines carrées de 10 à 20 avec 3 décimales (module
math.sqrt). - Calculer cosinus de avec
math.cosetmath.pi. - Comparer des sommes de racines carrées à et avec précision donnée.
- Afficher chemin et contenu du répertoire courant, compter fichiers et dossiers.
- Afficher nombres 1 à 10 avec pause d’une seconde (
time.sleep). - Générer séquence aléatoire de chiffres (1 à 4) avec
random.randint. - Script belote : tirer 8 cartes aléatoires sans remise, calculer total points.
- Générer séquence ADN aléatoire avec
random.choiceourandom.choices. - Script ADN aléatoire avec argument longueur, vérification d’argument.
- Améliorer script compteur de lignes avec vérification d’existence fichier.
- Estimer par méthode Monte Carlo avec tirages aléatoires dans un carré.
À retenir : Les modules Python sont des outils essentiels pour réutiliser du code, accéder à des fonctions spécialisées et interagir avec le système ou l’utilisateur. Leur maîtrise facilite la programmation efficace et robuste.
Fonctions
1. Principe et généralités
- Fonction : bloc de code réutilisable qui prend des arguments, effectue une tâche, et renvoie éventuellement un résultat.
- Avantages : réutilisation, modularité, lisibilité.
- Exemple :
len([0,1,2])renvoie la longueur de la liste (ici 3). - Une fonction peut ne rien renvoyer (retourne
Nonepar défaut). - Le programme principal est le code exécuté hors des fonctions, d'où on appelle les fonctions.
Une fonction est une « boîte noire » : on utilise ses entrées/sorties sans connaître son algorithme interne.
2. Définition
- Syntaxe pour définir une fonction :
def nom_fonction(arguments): bloc_instructions return valeur_renvoyée # facultatif - Le corps de la fonction est indenté.
- Exemple :
def carre(x): return x**2 - La valeur renvoyée peut être stockée dans une variable.
3. Passage d’arguments
- Une fonction peut prendre 0, 1 ou plusieurs arguments.
- Python est à typage dynamique : le type des arguments est reconnu à l’exécution.
- Exemple de fonction polymorphe :
fonctionne avec entiers, floats, chaînes, listes.def fois(x, y): return x * y - Attention : il est préférable que les arguments aient un type cohérent.
4. Renvoi de résultats
- Une fonction peut renvoyer plusieurs valeurs sous forme d’un tuple ou d’une liste.
- Exemple :
def carre_cube(x): return x**2, x**3 # renvoie un tuple - On peut récupérer plusieurs valeurs simultanément :
z1, z2 = carre_cube(3) - Une fonction peut aussi renvoyer un booléen (ex.
est_pair(x)).
5. Arguments positionnels et arguments par mot-clé
| Type d’argument | Définition | Particularités |
|---|---|---|
| Arguments positionnels | Arguments passés dans l’ordre défini dans la fonction | Obligatoires, ordre strict, ex : def fct(x, y): |
| Arguments par mot-clé | Arguments avec valeur par défaut, passés par nom lors de l’appel | Facultatifs, ordre libre si nom précisé, ex : def fct(x=0, y=0): |
- Exemple d’arguments par défaut :
def fct(x=1): return x - Lors d’un appel, les arguments positionnels doivent toujours précéder les arguments par mot-clé.
- Omettre un argument positionnel obligatoire provoque une erreur.
6. Variables locales et variables globales
- Variable locale : créée dans une fonction, existe uniquement pendant l’exécution de la fonction.
- Variable globale : créée dans le programme principal, accessible partout.
- Lorsqu’une fonction est appelée :
- Un cadre local est créé pour ses variables locales.
- Les variables globales restent accessibles mais ne sont pas modifiées sauf déclaration explicite.
- À la fin de la fonction, le cadre local est détruit, les variables locales disparaissent.
7. Principe DRY (Don’t Repeat Yourself)
- Les fonctions évitent la duplication de code, facilitant la maintenance et la correction.
- Exemple : corriger une formule dans une fonction unique évite de modifier plusieurs fois le même code.
- Favorise la modularité et la clarté du programme.
8. Exercices types (à pratiquer)
- Carré et factorielle : définir
carre(x)etcalc_factorielle(n). - Puissance : fonction
calc_puissance(x, y)renvoyant . - Pyramide : fonction
gen_pyramide(N)renvoyant une chaîne représentant une pyramide de N lignes. - Nombres premiers : fonction
est_premier(n)renvoyantTruesi n est premier. - Séquence complémentaire ADN : fonction
seq_comp(liste)renvoyant la séquence complémentaire. - Distance 3D : fonction
calc_distance_3D()calculant la distance euclidienne entre deux points. - Distribution et statistiques : générer des listes aléatoires et calculer min, max, moyenne.
- Distance à l’origine 2D : fonction
calc_dist2ori()calculant la distance entre points et origine.
Le site Python Tutor est recommandé pour visualiser l’exécution des fonctions et comprendre la portée des variables.
Plus sur les chaînes de caractères
1. Chaînes de caractères et listes
- Une chaîne de caractères est une séquence immuable de caractères, similaire à une liste mais non modifiable.
- On peut accéder aux caractères par indice et utiliser la notation par tranches :
extrait une sous-chaîne de l'indice à avec un pas . - Tentative de modification d’un caractère provoque une erreur TypeError.
2. Caractères spéciaux
- Les caractères spéciaux s’écrivent avec un backslash :
\n: saut de ligne\t: tabulation\'ou\": guillemets simples ou doubles échappés
- Les guillemets triples
"""..."""permettent d’écrire des chaînes sur plusieurs lignes en conservant le formatage. - Les caractères spéciaux sont interprétés uniquement avec la fonction
print().
3. Préfixes de chaîne de caractères (string prefixes)
| Préfixe | Description | Exemple | Effet |
|---|---|---|---|
r | Raw string (chaîne brute) | r"ligne\nautre" | Ne pas interpréter les caractères spéciaux (\n reste littéral) |
f | Formatted string (f-string) | f"valeur = {var}" | Interprète les expressions entre {} et les caractères spéciaux (\n) |
- Le préfixe doit être collé à la chaîne, sans espace.
- Les f-strings permettent d’insérer des variables directement dans la chaîne.
4. Méthodes courantes des chaînes de caractères
| Méthode | Description | Exemple | Résultat |
|---|---|---|---|
.upper() | Convertit en majuscules | "abc".upper() | "ABC" |
.lower() | Convertit en minuscules | "ABC".lower() | "abc" |
.capitalize() | Met la première lettre en majuscule | "abc".capitalize() | "Abc" |
.split(sep=None, maxsplit=-1) | Découpe la chaîne en liste selon séparateur (par défaut espaces blancs) | "a b c".split() | ['a', 'b', 'c'] |
.find(sub) | Cherche la première occurrence de sub | "abcabc".find("b") | 1 (indice) ou -1 si absent |
.replace(old, new) | Remplace old par new | "abc".replace("b", "x") | "axc" |
.count(sub) | Compte le nombre d’occurrences de sub | "abcabc".count("a") | 2 |
.startswith(prefix) | Teste si la chaîne commence par prefix | "abc".startswith("a") | True ou False |
.strip() | Supprime les espaces blancs en début et fin | " abc \n".strip() | "abc" |
.join(iterable) | Concatène une liste de chaînes avec un séparateur | "-".join(["a", "b", "c"]) | "a-b-c" |
.split()découpe une chaîne en champs selon un séparateur, par défaut tout espace blanc (espace, tabulation, saut de ligne).
5. Extraction et conversion de valeurs numériques
- Pour extraire des nombres dans une chaîne, on utilise
.split()puis conversion avecfloat()ouint():nb1, nb2, _ = chaine.split() somme = float(nb1) + float(nb2) - La fonction
map()permet d’appliquer une fonction à tous les éléments d’un itérable :list(map(int, "1 2 3".split())) # [1, 2, 3]
6. Test d’appartenance
- L’opérateur
inteste si une chaîne est contenue dans une autre :"abc" in "abcdef" # True not inteste l’absence.
7. Conversion liste → chaîne
- La méthode
.join()convertit une liste de chaînes en une seule chaîne, avec un séparateur :"-".join(["a", "b", "c"]) # "a-b-c" - Tous les éléments doivent être des chaînes, sinon
TypeError.
8. Method chaining (chaînage de méthodes)
- On peut enchaîner plusieurs méthodes sur une chaîne, car elles renvoient une nouvelle chaîne :
message.title().replace("Salut", "Bonjour").split() - Pour plus de lisibilité, on peut découper sur plusieurs lignes avec
\ou parenthèses.
9. Résumé des points clés
| Notion | Rappel essentiel |
|---|---|
| Chaînes immuables | Impossible de modifier un caractère directement |
| Caractères spéciaux | \n, \t, \', \", guillemets triples pour multi-lignes |
Préfixes r et f | r = raw string (pas d’interprétation), f = f-string (interpolation et interprétation) |
| Méthodes utiles | .split(), .join(), .find(), .replace(), .count(), .startswith(), .strip(), .upper(), .lower(), .capitalize() |
| Extraction et conversion | .split() + map() ou conversion explicite (int(), float()) |
| Test d’appartenance | in et not in |
| Method chaining | Enchaînement de méthodes pour écrire du code compact et lisible |
Les chaînes de caractères sont des objets riches en méthodes utiles pour manipuler et analyser du texte efficacement.
Plus sur les listes
1. Méthodes associées aux listes
Les listes en Python possèdent plusieurs méthodes permettant de les manipuler efficacement. Une méthode est une fonction attachée à un objet, appelée avec la syntaxe objet.méthode().
a) .append()
- Ajoute un élément à la fin d’une liste.
- Plus concise et lisible que l’opération
liste = liste + [élément].
b) .insert()
- Insère un élément à un indice donné :
liste.insert(indice, élément).
c) del
- Instruction générale (pas une méthode) pour supprimer un élément à un indice donné :
del liste[indice]. - Ne prend pas de parenthèses.
d) .remove()
- Supprime la première occurrence d’une valeur dans la liste.
- Si plusieurs occurrences, appeler
.remove()autant de fois que nécessaire.
e) .sort()
- Trie la liste en place (modifie la liste directement) du plus petit au plus grand.
- Argument optionnel
reverse=Truepour trier du plus grand au plus petit.
f) sorted()
- Fonction qui renvoie une nouvelle liste triée sans modifier la liste d’origine.
- Accepte aussi l’argument
reverse=True.
g) .reverse()
- Inverse l’ordre des éléments en place.
h) .count()
- Compte le nombre d’occurrences d’un élément dans la liste.
2. Particularités des méthodes associées aux listes
| Méthode | Modifie la liste ? | Renvoie une nouvelle liste ? | Retour de la méthode |
|---|---|---|---|
.append() | Oui | Non | None (modification en place) |
.insert() | Oui | Non | None |
del | Oui | Non | N/A (instruction) |
.remove() | Oui | Non | None |
.sort() | Oui | Non | None |
sorted() | Non | Oui | Nouvelle liste triée |
.reverse() | Oui | Non | None |
.count() | Non | Non | Nombre d’occurrences (entier) |
À retenir : Les méthodes qui modifient la liste le font en place et ne renvoient rien (
None). Il ne faut pas écrirevar = liste.méthode()pour ces méthodes, carvarvaudraNone.
3. Résumé des méthodes clés
| Méthode/fonction | Description | Modifie la liste ? | Retour |
|---|---|---|---|
.append(x) | Ajoute x à la fin | Oui | None |
.insert(i, x) | Insère x à l’indice i | Oui | None |
del liste[i] | Supprime l’élément à l’indice i | Oui | N/A |
.remove(x) | Supprime la 1ère occurrence de x | Oui | None |
.sort() | Trie la liste du plus petit au plus grand | Oui | None |
sorted(liste) | Renvoie une nouvelle liste triée | Non | Nouvelle liste triée |
.reverse() | Inverse la liste | Oui | None |
.count(x) | Compte le nombre d’occurrences de x | Non | Entier |
Exemple d’utilisation :
liste = [3, 1, 2]
liste.append(5) # [3, 1, 2, 5]
liste.insert(1, 10) # [3, 10, 1, 2, 5]
liste.remove(1) # [3, 10, 2, 5]
liste.sort() # [2, 3, 5, 10]
print(liste.count(3)) # 1
liste.reverse() # [10, 5, 3, 2]
Note : Pour connaître le détail d’une méthode, utiliser
help(liste.methode)en Python. Par exemple,.reverse()modifie la liste in place, ce qui signifie qu’elle ne renvoie rien mais modifie directement la liste.
Plus sur les fonctions
1. Appel d’une fonction dans une fonction
- Une fonction peut appeler une autre fonction, ou s’appeler elle-même (fonction récursive).
- Les variables locales d’une fonction restent en mémoire tant que la fonction n’a pas terminé son exécution.
- Exemple compact pour tester si un nombre est pair :
def est_pair(x): return x % 2 == 0
2. Fonctions récursives
- Une fonction récursive s’appelle elle-même pour résoudre un problème par décomposition.
- Exemple : factorielle définie par
avec
Code Python :def calc_factorielle(nb): if nb == 1: return 1 else: return nb * calc_factorielle(nb - 1) - Les appels récursifs forment une pile d’exécution qui se dépile au retour.
3. Portée des variables (scope)
| Type de variable | Visibilité | Modification dans fonction |
|---|---|---|
| Locale | Seulement dans la fonction | Oui, locale uniquement |
| Globale | Dans tout le module et fonctions | Non sans mot-clé global |
| Interne (built-in) | Toujours accessible | Non modifiable |
- Variables locales ne sont pas visibles hors de la fonction.
- Variables globales sont visibles dans le module principal et fonctions, mais ne peuvent pas être modifiées sans
global. - Exemple d’erreur sans
global:def f(): x = x + 1 # Erreur UnboundLocalError
4. Portée des listes et passage par référence
- Les listes sont des objets mutables : passer une liste à une fonction permet de la modifier in place.
- Exemple :
def modifie(l): l[0] = -1 lst = [1, 2, 3] modifie(lst) print(lst) # [-1, 2, 3] - La variable locale dans la fonction et la variable globale pointent vers le même objet liste.
- Pour éviter la modification, passer une copie de la liste :
ma_fonction(liste[:]) # ou list(liste)
5. Règle LGI (Locale, Globale, Interne)
- Lorsqu’une variable est appelée, Python cherche dans l’ordre :
- Locale
- Globale
- Interne (built-in)
- Exemple :
x = -15 def f(): x = 4 print(x) # Affiche 4 (locale prioritaire) f() print(x) # Affiche -15 (globale)
6. Recommandations
- Évitez les variables globales : elles rendent le code difficile à maintenir et à réutiliser.
- Passez les variables explicitement en argument aux fonctions.
- Pour les fonctions modifiant une liste, faites-les retourner la liste modifiée et réaffectez-la :
def ajoute_un(liste): for i in range(len(liste)): liste[i] += 1 return liste liste_notes = [10, 8, 16] liste_notes = ajoute_un(liste_notes) - Indiquez clairement dans la documentation si une fonction modifie une liste in place.
- Décomposez votre programme en fonctions simples, réutilisables et testables.
7. Points clés à retenir
Une fonction peut appeler une autre fonction ou s’appeler elle-même (récursion), les variables locales sont visibles uniquement dans la fonction, les variables globales sont visibles partout mais ne peuvent être modifiées sans
global, et les listes passées en argument sont modifiables dans la fonction sauf si on passe une copie.
Pour éviter les effets de bord, évitez les variables globales et préférez passer explicitement les variables aux fonctions, en retournant les résultats modifiés.
8. Exercices proposés (extraits)
- Créer une fonction récursive calculant la factorielle.
- Tester la portée des variables locales et globales.
- Écrire une fonction qui modifie une liste passée en argument et observer l’effet.
- Utiliser la règle LGI pour comprendre la résolution des noms de variables.
Conteneurs
1. Généralités sur les conteneurs
- Conteneur : objet Python contenant une collection d’objets (ex. listes, chaînes, dictionnaires, tuples, range).
- Tous les conteneurs supportent :
- Le test d’appartenance avec
in. - La fonction
len()pour la taille.
- Le test d’appartenance avec
- Propriétés générales :
- Ordonné : éléments dans un ordre précis.
- Indexable : accès par indice ou tranche.
- Itérable : on peut faire une boucle dessus.
- Objet séquentiel (séquence) : conteneur itérable, ordonné et indexable (listes, chaînes, range, tuples).
- Mutabilité :
- Modifiable : listes, dictionnaires.
- Non modifiable (immuable) : chaînes, tuples, range, entiers, floats, booléens.
- Identifiant : entier unique constant pendant la vie de l’objet, accessible via
id(). - Exemple d’immutabilité : réaffecter une variable crée un nouvel objet avec un nouvel identifiant.
- Hachabilité : un objet est hachable s’il a une valeur de hachage via
hash().- Liée à l’immutabilité.
- Objets hachables : chaînes, entiers, floats, booléens, range, tuples (si éléments hachables), frozensets.
- Objets non hachables : listes, sets, dictionnaires.
2. Conteneurs de type range
- Ordonnés, indexables, itérables, hachables, non modifiables.
- Exemple :
range(3)→ éléments 0,1,2. - Modification d’un élément provoque une erreur.
3. Dictionnaires : propriétés avancées
- Clés doivent être hachables (ex. chaînes, entiers, floats, tuples hachables).
- Accès rapide via valeur de hachage.
- Suppression d’une paire clé/valeur :
del dico[clé]. - Tri par clés :
sorted(dico)trie les clés. - Tri par valeurs :
sorted(dico, key=dico.get)trie les clés selon valeurs. min(dico, key=dico.get)etmax(dico, key=dico.get)donnent la clé associée à la valeur minimale/maximale.- Fonction
dict()convertit un séquence d’objets séquentiels de deux éléments en dictionnaire. - Combinaison puissante :
dict(zip(liste_clés, liste_valeurs)).
4. Tuples
- Séquences immuables, itérables, ordonnées, indexables.
- Immutabilité : modification d’un élément provoque une erreur.
- Pour modifier, il faut créer un nouveau tuple.
- Affectation multiple possible :
x, y = ma_fonction(). - Utilisation de
_pour ignorer certaines valeurs lors d’une affectation multiple. - Tuples contenant des listes sont modifiables via les listes internes (car listes sont mutables), mais le tuple reste immuable (pas de changement d’identifiant).
- Tuples sont hachables seulement si tous leurs éléments sont hachables.
- Fonction
tuple()convertit un objet itérable en tuple.
5. Sets et frozensets
| Propriété | set | frozenset |
|---|---|---|
| Modifiable | Oui | Non |
| Hachable | Non | Oui |
| Ordonné | Non | Non |
| Indexable | Non | Non |
| Contient éléments uniques | Oui | Oui |
set: conteneur modifiable, non ordonné, non indexable, éléments uniques.- Création :
{4,5,5,12}→{4,5,12}. - Contient uniquement objets hachables.
- Méthodes principales :
.add(elem)ajoute un élément (pas de doublons)..discard(elem)supprime un élément sans erreur si absent.
- Opérations ensemblistes :
- Union :
set1 | set2ouset1.union(set2). - Intersection :
set1 & set2ouset1.intersection(set2). - Différence :
set1.difference(set2).
- Union :
- Utilité : éliminer doublons, compter occurrences, opérations ensemblistes.
frozenset: version immuable et hachable deset.- Pas de méthodes de modification.
- Possède méthodes d’union, intersection, etc.
6. Récapitulatif des propriétés des conteneurs
| Conteneur | in et len() | Itérable | Ordonné | Indexable | Modifiable | Hachable |
|---|---|---|---|---|---|---|
| Liste | Oui | Oui | Oui | Oui | Oui | Non |
| Chaîne | Oui | Oui | Oui | Oui | Non | Oui |
| Range | Oui | Oui | Oui | Oui | Non | Oui |
| Tuple | Oui | Oui | Oui | Oui | Non | Oui* |
| Dictionnaire | Oui | Oui (clés) | Oui* | Non | Oui | Non |
| Set | Oui | Oui | Non | Non | Oui | Non |
| Frozenset | Oui | Oui | Non | Non | Non | Oui |
| Entier | Non | Non | Non | Non | Non | Oui |
| Float | Non | Non | Non | Non | Non | Oui |
| Booléen | Non | Non | Non | Non | Non | Oui |
*Tuple hachable uniquement si tous ses éléments sont hachables.
7. Copie de conteneurs
- Copie par référence pour listes, dictionnaires, sets (modification d’une copie modifie l’original).
- Chaînes de caractères sont une exception (immutables).
- Attention lors de la copie pour éviter effets de bord.
8. Compréhensions
- Dictionnaires de compréhension :
{clé: val*2 for clé, val in dico.items()}. - Sets de compréhension :
{i**2 for i in range(10)}. - Permettent de créer rapidement des conteneurs à partir d’itérables.
9. Module collections
- Contient des conteneurs avancés :
OrderedDict: dictionnaire ordonné (avant Python 3.7).defaultdict: dictionnaire avec valeur par défaut pour clés absentes.Counter: compteur d’éléments d’un itérable, se comporte comme dictionnaire avec valeur 0 pour clés absentes.namedtuple: tuple nommé (voir chapitre 24).
Un objet Python est un conteneur si il contient une collection d’objets et supporte
inetlen(). Les conteneurs peuvent être ordonnés, indexables, itérables, modifiables ou non, et hachables ou non. Les propriétés clés à retenir sont la mutabilité et la hachabilité, qui conditionnent leur usage dans les dictionnaires et sets.
Création de modules
1. Pourquoi créer ses propres modules ?
- Un module regroupe un ensemble de fonctions (et constantes) réutilisables dans plusieurs programmes.
- Permet d’éviter la duplication de code et facilite la maintenance.
- Les modules sont souvent thématiques (ex : analyse de séquences biologiques, gestion de fichiers).
2. Création d’un module
- Un module Python est un fichier
.pycontenant des fonctions et/ou constantes. - Exemple minimal de module
message.py:
"""Module inutile qui affiche des messages."""
DATE = "2024-01-05"
def bonjour(nom):
"""Dit Bonjour."""
return f"Bonjour {nom}"
def ciao(nom):
"""Dit Ciao."""
return f"Ciao {nom}"
def hello(nom):
"""Dit Hello."""
return f"Hello {nom}"
- Les docstrings (chaînes entre triple guillemets) documentent le module et ses fonctions.
- Par convention, les constantes sont en MAJUSCULES.
3. Utilisation de son propre module
- Le fichier
.pydoit être dans le répertoire courant ou dans un dossier listé dans la variable d’environnement PYTHONPATH. - Pour ajouter un chemin à PYTHONPATH :
| Système | Commande shell |
|---|---|
| Mac OS X/Linux | export PYTHONPATH=$PYTHONPATH:/chemin/vers/mon/super/module |
| Windows (PowerShell) | $env:PYTHONPATH += ";C:\chemin\vers\mon\super\module" |
- Vérification de PYTHONPATH :
| Système | Commande shell |
|---|---|
| Mac OS X/Linux | echo $PYTHONPATH |
| Windows | echo $env:PYTHONPATH |
- Importer le module sans extension
.py:
import message
- Utilisation des fonctions et constantes :
message.hello("Joe") # 'Hello Joe'
message.ciao("Bill") # 'Ciao Bill'
message.bonjour("Monsieur") # 'Bonjour Monsieur'
message.DATE # '2024-01-05'
- Lors du premier import, Python crée un dossier
__pycache__contenant un fichier.pyc(bytecode précompilé).
4. Les docstrings
- Les docstrings sont des chaînes de documentation placées en début de module et de fonction.
- Elles expliquent le rôle du module/fonction et facilitent la compréhension et l’utilisation du code.
- Elles sont accessibles via la fonction
help()ou l’attribut.__doc__.
Créer un module consiste à écrire un fichier
.pyavec des fonctions et constantes, documentées par des docstrings, puis à l’importer pour réutiliser ce code dans plusieurs programmes.
Bonnes pratiques en programmation Python
1. Docstrings et aide intégrée
- Docstrings : chaînes de documentation placées en début de modules, fonctions, classes ou méthodes.
- Permettent d’afficher une aide via la fonction
help(). - Diffèrent des commentaires : docstrings sont destinées aux utilisateurs, commentaires aux développeurs.
- Une bonne docstring de fonction doit contenir :
- Ce que fait la fonction,
- Ses arguments,
- Ce qu’elle renvoie.
2. Visibilité des fonctions dans un module
- Fonctions d’un même module peuvent s’appeler entre elles.
- Fonctions d’un module peuvent appeler celles d’un autre module importé via
import module. - Appel d’une fonction d’un autre module :
module.fonction().
3. Modules vs scripts
- Un module sans programme principal n’exécute rien à l’import.
- Pour qu’un script puisse être utilisé comme module ou script, utiliser la condition :
if __name__ == "__main__":
# code exécuté seulement si script lancé directement
4. PEP et code pythonique
- PEP (Python Enhancement Proposal) : propositions d’amélioration du langage et recommandations.
- PEP 8 : guide de style incontournable pour écrire un code Python lisible.
- Code pythonique : code respectant les règles et usages recommandés par la communauté Python.
PEP 8 : bonnes pratiques de syntaxe
| Aspect | Recommandation principale | Exemple recommandé | Exemple non recommandé |
|---|---|---|---|
| Indentation | 4 espaces par niveau d’indentation | def f():\n pass | Utiliser tabulations ou autre |
| Importation | Importer modules avec import module (pas from module import *) | import math | from math import * |
| Nommage | Variables/fonctions : snake_case<br>Constantes : MAJUSCULES<br>Classes/exceptions : CamelCase | ma_variable, MA_CONSTANTE, MaClasse | maVariable, ma-constante |
| Espaces | Espaces autour des opérateurs (+, ==, etc.)<br>Pas d’espace à l’intérieur de (), [], {}<br>Pas d’espace avant ( ou [ | a = b + c<br>f(x)<br>lst[0] | a=b+c<br>f (x)<br>lst [0] |
| Longueur de ligne | Max 79 caractères (Black autorise 88) | Utiliser \ ou parenthèses pour couper | Ligne trop longue sans retour |
| Lignes vides | 2 lignes vides avant une fonction ou classe, 1 avant une méthode | ||
| Commentaires | Commencer par # , phrases complètes, en anglais recommandé | # This is a comment. | #comment ou commentaires sur la même ligne |
Docstrings et PEP 257
- Utiliser des docstrings pour modules, fonctions, classes, méthodes.
- Docstring courte : une ligne terminée par un point.
- Docstring longue : résumé en première ligne, ligne vide, puis détails.
- Utiliser triple guillemets doubles
"""(recommandé). - Exemple docstring NumPy style :
def multiplie_nombres(nombre1, nombre2):
"""
Multiplication de deux nombres entiers.
Parameters
----------
nombre1 : int
Premier nombre entier.
nombre2 : int
Second nombre entier.
Returns
-------
int
Produit des deux nombres.
"""
return nombre1 * nombre2
Outils de contrôle qualité
| Outil | But principal | Installation (Miniconda) |
|---|---|---|
pycodestyle | Vérifie conformité PEP 8 (style) | conda install -c conda-forge pycodestyle |
pydocstyle | Vérifie conformité PEP 257 (docstrings) | conda install -c conda-forge pydocstyle |
pylint | Analyse complète (style, erreurs, qualité) | conda install -c conda-forge pylint |
- Ces outils détectent erreurs de style, espaces manquants, noms non conformes, imports inutilisés, etc.
pylintdonne une note globale et des suggestions d’amélioration.
Formatage automatique avec Black
blackformate automatiquement le code selon PEP 8.- Installation :
conda install -c conda-forge black - Usage :
black nom_du_script.py - Par défaut, autorise lignes jusqu’à 88 caractères (option
--line-length 79pour stricte PEP 8). - Ne vérifie pas docstrings ni qualité logique, à combiner avec
pydocstyleetpylint.
Organisation recommandée d’un script Python
- Docstring générale décrivant le script.
- Métadonnées (
__authors__,__version__, etc.). - Importations (interne, externe, local), un module par ligne.
- Constantes en majuscules.
- Fonctions (2 lignes vides avant chaque définition).
- Programme principal sous condition
if __name__ == "__main__":.
Conseils pour concevoir un script
- Planifier avant de coder (papier, schémas).
- Découper en fonctions testables.
- Documenter et commenter le code, surtout les parties complexes.
- Utiliser des noms de variables explicites.
- Documenter les structures de données complexes.
- Utiliser des classes pour des entités cohérentes.
- Tester sur petits jeux de données.
- Lire attentivement les messages d’erreur.
- Faire relire et tester par d’autres.
- Rédiger une documentation claire, préciser une licence, et envisager les tests unitaires.
1. Pour finir : la PEP 20 (Zen of Python)
- Accessible via
import this. - Principes clés :
- Beautiful is better than ugly.
- Explicit is better than implicit.
- Simple is better than complex.
- Readability counts.
- There should be one—and preferably only one—obvious way to do it.
- Namespaces are one honking great idea—let's do more of those!
À retenir : Le code Python doit être lisible, explicite, simple et organisé selon les conventions de la communauté pour faciliter sa maintenance et sa compréhension.
Expressions régulières et parsing
1. Expressions régulières (regex) : définition et syntaxe
- Expression régulière : suite de caractères décrivant un fragment de texte, appelée aussi motif ou pattern.
- Composée de :
- Caractères normaux (ex. lettres, chiffres)
- Métacaractères (ex.
^,$,.,*,+,?,{n,m},|,[],\), qui ont une signification spéciale.
| Métacaractère | Signification | Exemple | Correspondance |
|---|---|---|---|
^ | Début de ligne ou chaîne | ^ATG | Trouvé dans ATGCGT mais pas CCATGTT |
$ | Fin de ligne ou chaîne | ATG$ | Trouvé dans TGCATG mais pas CCATGTT |
. | N'importe quel caractère (1 seul) | A.G | Trouvé dans ATG, A-G, A G |
[ABC] | Un caractère parmi A, B ou C | T[ABC]G | Trouvé dans TAG, TBG, TCG |
[A-Z] | Lettre majuscule | C[A-Z]T | CAT, CBT, CCT |
[a-z] | Lettre minuscule | ||
[0-9] | Chiffre | ||
[A-Za-z0-9] | Caractère alphanumérique | ||
[^AB] | Tout sauf A ou B | CG[^AB]T | Trouvé dans CG9T, pas dans CGAT |
\ | Caractère d’échappement | \+ | Cherche le caractère + littéral |
* | 0 à n fois le précédent | A(CG)*T | AT, ACGT, ACGCGT |
+ | 1 à n fois le précédent | A(CG)+T | ACGT, ACGCGT mais pas AT |
? | 0 ou 1 fois le précédent | A(CG)?T | AT ou ACGT |
{n} | Exactement n fois | A(CG){2}T | ACGCGT mais pas ACGT |
{n,m} | Entre n et m fois | A(C){2,4}T | ACCT, ACCCT, ACCCCT |
{n,} | Au moins n fois | A(C){2,}T | ACCT, ACCCT, ACCCCT |
{,m} | Au plus m fois | A(C){,2}T | AT, ACT, ACCT |
| `(CG | TT)` | CG ou TT | `A(CG |
Caractères spéciaux raccourcis :
| Métacaractère | Signification | Équivalent |
|---|---|---|
\d | Chiffre | [0-9] |
\w | Alphanumérique + underscore | [0-9A-Za-z_] |
\s | Espace blanc (tab, saut de ligne, etc.) | [ \t\n\r\f] |
Les métacaractères
+et*sont avides (greedy) : ils capturent le maximum possible.
2. Le module re en Python
a) Fonction search(motif, chaine)
- Recherche la première occurrence du motif regex dans la chaîne.
- Renvoie un objet
SRE_Matchsi trouvé, sinonNone. - Exemple :
import re
re.search("tigre", "girafe tigre singe") # objet SRE_Match
b) Fonctions match() et fullmatch()
| Fonction | Correspondance requise |
|---|---|
match() | Début de chaîne uniquement |
fullmatch() | Correspondance exacte sur toute la chaîne |
Exemple :
re.match("tigre", "tigre singe") # match
re.fullmatch("tigre", "tigre") # fullmatch
Pour simuler
match()avecsearch(), utilisez^en début de motif. Pourfullmatch(), utilisez^motif$.
c) Compilation d'expressions régulières
re.compile(motif)crée un objet regex compilé, plus efficace pour réutilisation.- Utilisation :
regex = re.compile("^tigre"), puisregex.search(chaine).
d) Groupes dans les regex
- Parenthèses
()créent des groupes capturés. - Exemple :
([0-9]+)\.([0-9]+)capture un nombre décimal. - Méthodes sur l'objet
SRE_Match:.group(0): correspondance complète.group(1),.group(2), ... : groupes capturés.start(),.end(): indices de début et fin de la correspondance
e) Méthode findall()
- Renvoie une liste de toutes les correspondances dans la chaîne.
- Si groupes capturés, renvoie une liste de tuples.
- Exemple :
regex = re.compile("([0-9]+)\.([0-9]+)")
regex.findall("pi vaut 3.14 et e vaut 2.72") # [('3', '14'), ('2', '72')]
f) Méthode sub()
- Remplace toutes les occurrences du motif dans une chaîne par une autre chaîne.
- Syntaxe :
regex.sub(remplacement, chaine, count=n)(optionnelcountlimite le nombre de remplacements). - Utilisation des groupes capturés dans la chaîne de remplacement avec
\\1,\\2, etc. - Exemple :
regex = re.compile("([0-9]+)\.([0-9]+)")
regex.sub("approximativement \\1", "pi vaut 3.14 et e vaut 2.72")
# 'pi vaut approximativement 3 et e vaut approximativement 2'
En Python, il faut doubler le backslash
\\pour référencer un groupe capturé dans la chaîne de remplacement.
3. Vocabulaire utile
- Matcher (to match) : dire qu'une regex "fonctionne" sur une chaîne, c'est qu'elle correspond ou est retrouvée.
- Parsing : analyse syntaxique, extraction d'informations dans des fichiers via regex.
4. Ressources en ligne recommandées
- RegexOne : tutoriel interactif
- RegExr et ExtendsClass : visualisation des correspondances
- pythex.org : testeur simple dédié à Python
- Regular-Expressions.info : documentation exhaustive
À retenir : Les expressions régulières sont un outil puissant pour extraire et manipuler du texte, notamment en bioinformatique pour le parsing de fichiers complexes. Le module
rede Python offre des fonctions essentielles (search,match,fullmatch,compile,findall,sub) pour exploiter ces motifs efficacement.
Jupyter et ses notebooks
1. Notebooks Jupyter
- Notebooks Jupyter : documents interactifs combinant texte (Markdown), images, formules, tableaux, graphiques et code exécutable.
- Supportent près de 40 langages, initialement Julia, Python, R.
- Cellule : unité de base, contient soit du texte Markdown, soit du code exécutable.
2. Installation
- Avec Miniconda :
conda install -c conda-forge -y jupyterlab - Installe JupyterLab, un environnement complet.
3. JupyterLab
- Interface web accessible via la commande :
jupyter lab - Offre un navigateur de fichiers, un lanceur d’outils (notebooks, terminaux, éditeurs).
- Permet d’organiser plusieurs documents et terminaux dans une même interface.
4. Création et utilisation d’un notebook
- Créer un notebook via le bouton Python 3 dans le Launcher.
- Renommer le notebook en cliquant sur Untitled.ipynb.
- Extension des fichiers : .ipynb.
- Exécution d’une cellule :
- Menu Run > Run Selected Cells
- Bouton ▶️
- Raccourci Ctrl + Entrée
- Numérotation à gauche indique l’ordre d’exécution (ex :
[1]). - Ajouter une cellule :
- Bouton +
- Icône dans la cellule
- Raccourci Alt + Entrée (exécute et crée une nouvelle cellule)
- Variables et fonctions définies dans une cellule sont accessibles dans les suivantes.
- Recommandation : redémarrer et exécuter toutes les cellules régulièrement via
Kernel > Restart Kernel and Run All Cellspour éviter les confusions d’état.
5. Format Markdown dans les cellules
- Permet d’écrire du texte formaté (titres, gras, italique, liens, images, formules).
- Passer une cellule en mode Markdown via le menu déroulant (par défaut Code).
- Markdown est simple et rapide pour structurer du texte.
- Exemple d’usage : rédaction de cours, documentation.
6. Graphiques dans les notebooks
- Intégration facile de graphiques avec la bibliothèque matplotlib.
%matplotlib inlinepermet d’afficher les graphiques dans le notebook (souvent automatique dans les versions récentes).
7. Magic commands
- Commandes spéciales commençant par
%(ligne) ou%%(cellule) pour fonctionnalités avancées.
| Commande | Description | Exemple d’usage |
|---|---|---|
%whos | Liste tous les objets (variables, fonctions…) | Affiche variables et types en mémoire |
%history | Affiche l’historique des commandes exécutées | Voir commandes précédentes |
%%time | Mesure le temps d’exécution d’une cellule | Tester performance d’un code |
%%timeit | Mesure le temps moyen d’exécution (plus fiable) | Exécute plusieurs fois pour moyenne |
- Exemple :
%%timeit for x in liste: pass
8. Lancement de commandes Unix
- Préfixer une commande par
!pour l’exécuter dans le shell depuis un notebook. - Exemple :
affiche le contenu du répertoire courant.!ls
À retenir : Un notebook Jupyter combine code, texte et graphiques dans un environnement interactif, facilitant l’analyse de données et la documentation. Les magic commands et le lancement de commandes Unix enrichissent son usage.
Module Biopython
1. Installation et chargement de Biopython
- Biopython n’est pas inclus dans Python de base.
- Installation recommandée avec Miniconda :
$ conda install -c conda-forge biopython - Chargement du module :
import Bio
Attention : le nom du module est Bio (avec un B majuscule).
2. Manipulation de séquences avec Biopython
- Import de la classe Seq :
from Bio.Seq import Seq - Création d’une séquence ADN :
ADN = Seq("ATATCGGCTATAGCATGC")(type Seq) - Opérations sur séquences ADN :
| Méthode | Résultat | Description |
|---|---|---|
ADN.complement() | Séquence complémentaire | Remplace A↔T, C↔G |
ADN.reverse_complement() | Séquence complémentaire inverse | Complément puis inversion |
ADN.translate() | Séquence protéique traduite | Traduction selon le code génétique |
3. Interrogation de la base PubMed avec Biopython
- Sous-module utilisé :
Bio.Entrez - Obligatoire : définir l’email utilisateur
Entrez.email = "votremail@provider.fr" - Recherche d’articles (exemple "transferrin") :
req = Entrez.esearch(db="pubmed", term="transferrin") res = Entrez.read(req) - Résultat
rescontient plusieurs clés importantes :
| Clé | Description |
|---|---|
Count | Nombre total d’articles correspondant |
RetMax | Nombre d’articles retournés (par défaut 20) |
IdList | Liste des identifiants PubMed (PMID) |
- Pour augmenter le nombre d’articles retournés, utiliser
retmaxdansesearch.
4. Récupération des métadonnées d’un article PubMed
- Exemple avec PMID = "22294463" :
req_sum = Entrez.esummary(db="pubmed", id="22294463") res_sum = Entrez.read(req_sum) res_sum[0]est un dictionnaire avec clés utiles :
| Clé | Contenu |
|---|---|
Title | Titre de l’article |
DOI | DOI de l’article |
PubDate | Date de publication |
Source | Journal de publication |
5. Récupération du résumé d’un article PubMed
- Utilisation de
Entrez.efetch():req_fetch = Entrez.efetch(db="pubmed", id="22294463", rettype="abstract", retmode="text") print(req_fetch.read()) - Le résumé est renvoyé en texte brut, avec
\npour les retours à la ligne.
6. Exercices clés
a) Calcul du pourcentage de GC dans des séquences FASTA
- Pourcentage GC d’une séquence :
- Stocker les résultats dans un dictionnaire : clés = identifiants des gènes, valeurs = pourcentage GC.
- Afficher :
- Nombre total de gènes
- Identifiant et valeur du gène avec le plus haut %GC
- Identifiant et valeur du gène avec le plus bas %GC
b) Analyse bibliographique sur PubMed avec Biopython
- Requête simple : compter les articles sur "barstar" avec
Entrez.esearch(). - Récupération d’un article précis (ex : PMID 29701945) avec
Entrez.esummary(): afficher titre, DOI, journal, date. - Récupération du résumé avec
Entrez.efetch(). - Distribution des années de publication :
- Récupérer tous les PMIDs avec
retmaxaugmenté. - Pour chaque PMID, récupérer la date de publication avec
Entrez.esummary(). - Extraire l’année et compter le nombre d’articles par année dans un dictionnaire.
- Trier les années et préparer deux listes : années (x), nombre d’articles (y).
- Récupérer tous les PMIDs avec
- Visualisation avec matplotlib :
import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.bar(x, y) ax.set_xlabel("Années") ax.set_ylabel("Nombre de publications") ax.set_title("Distribution des publications mentionnant la barstar") fig.savefig("distribution_barstar_annee.png")
À retenir : Biopython permet de manipuler facilement des séquences biologiques et d’interroger des bases de données comme PubMed, facilitant ainsi l’analyse bioinformatique et bibliographique automatisée.
Module NumPy
1. Installation et chargement
- Installation via Miniconda :
conda install -c conda-forge numpy - Chargement du module :
import numpy as np
2. Objets array
- Un
arrayest un tableau multidimensionnel homogène (mêmes types d’éléments). - Création :
np.array([1, 2, 3]) # à partir d’une liste, tuple ou range - Conversion automatique des types :
- mélange int et float → float
- mélange int et str → str
- Fonction
arange(): similaire àrange()mais retourne unarrayet accepte float.
Exemple :np.arange(10) # array([0, 1, ..., 9]) np.arange(10.0) # array([0., 1., ..., 9.]) np.arange(10, 0, -1) # array([10, 9, ..., 1])
3. Dimensions et attributs
| Attribut | Description | Exemple | Résultat |
|---|---|---|---|
.ndim | Nombre de dimensions | v.ndim | 1 (vecteur) |
.shape | Dimensions (tuple) | w.shape | (3, 2) (matrice) |
.size | Nombre total d’éléments | w.size | 6 |
- Un
array1D = vecteur, 2D = matrice, nD = tenseur.
4. Redimensionnement
- Méthode
.reshape(new_shape): retourne un nouvel array avec la forme demandée, compatible en nombre d’éléments. - Méthode
.resize(new_shape, refcheck=False): modifie en place, ajoute des zéros ou tronque si nécessaire. - Fonction
np.resize(array, new_shape): retourne un nouvel array, répète les données si besoin.
5. Affichage
- Affichage direct dans Jupyter montre
array([...])avec crochets et virgules. - Avec
print(), les crochets et virgules disparaissent, ce qui peut prêter à confusion avec les listes.
6. Opérations vectorielles élément par élément
- Les opérations sur
arrays’appliquent élément par élément :v = np.arange(4) # array([0,1,2,3]) v + 1 # array([1,2,3,4]) v * 2 # array([0,2,4,6]) v * v # array([0,1,4,9]) - Pas besoin de boucles explicites.
7. Indexation et slicing
- Pour un
array1D :a[1] # élément d’indice 1 a[5:] # tranche à partir de l’indice 5 a[::2] # éléments avec pas 2 - Pour un
array2D (matrice) :a[i, :]: ligne ia[:, j]: colonne ja[i, j]: élément ligne i, colonne j
- Si un seul indice est donné sur un 2D, on récupère la ligne correspondante.
8. Copie d’array
- Affectation simple copie par référence :
b = a b[2] = -300 # modifie aussi a - Pour créer une copie indépendante :
b = np.array(a) # copie distincte import copy c = copy.deepcopy(a) # copie profonde
9. Construction automatique de matrices
| Fonction | Description | Exemple | Résultat |
|---|---|---|---|
np.zeros(shape) | Matrice remplie de 0 (float par défaut) | np.zeros((2,3)) | Matrice 2x3 de 0.0 |
np.ones(shape) | Matrice remplie de 1 (float par défaut) | np.ones((3,3)) | Matrice 3x3 de 1.0 |
np.full(shape, val, dtype) | Matrice remplie d’une valeur donnée | np.full((2,3), 7, int) | Matrice 2x3 de 7 (int) |
10. Chargement et sauvegarde de fichiers
- Lecture :
np.loadtxt("fichier.dat")- Fichier texte avec lignes et colonnes numériques homogènes.
- Convertit en
array2D de floats. - Arguments utiles :
delimiter,skiprows,usecols.
- Écriture :
np.savetxt("out.dat", array)- Par défaut écrit en float, notation scientifique.
- Options pour changer format, séparateurs.
11. Concaténation d’arrays
- Pour concaténer des
arrays1D :np.concatenate((a1, a2)) - Pour concaténer des
arrays2D, préciser l’axe :axis=0concatène par lignes (ajoute des lignes)axis=1concatène par colonnes (ajoute des colonnes)
- Exemple :
np.concatenate((a1, a2), axis=0) # concat lignes np.concatenate((a1, a2), axis=1) # concat colonnes
12. Algèbre linéaire
| Fonction / Attribut | Description | Exemple | Résultat |
|---|---|---|---|
.T ou np.transpose() | Transposée d’une matrice | a.T | Matrice transposée |
np.dot(a, b) | Produit matriciel | np.dot(a, a) | Produit matriciel |
a * a | Produit élément par élément | a * a | Multiplication élément par élément |
np.diag(vals) | Matrice diagonale | np.diag((1,2,3)) | Matrice diagonale |
np.linalg.inv(a) | Inverse d’une matrice carrée | np.linalg.inv(a) | Matrice inverse |
np.linalg.det(a) | Déterminant d’une matrice carrée | np.linalg.det(a) | Valeur du déterminant |
np.linalg.eig(a) | Valeurs et vecteurs propres | eigvals, eigvecs = np.linalg.eig(a) | Valeurs propres (1D), vecteurs propres (2D) |
- Tri des valeurs propres par ordre décroissant :
idx = eigvals.argsort()[::-1] eigvals = eigvals[idx] eigvecs = eigvecs[:, idx]
13. Parcours et affectation
- Itération sur les lignes d’un
array2D :for row in a: print(row) # row est un array 1D - Itération sur les colonnes :
for col in a.T: print(col) - Affectation multiple sur lignes :
a1, a2, a3 = a - Affectation multiple sur colonnes :
c1, c2, c3 = a.T
14. Masques booléens
- Un masque booléen est un
arrayde booléens utilisé pour sélectionner/modifier des éléments d’unarray. - Création d’un
arraybooléen par comparaison :mask = (a > 5) - Sélection d’éléments :
a[a > 5] # renvoie un array 1D des éléments > 5 - Modification conditionnelle :
a[a > 5] = -1 - Combinaison de conditions avec
&(ET) et|(OU) :a[(a > 3) & (a % 2 == 0)] = 0 - Attention :
- Utiliser des parenthèses autour de chaque condition.
&et|s’appliquent aux arrays, pasand/or.
15. Conseils d’utilisation
| Utiliser NumPy pour : | Utiliser les listes pour : |
|---|---|
| Opérations vectorielles élément par élément | Conteneurs hétérogènes ou accumulation dynamique |
| Manipulation de vecteurs, matrices, algèbre linéaire | Accumuler des valeurs dans une boucle avec .append() |
| Données numériques homogènes | Cas où les fonctions NumPy de lecture ne conviennent pas |
- Documenter soigneusement les
arrays(contenu, dimension). - Utiliser
np.concatenate()pour concaténer de grosarrays, pas pour ajouter ligne par ligne.
À retenir : Le module NumPy est la base du calcul scientifique en Python, offrant des structures et opérations optimisées pour les données numériques multidimensionnelles.
Module Matplotlib
Le module matplotlib permet de générer des graphiques en Python, utile pour l’analyse de données en complément de NumPy, scipy ou pandas.
1. Installation et import
- Installation via conda (Miniconda) :
conda install -c conda-forge matplotlib - Import standard :
On importe le sous-module pyplot avec l’alias plt (convention).import matplotlib.pyplot as plt
2. Représentation en nuage de points (scatter plot)
Données fictives : concentration (mg/L) en fonction du temps (h).
| Temps (h) | Concentration (mg/L) |
|---|---|
| 1 | 5.5 |
| 2 | 7.2 |
| 3 | 11.8 |
| 4 | 13.6 |
| 6 | 19.1 |
| 7 | 21.7 |
| 9 | 29.4 |
Code essentiel :
fig, ax = plt.subplots() # création figure et axe
ax.scatter(temps, concentration, marker="o", color="blue") # nuage de points
ax.set_xlabel("Temps (h)") # légende axe x
ax.set_ylabel("Concentration (mg/L)") # légende axe y
ax.set_title("Concentration de produit en fonction du temps") # titre
plt.show() # affichage graphique
.scatter(x, y, marker, color): trace un nuage de points..set_xlabel(),.set_ylabel(),.set_title(): ajout de labels et titre.plt.show(): affiche le graphique (indispensable hors notebook Jupyter).
3. Structure du graphique avec matplotlib
| Étape | Description |
|---|---|
fig, ax = plt.subplots() | Crée une figure et un axe (zone de tracé) |
ax.scatter() | Trace un nuage de points |
ax.set_xlabel(), ax.set_ylabel() | Définit les légendes des axes |
ax.set_title() | Définit le titre du graphique |
plt.show() | Affiche le graphique |
À retenir : Le sous-module pyplot de matplotlib, importé sous l’alias plt, est la base pour créer et personnaliser des graphiques en Python.
Module Pandas
1. Installation et importation
- pandas : module pour l’analyse et manipulation de données tabulaires.
- Installation via conda :
$ conda install -c conda-forge pandas - Import conventionnel :
import pandas as pd
2. Series
- Objet 1D indexé, similaire à un vecteur avec étiquettes.
- Création :
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd']) - Accès par étiquette :
s["a"] - Accès par position :
s.iloc[0] - Sélection multiple :
s[["b", "d"]]ous.iloc[[1, 3]] - Modification/ajout :
s["c"] = 300,s["z"] = 50 - Filtrage avec conditions booléennes :
s[s > 30], combinaisons avec&(ET),|(OU)
3. Dataframes
- Tableau 2D avec étiquettes pour lignes et colonnes.
- Création à partir de liste de lignes :
df = pd.DataFrame(columns=["a", "b", "c", "d"], index=["chat", "singe", "souris"], data=[np.arange(10,14), np.arange(20,24), np.arange(30,34)]) - Création à partir d’un dictionnaire de colonnes :
data = {"a": np.arange(10,40,10), "b": np.arange(11,40,10), "c": np.arange(12,40,10), "d": np.arange(13,40,10)} df = pd.DataFrame(data) df.index = ["chat", "singe", "souris"] - Propriétés clés :
df.shape: dimensions (lignes, colonnes)df.columns: noms des colonnes (modifiable)df.head(n): premières lignes (par défaut 5)
4. Sélections dans Dataframes
| Type de sélection | Syntaxe | Résultat |
|---|---|---|
| Colonne unique | df["Lyon"] | Series |
| Colonnes multiples | df[["Lyon", "Pau"]] | DataFrame |
| Ligne par étiquette | df.loc["singe"] | Series |
| Lignes multiples | df.loc[["singe", "chat"]] | DataFrame |
| Ligne par position | df.iloc[1] | Series |
| Lignes par tranche | df.iloc[0:2] | DataFrame |
| Cellule spécifique | df.loc["souris", "Pau"] | Valeur |
| Sélection conditionnelle | df[df["Pau"] > 15] | DataFrame filtré |
| Combinaison conditions | df[(df["Pau"] > 15) & (df["Lyon"] > 25)] | DataFrame filtré |
5. Combinaison de Dataframes
pd.concat([df1, df2], axis=1): concatène horizontalement en alignant sur les index.join="inner": conserve uniquement les index communs.- Valeurs manquantes indiquées par
NaN.
6. Opérations vectorielles
- Éviter les boucles sur les lignes (
.iterrows()) pour modifier un DataFrame, car lent. - Privilégier les opérations sur colonnes entières :
df["d"] = df["a"] * df["b"] + df["c"] - Gain de temps significatif (exemple : 200x plus rapide).
7. Exemple concret : analyse de données kinases
- Chargement CSV :
df = pd.read_csv("kinases.csv", index_col="Entry") - Exploration :
df.shape: (1442, 5)df.dtypes: types des colonnesdf.info(): résumé avec non-null counts et mémoire utilisée
- Recherche valeurs manquantes :
df.isna().sum()
→ ColonnePDBcontient 954 NaN. - Conversion de colonnes en dates :
df["Creation date"] = pd.to_datetime(df["Creation date"]) - Statistiques descriptives :
df.describe()pour colonnes numériques
df["Organism"].value_counts()pour décompte par catégorie - Statistiques par groupe :
df.groupby("Organism")[["Length", "Mass"]].mean()
df.pivot_table(index="Organism", values=["Length", "Mass"], aggfunc=["min", "max"]) - Visualisation :
- Nuage de points masse vs taille :
df.plot(kind="scatter", x="Length", y="Mass") - Régression linéaire avec
scipy.stats.linregresspour modéliser la relation.
- Nuage de points masse vs taille :
- Analyse temporelle :
- Dates min/max par organisme avec
pivot_table - Comptage par année avec
.value_counts().resample("YE").sum() - Tri et affichage des années avec le plus de kinases référencées.
- Dates min/max par organisme avec
- Transformation de colonnes :
- Compter structures 3D dans
PDB(séparées par;) avec fonction personnalisée et.apply() - Tri par nombre de structures 3D.
- Compter structures 3D dans
À retenir : pandas facilite la manipulation, l’analyse et la visualisation de données tabulaires grâce à ses objets Series et Dataframes, ses méthodes de sélection puissantes, ses opérations vectorielles rapides et son intégration avec matplotlib et scipy pour l’analyse statistique.
Avoir la classe avec les objets
1. Programmation orientée objet (POO) : notions clés
- Objet : entité regroupant des attributs (données) et des méthodes (fonctions agissant sur ces données).
- Classe : modèle ou moule servant à créer des objets (instances).
- Instance : objet concret créé à partir d’une classe.
- En Python, tout est objet : les types
int,float,str,list, etc. sont des instances de classes correspondantes.
2. Avantages de la POO
- Encapsulation : chaque objet possède son propre espace de noms, isolant ses attributs et méthodes.
- Réutilisabilité : code plus compact et modulaire.
- Concepts avancés :
- Polymorphisme : redéfinition du comportement des opérateurs ou méthodes selon le type d’objet.
- Héritage : création d’une classe dérivée à partir d’une classe existante, avec ajout ou modification de fonctionnalités.
3. Terminologie essentielle
| Terme | Définition courte |
|---|---|
| Classe | Modèle définissant attributs et méthodes |
| Objet/Instance | Réalisation concrète d’une classe |
| Attribut | Variable propre à un objet |
| Méthode | Fonction liée à un objet |
| Encapsulation | Isolation des données et fonctions dans l’objet |
| Polymorphisme | Comportement variable selon le type d’objet |
| Héritage | Classe dérivée étendant une classe existante |
La POO structure le code en regroupant données et comportements dans des objets, facilitant la maintenance et l’évolution des programmes.
4. Remarque
La maîtrise de la POO demande de la pratique et une bonne compréhension des concepts. Des langages comme UML aident à formaliser la conception orientée objet.
Avoir plus la classe avec les objets
1. Construction d’une classe
- Une classe est un modèle définissant un type d'objet avec ses attributs (données) et ses méthodes (fonctions).
- En Python, une classe se déclare avec le mot-clé
classsuivi du nom de la classe en CamelCase. - La méthode spéciale
__init__(self, ...)est le constructeur qui initialise les attributs lors de la création d’une instance. selfreprésente l’instance courante et permet d’accéder à ses attributs et méthodes.
2. Exemple minimal de classe
class Personne:
def __init__(self, nom, age):
self.nom = nom
self.age = age
- Ici,
Personnea deux attributs :nometage. - Pour créer une instance :
p = Personne("Alice", 30).
3. Concepts clés de la POO
| Concept | Définition | But principal |
|---|---|---|
| Encapsulation | Regrouper données et fonctions dans une même entité (classe). | Protéger les données et organiser le code. |
| Héritage | Une classe peut hériter des attributs et méthodes d’une autre classe (superclasse). | Réutiliser et spécialiser du code. |
| Polymorphisme | Capacité d’utiliser une même interface pour des objets de classes différentes. | Écrire du code générique et flexible. |
| Composition | Une classe contient des objets d’autres classes comme attributs. | Construire des objets complexes à partir d’objets simples. |
4. Bonnes pratiques pour les classes en Python
- Nommer les classes en CamelCase (ex :
MaClasse). - Utiliser
selfcomme premier paramètre des méthodes d’instance. - Préférer des méthodes courtes et claires.
- Documenter les classes et méthodes avec des docstrings.
- Éviter les attributs publics modifiables directement, préférer des méthodes d’accès (getters/setters) si besoin.
- Utiliser l’héritage avec modération pour ne pas complexifier inutilement la hiérarchie.
5. À retenir
Une classe est un plan pour créer des objets, regroupant données et comportements, facilitant la modélisation et la réutilisation du code en programmation orientée objet.
Fenêtres graphiques et Tkinter
1. Fenêtres graphiques et Tkinter
a) Introduction à Tkinter
- Tkinter est le module standard de Python pour créer des interfaces graphiques (GUI).
- Il permet de créer des fenêtres, d’y placer des widgets (boutons, labels, champs de saisie, etc.) et de gérer les interactions utilisateur.
2. Concepts clés de Tkinter
| Élément | Description |
|---|---|
| Tk() | Création de la fenêtre principale (objet racine). |
| Widget | Composant graphique (bouton, label, entrée, etc.) à placer dans la fenêtre. |
| pack() / grid() / place() | Méthodes pour organiser les widgets dans la fenêtre (gestion du positionnement). |
| mainloop() | Boucle principale qui maintient la fenêtre ouverte et gère les événements. |
3. Création d’une fenêtre simple avec Tkinter
import tkinter as tk
fenetre = tk.Tk() # Création de la fenêtre principale
fenetre.title("Ma fenêtre") # Titre de la fenêtre
fenetre.geometry("300x200") # Taille de la fenêtre (largeur x hauteur)
label = tk.Label(fenetre, text="Bonjour Tkinter !") # Création d’un label
label.pack() # Placement du label dans la fenêtre
fenetre.mainloop() # Lancement de la boucle d’événements
- Tk() crée la fenêtre principale.
- Label est un widget affichant du texte.
- pack() place le widget dans la fenêtre.
- mainloop() lance la boucle d’événements, indispensable pour que la fenêtre reste affichée.
4. Gestion des événements
- Les widgets peuvent réagir aux actions utilisateur via des callbacks (fonctions liées à un événement).
- Exemple : bouton qui affiche un message lorsqu’on clique dessus.
def clic_bouton():
print("Bouton cliqué !")
bouton = tk.Button(fenetre, text="Cliquez-moi", command=clic_bouton)
bouton.pack()
- L’argument command du bouton reçoit une fonction à appeler lors du clic.
5. Organisation des widgets
| Méthode | Description | Usage principal |
|---|---|---|
| pack() | Place les widgets les uns sous les autres | Simple, rapide |
| grid() | Organise les widgets en grille (lignes/colonnes) | Plus précis, adapté aux formulaires |
| place() | Positionne les widgets avec coordonnées exactes | Contrôle absolu, plus complexe |
6. Exemple d’une classe Tkinter
- Pour structurer une application Tkinter, on crée souvent une classe qui hérite de
tk.Tkoutk.Frame. - Cela permet d’encapsuler la création des widgets et la gestion des événements.
import tkinter as tk
class Application(tk.Tk):
def __init__(self):
super().__init__()
self.title("Application Tkinter")
self.geometry("300x200")
self.creer_widgets()
def creer_widgets(self):
self.label = tk.Label(self, text="Bonjour !")
self.label.pack()
self.bouton = tk.Button(self, text="Quitter", command=self.destroy)
self.bouton.pack()
if __name__ == "__main__":
app = Application()
app.mainloop()
self.destroyferme la fenêtre.- La méthode
creer_widgetsorganise la création et le placement des widgets.
7. Résumé des bonnes pratiques
- Encapsuler la fenêtre et les widgets dans une classe pour faciliter la maintenance.
- Utiliser
mainloop()pour lancer la boucle d’événements. - Utiliser les méthodes
pack(),grid()ouplace()selon le besoin de positionnement. - Associer les événements utilisateur à des fonctions via l’argument
commandou les bindings d’événements. - Éviter les variables globales en stockant les widgets et données dans la classe.
À retenir : Tkinter permet de créer des interfaces graphiques en Python en combinant une fenêtre principale, des widgets, et une boucle d’événements. La programmation orientée objet facilite la gestion et la modularité des interfaces.
Remarques complémentaires
1. Héritage en Python
- Héritage : une classe fille hérite des propriétés et méthodes d’une classe mère. En Python, l’héritage peut être multiple.
- Syntaxe :
class Fille(Mere1, Mere2): pass - Une instance de la classe fille est aussi une instance de la classe mère :
isinstance(fille, Mere) == True - Redéfinition de méthode (overriding) : si une méthode est définie dans la classe fille avec le même nom que dans la mère, celle de la fille est prioritaire.
- Python ne supporte pas la surcharge de fonction (plusieurs définitions selon le nombre/type d’arguments).
2. Ordre de résolution des noms (MRO)
- Lors d’un appel d’attribut ou méthode, Python cherche dans :
- La classe fille
- La première classe mère et ses ancêtres
- La deuxième classe mère et ses ancêtres
- …
- La classe interne
objectest la classe ancêtre implicite de toutes les classes Python.
3. Composition
- Composition : une classe contient des instances d’autres classes (relation has a).
- Plus flexible que l’héritage car les classes sont faiblement couplées.
- Exemple : une classe
Citroncontient une instance de la classePulpe. - Choix entre héritage (is a) et composition (has a) selon la relation logique entre classes.
4. Attributs de classe vs attributs d’instance
| Attribut de classe | Attribut d’instance |
|---|---|
| Défini dans la classe, commun à toutes les instances | Défini dans __init__, spécifique à chaque instance |
Accessible via instance.attribut | Accessible via instance.attribut |
| Ne peut pas être modifié via une instance (création d’un nouvel attribut d’instance masque l’attribut de classe) | Peut être modifié librement |
Modifiable uniquement via NomClasse.attribut | Modifiable via self.attribut ou instance.attribut |
- Exemple de modification masquée :
citron1.saveur = "sucrée" # crée un attribut d’instance, n’écrase pas l’attribut de classe del citron1.saveur # supprime l’attribut d’instance, revient à l’attribut de classe
5. Contrôle d’accès aux attributs : getters, setters et property
- Python est permissif : on peut accéder/modifier directement les attributs d’instance.
- Getters et setters classiques (méthodes
.get_x(),.set_x()) sont lourds et non pythonique. - Classe
property: permet de garder la syntaxe simpleinstance.attributtout en contrôlant accès, modification et suppression via des méthodes. - Syntaxe classique :
attribut = property(fget=get_attribut, fset=set_attribut, fdel=del_attribut) - Syntaxe pythonique avec décorateurs :
@property def attribut(self): return self._attribut @attribut.setter def attribut(self, valeur): # contrôle self._attribut = valeur @attribut.deleter def attribut(self): del self._attribut - L’attribut réel est stocké dans une variable privée
_attribut(underscore).
6. Attributs publics et non publics
- Python ne possède pas d’attributs privés stricts, mais une convention :
_attribut: non public, à ne pas utiliser en dehors de la classe__attribut: déclenche le name mangling (renommage interne pour éviter conflits en héritage)
- Le name mangling transforme
self.__attributenself._NomClasse__attribut. - Cette convention n’empêche pas l’accès ou la modification, c’est un avertissement aux utilisateurs.
7. Docstrings dans les classes
- Les classes, méthodes et fonctions peuvent contenir des docstrings pour documenter leur usage.
- Accessible via
help(instance)ouinstance.__doc__. - Important pour la maintenance et l’utilisation correcte des classes.
8. Bonnes pratiques pour les classes
- Ne pas utiliser d’attributs de classe modifiables (listes, dictionnaires) car partagés entre instances.
- Initialiser les attributs modifiables dans
__init__(attributs d’instance). - Utiliser
propertyavec parcimonie, uniquement pour contrôler les attributs sensibles. - Documenter clairement les attributs et méthodes avec des docstrings.
- Pour stocker des données simples non modifiables, préférer les
namedtuple. - Pour des conteneurs modifiables avec moins de code, utiliser les
dataclasses(Python 3.7+).
9. namedtuple
- Conteneur immuable avec accès aux éléments par nom :
from collections import namedtuple Citron = namedtuple("Citron", "masse couleur saveur forme") c = Citron(10, "jaune", "acide", "ellipsoide") print(c.masse) # 10 - Immuable : modification impossible, mais on peut créer une nouvelle instance avec
_replace().
10. dataclasses
- Classes simplifiées pour conteneurs modifiables avec génération automatique de
__init__,__repr__, etc.from dataclasses import dataclass, field @dataclass class Citron: humidite: int couleur: str = "jaune" saveur: str = "acide" masse: int = 100 pepins: list = field(default_factory=list) - Permet d’éviter les erreurs liées aux valeurs par défaut mutables.
À retenir :
- L’héritage permet de réutiliser et spécialiser des classes, la composition favorise la flexibilité.
- Les attributs de classe sont partagés, les attributs d’instance sont propres à chaque objet.
- Utilisez
propertypour contrôler l’accès aux attributs tout en gardant une syntaxe simple.- Respectez les conventions d’attributs non publics (
_et__) pour la clarté du code.- Documentez vos classes avec des docstrings pour faciliter leur utilisation et maintenance.
Mini-projets
1. Mini-projets en Python
2. Description des projets
a) Mots anglais dans le protéome humain
-
Objectif : Vérifier si des mots anglais courants apparaissent dans les séquences du protéome humain (ensemble des protéines humaines).
-
Données fournies :
english-common-words.txt: liste des 3 000 mots anglais les plus fréquents, un mot par ligne.human-proteome.fasta: séquences du protéome humain au format FASTA (format texte standard pour séquences biologiques).
-
Remarques :
- Le fichier FASTA est volumineux.
- Le fichier provient de la base UniProt.
- Le format FASTA contient des séquences d'acides aminés précédées d'une ligne d'en-tête commençant par
>.
-
Conseil : Se référer aux explications sur le format FASTA et aux exemples de code fournis pour manipuler ces fichiers efficacement.
À retenir : Ce projet permet de manipuler des fichiers texte volumineux, d'extraire et de comparer des chaînes de caractères, tout en s'initiant à la bioinformatique avec Python.
Quelques formats de données en biologie
1. Formats de données en biologie essentiels
a) Format FASTA
-
Usage : Stockage de séquences d’ADN, ARN ou protéines.
-
Structure :
- Première ligne : commence par
>suivie d’une description (ligne d’en-tête). - Lignes suivantes : séquence répartie sur plusieurs lignes (max 60-80 caractères par ligne).
- Première ligne : commence par
-
Multifasta : fichier contenant plusieurs séquences FASTA successives.
-
Extensions courantes :
.fasta,.fas,.fna,.faa,.seq. -
Exemple :
>sp|P01308|INS_HUMAN Insulin OS=Homo sapiens OX=9606 GN=INS PE=1 SV=1 MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAED LQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN -
Manipulation Python : lecture ligne par ligne, identification des lignes d’en-tête (
>), stockage dans dictionnaire {id: séquence}.
b) Format GenBank
- Usage : banque de séquences nucléiques avec annotations complètes.
- Structure :
- En-tête (LOCUS, DEFINITION, ACCESSION, VERSION, SOURCE, ORGANISM, etc.).
- Section FEATURES décrivant gènes, CDS, peptides signal, etc.
- Séquence nucléotidique entre les balises
ORIGINet//.
- Notation des gènes :
- Sens direct :
gene 58..272ougene <2480..>2707. - Sens complémentaire (antisens) :
gene complement(55979..56935). <indique un gène partiel 5’,>un gène partiel 3’.
- Sens direct :
- Extraction séquence : lire entre
ORIGINet//, supprimer chiffres et espaces. - Manipulation Python : lecture ligne par ligne, extraction des gènes et positions, extraction de la séquence complète, construction de la séquence complémentaire inverse.
c) Format PDB (Protein Data Bank)
- Usage : structures tridimensionnelles de biomolécules (protéines, ADN, ARN).
- Structure :
- En-tête : informations lisibles (nom, date, méthode expérimentale, chaînes, etc.).
- Coordonnées atomiques : lignes commençant par
ATOMouHETATMavec coordonnées x, y, z.
- Hiérarchie : structure > modèle > chaîne > résidu > atome.
- Exemple d’extraction : coordonnées des carbones α (
CA) des résidus. - Manipulation Python : lecture ligne par ligne, extraction par tranches de chaîne, conversion en float/int, utilisation possible de Biopython.
d) Formats XML, CSV et TSV
-
XML :
- Format hiérarchique à balises
<balise>contenu</balise>. - Permet de stocker des données complexes (ex : fichiers UniProt).
- Manipulation avec
lxml.etreeen Python. - Exemple : extraction des noms de gènes et séquences dans un fichier UniProt XML.
- Format hiérarchique à balises
-
CSV (Comma-Separated Values) :
- Données tabulaires, valeurs séparées par des virgules.
- Première ligne : en-tête (noms des colonnes).
- Manipulation avec module
csven Python (csv.DictReaderpour lecture,csv.DictWriterpour écriture).
-
TSV (Tab-Separated Values) :
- Similaire au CSV, mais valeurs séparées par tabulations (
\t). - Lecture/écriture avec
csven précisantdelimiter="\t".
- Similaire au CSV, mais valeurs séparées par tabulations (
2. Projet GenBank2FASTA (conversion GenBank → FASTA)
- Objectif : convertir un fichier GenBank (ex : chromosome I de Saccharomyces cerevisiae) en fichiers FASTA pour chaque gène.
- Étapes clés :
- Lire le fichier GenBank en liste de lignes.
- Extraire le nom de l’organisme (ligne contenant
ORGANISM). - Identifier les gènes (lignes commençant par
gene), distinguer sens/antisens. - Extraire la séquence complète entre
ORIGINet//. - Construire la séquence complémentaire inverse pour les gènes antisens.
- Écrire chaque gène dans un fichier FASTA avec un en-tête
>organisme|numéro-gène|début|fin|sens/antisens.
- Remarques :
- Ignorer les symboles
<et>dans les positions. - La séquence complémentaire inverse remplace
a↔t,c↔gpuis inverse la chaîne. - La séquence FASTA est écrite sur des lignes de 80 caractères max.
- Ignorer les symboles
- Variantes :
- Sans expressions régulières : extraction par manipulation de chaînes.
- Avec expressions régulières : extraction plus compacte et robuste.
3. Projet : Recherche de mots anglais dans le protéome humain
- Objectif : détecter la présence de mots anglais dans les séquences protéiques humaines.
- Données :
- Liste de mots anglais fréquents (fichier
english-common-words.txt). - Protéome humain au format FASTA (
human-proteome.fasta).
- Liste de mots anglais fréquents (fichier
- Étapes :
- Lire et filtrer les mots (≥ 3 lettres, en majuscules).
- Lire les séquences protéiques dans un dictionnaire {id: séquence}.
- Chercher chaque mot dans les séquences, compter dans combien de séquences il apparaît.
- Afficher les mots trouvés et leur nombre d’occurrences.
- Trouver le mot le plus fréquent et calculer son pourcentage d’apparition dans le protéome.
- Optionnel : compter le nombre total d’occurrences de chaque mot dans toutes les séquences.
4. Simulation d’un pendule simple
-
Modèle physique :
- Pendule : masse ponctuelle suspendue à un pivot par une tige rigide sans masse.
- Hypothèses : pas de frottement, gravité uniforme.
-
Équation différentielle :
où est l’angle entre la verticale et la tige, la gravité, la longueur de la tige.
-
Méthode de résolution numérique : méthode semi-implicite d’Euler
-
Calcul de l’accélération angulaire :
-
Mise à jour de la vitesse angulaire :
-
Mise à jour de l’angle :
-
-
Paramètres usuels :
- m, m/s², s.
- Conditions initiales : angle initial rad (45°), vitesse angulaire initiale nulle.
-
Visualisation avec Tkinter :
-
Utilisation d’un
Canvas400×400 pixels. -
Conversion de en coordonnées cartésiennes :
-
Conversion en coordonnées canvas (centre en (200, 200), facteur 100 pixels/mètre) :
-
-
Gestion du mouvement :
- Boutons Démarrer, Arrêter, Quitter.
- Drapeau
is_movingpour contrôler l’animation. - Méthode
move()appelée périodiquement (toutes les 20 ms) pour mettre à jour la position.
À retenir :
Le format FASTA stocke des séquences avec une ligne d’en-tête>suivie de la séquence sur plusieurs lignes.
Le format GenBank contient des annotations détaillées et la séquence entreORIGINet//.
La simulation d’un pendule simple repose sur la résolution numérique de l’équation différentielle par la méthode semi-implicite d’Euler.
Installation de Python
1. Installation de Python avec Miniconda
- Miniconda est une distribution légère de Python incluant le gestionnaire de paquets conda, compatible Windows, Mac OS X et Linux.
- Anaconda est une distribution complète, plus lourde (plusieurs Go), incluant de nombreux paquets.
- Pip est le gestionnaire de paquets Python standard depuis la version 3.4, mais conda est recommandé pour gérer les environnements et paquets en bioinformatique.
Recommandation : Installer Miniconda pour bénéficier d’un gestionnaire efficace, sans nécessiter de droits administrateur.
2. Installation de Miniconda selon le système
| Système | Étapes principales | Remarques |
|---|---|---|
| Linux | 1. Télécharger le script Miniconda3-latest-Linux-x86_64.sh depuis https://conda.io/miniconda.html | Installer via $ bash Miniconda3-latest-Linux-x86_64.sh |
2. Accepter la licence, choisir le répertoire d’installation (par défaut ~/miniconda3) | Initialiser conda avec yes à la fin | |
| Mac OS X | Même procédure que Linux, avec le fichier Miniconda3-latest-MacOSX-x86_64.sh | Répertoire par défaut : /Users/votre_nom/miniconda3 |
| Windows 10/11 | 1. Télécharger Miniconda3-latest-Windows-x86_64.exe depuis le site Miniconda | Désinstaller toute autre version Python avant |
| 2. Lancer l’installateur, accepter licence, installer pour "Just me", laisser chemin par défaut | Ne pas ajouter Miniconda au PATH, cocher "Register Anaconda as my default Python" | |
3. Initialiser conda via Anaconda Powershell Prompt (Miniconda3) avec la commande conda init | Fermer et rouvrir le shell pour appliquer |
3. Vérification de l’installation
-
Ouvrir un shell (bash, PowerShell, etc.) : l’invite doit afficher
(base)indiquant l’activation de l’environnement conda de base. -
Tester Python :
$ python Python 3.12.4 | packaged by Anaconda, Inc. >>> exit() -
Tester conda :
$ conda usage: conda [-h] [-v] [-V] COMMAND ...
4. Désinstallation de Miniconda
| Système | Procédure |
|---|---|
| Linux/Mac OS X | Supprimer le dossier miniconda3 et retirer les lignes de configuration conda dans .bashrc ou équivalent |
| Windows | Désinstaller via le panneau de configuration, puis supprimer manuellement le fichier profile.ps1 dans Documents\WindowsPowerShell |
5. Installation des modules complémentaires avec conda
-
Modules recommandés :
numpy,pandas,matplotlib,scipy,biopython,jupyterlab. -
Commande d’installation commune à tous les OS :
$ conda install numpy pandas matplotlib scipy biopython jupyterlab -
Confirmer avec
ypuis attendre la fin de l’installation.
6. Test des modules installés
-
Lancer Python puis importer les modules :
import numpy import scipy import Bio import matplotlib import pandas -
Aucun message d’erreur signifie que l’installation est réussie.
-
Tester Jupyter Lab :
$ jupyter labCela ouvre Jupyter dans le navigateur par défaut.
7. Utilisation de pip avec conda
-
pip est intégré dans Miniconda et peut être utilisé pour installer des paquets absents de conda.
-
Toujours activer l’environnement conda avant d’utiliser pip :
$ conda activate base $ pip install nom_du_paquet -
Préférer conda pour l’installation des paquets classiques.
8. Choix et configuration d’un éditeur de texte
| Système | Éditeur recommandé | Configuration clé |
|---|---|---|
| Linux | gedit | Indentation : 4 espaces au lieu de tabulations (Préférences > Éditeur) |
| Windows | Notepad++ | Indentation : 4 espaces, afficher la numérotation des lignes (Paramètres > Préférences) |
| Mac OS X | BBedit (remplace TextWrangler) | Configuration pour tab = 4 espaces (voir ressources en ligne) |
9. Se positionner dans le bon répertoire dans le shell
- Commandes Unix de base :
cd(changer de répertoire),pwd(afficher répertoire courant),ls(lister fichiers). - Astuces pratiques :
- Linux : clic droit dans Nautilus > "Ouvrir dans un terminal".
- Windows : taper
powershelldans la barre d’adresse de l’explorateur ou Shift + clic droit > "Ouvrir la fenêtre PowerShell ici".
10. Exécution d’un script Python
-
Placer le script dans un répertoire.
-
Ouvrir un shell dans ce répertoire.
-
Lancer le script avec :
$ python nom_du_script.py
11. Alternatives à l’installation locale
- Utiliser des interpréteurs Python en ligne (ex. repl.it, Tutorials Point, Python Tutor).
- Applications mobiles : Pydroid 3 (Android), Pythonista 3 (iOS, payant).
- Limitations possibles : installation de modules, gestion des fichiers.