Dans le premier TD nous avons vu ensemble un certain nombre d'objets permettant à python de stocker des informations sous la forme de variables simples (objets de type int, float, str ou bool) ou de tableaux (listes, tuples et dictionnaires).
Lorsque l'on développe un programme on a généralement besoin de tester si une condition est vraie (e.g. l'utilisateur a-t-il soumis un fichier qui existe ou une réponse valide,..). Les informations étant stockées dans des variables le programme doit alors pouvoir interroger les variables et tester leur contenu. Les stuctures conditionnelles (e.g.if ... else) offre la possibilité de réaliser de tels tests.
Par ailleurs, lorsque de l'information réside dans un tableau, il sera souvent nécessaire de parcourir le tableau pour, par exemple, afficher son contenu, tester le contenu de chacune de ses positions, effectuer un calcul à partir de chacune des valeurs. De manière plus générale, lorsque l'on souhaitera répéter une instruction, on utilisera alors, des boucles (for, while,...).
Ci-dessous sont présentées un certain nombre de syntaxes possibles pour ces structures de contrôle.
5BUne structure if simple:
la structure if...else:
la structure if...elif...else:
Les instructions réalisées dans le corps d'un if, elif ou else peuvent elles-même comporter des structures conditionnelles:
Afin de pouvoir effectuer des tests renvoyant une valeur vraie ou fausse on dispose d'un certain nombre d'opérateurs de comparaison. Les plus fréquemment utilisés sont présentés ci-dessous.
| Operateur | Description |
|---|---|
| a == b | Opérateur d'égalité. Renvoie true si a et b contiennent des valeurs égales. |
| a != b | Renvoie true si a et b contiennent des valeurs différentes. | a > b | Renvoie true si la valeur de a est supérieure à la valeur de b. |
| a < b | Renvoie true si la valeur de a est inférieure à la valeur de b. |
| a >= b | Renvoie true si la valeur de a est supérieure ou égale à la valeur de b. |
| a <= b | Renvoie true si la valeur de a est inférieure ou égale à la valeur de b. |
| c < a < b | Renvoie true si la valeur de a est supérieure ou égale à c et inférieure ou égale à b. |
| c <= a <= b | Renvoie true si la valeur de a est strictement supérieure à c et inférieure à b. |
On a fréquemment besoin de combiner plusieurs test (condition 1 est vraie et condition b est vraie). Pour combiner les opérations de comparaison on utilisera des opérateurs logiques.
| Operator | Description | Example |
|---|---|---|
| and | L'opérateur logique ET. Renvoie True si les deux conditions sont vraies (sinon False). | a < b and c > d |
| or | L'opérateur logique OR. Renvoie True si l'une des deux conditions est vraie (sinon False). | a < b or c > d |
| not | L'opérateur de négation logique, NON. Renvoie True si son argument est faux et False si il est vrai. | not(a < b) |
Lancez le programme geany. Créez un nouveau fichier. A la première ligne de ce fichier, indiquez:
# -*- coding: utf8 -*-
Sauvegardez le fichier sous le nom "ReadSeq.py".
Allez dans le menu Build > Set Build Commands et aux lignes "compile" et "execute" changez les lignes ci-dessous et cliquez sur OK
Créez un petit programme qui permet de demander une séquence nucléotidique à un utilisateur. Le programme devra :
Comme indiqué en introduction, il est souvent nécessaire de réaliser des itérations (boucles). Les deux types de boucles que l'on rencontre le plus fréquemment sont les boucles for et les boucles while, toutes deux implémentées dans le langage Python (qui propose aussi la structure with que nous ne développerons pas ici).
La boucle for peut être utilisée pour répéter une instruction un certain nombre de fois. Elle permet de parcourir des listes, des chaînes de caractères (dont nous avons vu qu'elles ressemblaient dans une certaine mesure aux listes), les clefs d'un dictionnaire, les lignes d'un fichier, etc. En Python, la boucle for se présente typiquement de la manière suivante:
Ci-dessous, on propose quelques exemples permettant d'illustret l'utilisation de boucles for
Copiez-collez les instructions suivantes une ligne après l'autre dans IPython. Analysez les résultats et répondez aux questions.
###################################################
### Effectuer une opération n fois ###
###################################################
n = 100
for i in range(n):
print("je le fais")
###################################################
### Fonction range() ###
###################################################
help(range)
# Exercice 1 : Faire un programme affichant les multiples de 3 inférieurs à 20.
###################################################
### Parcourir des listes ###
###################################################
chroms = ["Chr1", "Chr2", "Chr3", "Chr4", "Chr5", "Chr6", "Chr7"]
for c in chroms:
print(c)
for p,c in enumerate(chroms):
print(p, c)
###################################################
### Parcourir des châines de caractères ###
###################################################
dna = 'ATGCTCGCTCGCTCGATGAAAATGTG'
# On passe les en revue les nucléotides contenus dans la séquence
for nuc in dna:
print("La séquence contient "+ nuc)
# Exercice 2: Passez en revue les nucléotides contenus dans la séquence pour afficher pour chacun "La séquence contient un X en position Y"
###################################################
### Parcourir un Dictionnaire ###
###################################################
# Un tableau associatif dont les clefs sont des noms d'utilisateurs
# Et les valeurs des mots de passe
login2passwd = {"Alain":"abc123", "John":"qwerty", "Alice":"1234567"}
# Afficher les clefs
for key in login2passwd:
print(key)
# Afficher les clefs et valeurs
# Il faut utiliser la méthode item()
for key, value in login2passwd.items():
print("Value is " + value + " for key " + key)
# Exercice 3: Écrivez une boucle permettant d'afficher le nom des personnes dont le mot de passe contient la chaîne "123"
La boucle while permet d'effectuer un jeu d'instruction tant qu'une condition est vrai.
Ci-dessous, on propose quelques exemples permettant d'illustret l'utilisation de boucles while
Copiez collez les instructions suivantes une ligne après l'autre dans IPython. Analysez les résulats.
#########################################
### Un exemple de boucle while ###
#########################################
password=None # La variable password est initialisé à None (vide)
# On effectue une boucle while
while password != "^^@@??))": ## Tant que le mot de passe n'est pas "^^@@??))"
password=raw_input("Enter a password please:") ## On demande un nouveau mot de passe à l'utilisateur
print "Welcome"
## Un exemple de boucle infini:
while True:
print("C'est vrai et ça le restera longtemps")
Comme dans beacoup d'autres langages, le mot clef break, permet de 'casser' une boucle, de l'arrêter avant qu'elle n'arrive à sa fin.
Le mot clef continue permet de passer directement à la prochaine itération, sans effectuer la suite des instructions de cette itération.
Pour conclure, une particularité de python est la possibilité de terminer une boucle par un else. Cela permet d'effectuer certaines intructions uniquement lorsque la boucle a atteint son terme sans interruption (break).