CPGE-BOBO/BCPST 2
TP d’algorithme et programmation en Python
Thème 1
Exercice 1 : Moyenne des notes
Le chier notes.txt contient les notes obtenues par des étudiants pour le cours de Python.
Chaque ligne du chier ne contient qu'une note.
Créez un script Python qui lit chaque ligne de ce chier, extrait les notes sous forme
de oat et les stocke dans une liste.
Terminez le script en calculant et af chant la moyenne des notes avec deux décimales.
Exercice 2 : Admis ou recalé
Le chier notes.txt contient les notes obtenues par des étudiants pour le cours de Python.
Chaque ligne du chier ne contient qu'une note.
Créez un script Python qui lit chaque ligne de ce chier, extrait les notes sous forme
de oat et les stocke dans une liste.
Le script réécrira ensuite les notes dans le chier notes2.txt avec une note par ligne suivie
de « recalé » si la note est inférieure à 10 et « admis » si la note est supérieure ou égale à
10. Toutes les notes seront écrites avec une décimale. À titre d'exemple, voici les 3
premières lignes attendues pour le chier notes2.txt :
13.5 admis
17.0 admis
9.5 recalé
Exercice 3 : Spirale
Créez un script spirale.py qui calcule les coordonnées cartésiennes d'une spirale à deux
dimensions. Les coordonnées cartésiennes XA et YA d'un point sur un cercle de rayon r
s'expriment en fonction de l'angle Ⲑ représenté sur la gure ci-dessous comme :
XA = r x cos(Ⲑ)
YA= r x sin(Ⲑ)
fl
fl
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
Pour calculer les coordonnées cartésiennes qui décrivent la spirale, vous allez faire varier
deux variables en même temps :
- l’angle Ⲑ , qui va prendre des valeurs de 0 à 4π radians par pas de 0.1, ce qui
correspond à deux tours complets ;
- le rayon du cercle r, qui va prendre comme valeur initiale 0.5 puis que vous allez
incrémenter (c'est-à-dire augmenter) par pas de 0.1.
Les fonctions trigonométriques sinus et cosinus sont disponibles dans le
module math. Pour les utiliser, vous ajouterez au début de votre script l'instruction :
import math
La fonction sinus sera math.sin() et la fonction cosinus math.cos(). Ces deux fonctions
prennent comme argument une valeur d'angle en radian. La constante
mathématique π sera également accessible grâce à ce module via math.pi.
Par exemple :
>>> math.sin(0)
0.0
>>> math.sin(math.pi/2)
1.0
>>> math.cos(math.pi)
-1.0
Sauvegardez ensuite les coordonnées cartésiennes dans le chier spirale.dat en
respectant le format suivant :
- un couple de coordonnées ( XA et YA ) par ligne ;
- au moins un espace entre les deux coordonnées XA et YA ;
- les coordonnées af chées sur 10 caractères avec 5 chiffres après la virgule.
Les premières lignes de spirale.dat devrait ressembler à :
0.50000 0.00000
0.59700 0.05990
0.68605 0.13907
0.76427 0.23642
0.82895 0.35048
0.87758 0.47943
[...] [...]
fi
fi
Une fois que vous avez généré le chier spirale.dat, visualisez votre spirale avec le code
suivant (que vous pouvez recopier dans un autre script ou à la suite de votre
script spirale.py) :
import matplotlib.pyplot as plt
x=[]
y=[]
with open("spirale.dat", "r") as f_in:
for line in f_in:
coords = line.split()
x.append( oat(coords[0]))
y.append( oat(coords[1]))
plt. gure( gsize=(8,8))
mini = min(x+y) * 1.2
maxi = max(x+y) * 1.2
plt.xlim(mini, maxi)
plt.ylim(mini, maxi)
plt.plot(x, y)
plt.save g("spirale.png")
Visualisez l'image spirale.png ainsi créée.
Essayez de jouer sur les paramètres Ⲑ et r, et leur pas d'incrémentation, pour construire
de nouvelles spirales.
fi
fi
fi
fl
fl
fi
Thème 2
Exercice 1 : Racine carrée
Af chez sur la même ligne les nombres de 10 à 20 (inclus) ainsi que leur racine carrée
avec 3 décimales. Utilisez pour cela le module math avec la fonction sqrt(). Exemple :
10 3.162
11 3.317
12 3.464
13 3.606
[…]
Exercice 2 : Cosinus
Calculez le cosinus de π/2 en utilisant le module math avec la fonction cos() et la
constante pi.
Exercice 3 : Nom et contenu du répertoire courant
Af chez le nom et le contenu du répertoire courant (celui depuis lequel vous avez lancé
l'interpréteur Python).
Déterminez également le nombre total de chiers et de répertoires présents dans le
répertoire courant.
Exercice 4 : Af chage temporisé
Af chez les nombres de 1 à 10 avec 1 seconde d'intervalle. Utilisez pour cela le
module time et sa fonction sleep().
Exercice 5 : Séquences aléatoires de chiffres
Générez une séquence aléatoire de 6 chiffres, ceux-ci étant des entiers tirés entre 1 et 4.
Utilisez le module random avec la fonction randint().
fi
fi
fi
fi
fi
Exercice 6 : Séquences aléatoires d'ADN
Générez une séquence aléatoire d'ADN de 20 bases de deux manières différentes.
Utilisez le module random avec la fonction randint() ou choice().
Exercice 7 : Séquences aléatoires d'ADN avec argument
Créez un script dna_random.py qui prend comme argument un nombre de bases,
construit une séquence aléatoire d'ADN dont la longueur est le nombre de bases fourni en
argument, puis af che cette séquence.
Le script devra véri er qu'un argument est bien fourni et renvoyer un message d'erreur si
ce n'est pas le cas.
Conseil : pour générer la séquence d'ADN, vous utiliserez, au choix, la fonction
random.randint() ou random.choice() abordées dans l'exercice précédent.
Exercice 8 : Compteur de lignes
Améliorez le script compte_lignes.py dont le code a été donné précédemment de façon à
ce qu'il renvoie un message d'erreur si le chier n'existe pas. Par exemple, si les
chiers zoo1.txt et zoo2.txt sont bien dans le répertoire courant, mais pas zoo3.txt :
$ python compte_lignes.py zoo1.txt
zoo1.txt contient 4 lignes.
$ python compte_lignes.py zoo2.txt
zoo2.txt contient 3 lignes.
$ python compte_lignes.py zoo3.txt
ERREUR : zoo3.txt n'existe pas.
Exercice 9 : Module ADN
Dans le script adn.py, construisez un module qui va contenir les fonctions et constantes
suivantes.
Fonction lit_fasta() : prend en argument un nom de chier sous forme d'une chaîne de
caractères et renvoie la séquence d'ADN lue dans le chier sous forme d'une chaîne de
caractères.
Fonction seq_alea() : prend en argument une taille de séquence sous forme d'un entier et
renvoie une séquence aléatoire d'ADN de la taille correspondante sous forme d'une
chaîne de caractères.
fi
fi
fi
fi
fi
fi
Fonction comp_inv() : prend en argument une séquence d'ADN sous forme d'une chaîne
de caractères et renvoie la séquence complémentaire inverse (aussi sous forme d'une
chaîne de caractères).
Fonction prop_gc() : prend en argument une séquence d'ADN sous forme d'une chaîne de
caractères et renvoie la proportion en GC de la séquence sous forme d'un oat. Nous
vous rappelons que la proportion de GC s'obtient comme la somme des bases Guanine
(G) et Cytosine (C) divisée par le nombre total de bases (A, T, C, G).
Constante BASE_COMP : dictionnaire qui contient la complémentarité des bases d'ADN
(A→T, T→C, G→C et C→G). Ce dictionnaire sera utilisé par la fonction comp_inv().
À la n de votre script, proposez des exemples d'utilisation des fonctions que vous aurez
créées. Ces exemples d'utilisation ne devront pas être exécutés lorsque le script est
chargé comme un module.
fi
fl
Thème 3
Années de publication des articles relatifs à la barstar
L'objectif de cet exercice est d'interroger automatiquement la base de données
bibliographique PubMed pour déterminer le nombre d'articles relatifs à la barstar publiés
chaque année.
Vous utiliserez les modules Biopython et matplotlib.
1- Requête avec un mot-clé
Sur le site de PubMed, cherchez combien d'articles scienti ques sont relatifs à la barstar.
Effectuez la même chose avec Python et la méthode Entrez.esearch() de Biopython.
Choisissez un des PMID renvoyé et véri ez dans PubMed que l'article associé est bien à
propos de la barstar. Pour cela, indiquez le PMID choisi dans la barre de recherche de
PubMed et cliquez sur Search. Attention, l'association n'est pas toujours évidente.
Cherchez éventuellement dans le résumé de l'article si besoin.
Est-ce que le nombre total d'articles trouvés est cohérent avec celui obtenu sur le site de
PubMed ?
2- Récupération des informations d'une publication
Récupérez les informations de la publication dont le PMID est 29701945. Vous utiliserez la
méthode Entrez.esummary().
Af chez le titre, le DOI, le nom du journal (Source) et la date de publication (PubDate) de
cet article. Véri ez que cela correspond bien à ce que vous avez lu sur PubMed.
3- Récupération du résumé d'une publication
Récupérez le résumé de la publication dont le PMID est 29701945. Vous utiliserez la
méthode Entrez.efetch().
Af chez ce résumé. Combien de caractères contient-il ?
4- Distribution des années de publication des articles relatifs à la barstar
En utilisant la méthode Entrez.esearch(), récupérez tous les PMID relatifs à la barstar.
Pour cela, pensez à augmenter le paramètre retmax. Vos PMID seront stockés dans la
liste pmids sous forme de chaînes de caractères. Véri ez sur PubMed que vous avez bien
récupéré le bon nombre d'articles.
En utilisant maintenant la méthode Entrez.esummary() dans une boucle, récupérez la date
de publication de chaque article. Stockez l'année sous forme d'un nombre entier dans la
liste years. Cette étape peut prendre une dizaine de minutes, soyez patient. Vous pouvez
fi
fi
fi
fi
fi
fi
dans votre boucle af cher un message qui indique où vous en êtes dans la récupération
des articles.
À la n véri ez que votre liste years contient bien autant d'éléments que la liste pmids.
Calculez maintenant le nombre de publications par année. Vous créerez pour cela un
dictionnaire freq qui aura pour clé les années (oui, une clé de dictionnaire peut aussi être
un entier) et pour valeur le nombre de publications associées à une année donnée.
Créez une liste x qui contient les clés du dictionnaire freq. Ordonnez les valeurs
dans x avec la méthode .sort(). Créez maintenant une seconde liste y qui contient, dans
l'ordre, le nombre de publications associées à chaque années. Bien évidemment, les
listes x et y doivent avoir la même taille. Au fait, en quelle année la barstar apparaît pour la
première fois dans une publication scienti que ?
Ensuite, avec le module matplotlib, vous allez pouvoir af cher la distribution des
publications en fonction des années :
import matplotlib.pyplot as plt
plt.bar(x, y)
plt.show()
Vous pouvez également ajouter un peu de cosmétique et enregistrer le graphique sur
votre disque dur :
import matplotlib.pyplot as plt
plt.bar(x, y)
# redé nition des valeurs af chées sur l'axe des ordonnées
plt.yticks(list(range(0, max(y), 2)))
# étiquetage des axes et du graphique
plt.xlabel("Années")
plt.ylabel("Nombre de publications")
plt.title("Distribution des publications qui mentionnent la barstar")
# enregistrement sur le disque
plt.save g("distribution_barstar_annee.png", bbox_inches='tight', dpi=200)
Bon courage !
fi
fi
fi
fi
fi
fi
fi
fi