AMU :: Polytech Biotech III :: JGB53D :: 2014/2015 :: Jacques van Helden, Denis Puthier, Nicolas Terrapon

Introduction à Python. Structures conditionnelles et boucles.

Contenu

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,...).


Structures conditionnelles.

Présentation

Une structure conditionnelle permet de tester si une condition est vraie ou fausse. Ces structures conditionnelles évaluent de manière générale un test ou une expression booléenne (e.g a > 4, b < 4, 5 < b < 10,...). Dans la structure if...else classique, on exécutera un certain nombre d'instructions si la condition est vraie et un autre jeu d'intructions si celle-ci s'avère fausse.

Ci-dessous sont présentées un certain nombre de syntaxes possibles pour ces structures de contrôle.

5B

Une structure if simple:

if test: # 'test' est une expression booléenne (e.g a > 3). instruction(s) # une/des instruction(s) réalisée(s) si la condition est vraie ( e.g print() ).

la structure if...else:

if test: # 'test' est une expression booléenne (e.g a > 3). instruction(s) # une/des instruction(s) réalisée(s) si la condition est vraie ( e.g print() ). else: # sinon (si 'test' est faux). instruction(s) # une/des instruction(s) réalisée(s) si la condition est fausse.

la structure if...elif...else:

if test: # 'test' est une expression booléenne (e.g a == 1). instruction(s) # une/des instruction(s) réalisée(s) si la condition 'test' est vraie ( e.g print() ). elif test2: # teste une autre expression, 'test2' (e.g a == 2), si 'test' est faux. instruction(s) # une/des instruction(s) réalisée(s) si la condition 'test2' est vraie. elif test3: # teste une autre expression, 'test3' (e.g a == 3), si 'test' et test2 sont faux. instruction(s) # une/des instruction(s) réalisée(s) si la condition 'test3' est vraie. else: # Sinon, si 'test', 'test2' et 'test3' sont faux alors... instruction(s) # une/des instruction(s) réalisée(s) si aucune condition n'est vérifiée.

Structures if...else imbriquées

Les instructions réalisées dans le corps d'un if, elif ou else peuvent elles-même comporter des structures conditionnelles:

if test: # 'test' est une expression booléenne instruction(s) # une/des instruction(s) réalisée(s) si la condition 'test' est vraie if test2: # 'test' est une expression booléenne. instruction(s) # une/des instruction(s) réalisée(s) si la condition 'test2' est vraie. else: instruction(s) # une/des instruction(s) réalisée(s) si la condition 'test' est fausse.

Opérateurs de comparaison

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.

OperateurDescription
a == bOpérateur d'égalité. Renvoie true si a et b contiennent des valeurs égales.
a != bRenvoie true si a et b contiennent des valeurs différentes.
a > bRenvoie true si la valeur de a est supérieure à la valeur de b.
a < bRenvoie true si la valeur de a est inférieure à la valeur de b.
a >= bRenvoie true si la valeur de a est supérieure ou égale à la valeur de b.
a <= bRenvoie true si la valeur de a est inférieure ou égale à la valeur de b.
c < a < bRenvoie true si la valeur de a est supérieure ou égale à c et inférieure ou égale à b.
c <= a <= bRenvoie true si la valeur de a est strictement supérieure à c et inférieure à b.

Opérateurs logiques

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.

OperatorDescriptionExample
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)

Exercice

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

  1. python -m py_compile "%f" ---> python3 -m py_compile "%f"
  2. python "%f" ---> python3 "%f"

Créez un petit programme qui permet de demander une séquence nucléotidique à un utilisateur. Le programme devra :

  1. Demander une séquence à l'utilisateur (regardez l'aide sur la fonction input())
  2. Transformer cette séquence en majuscules.
  3. Compter le nombre de A, de C, de T, de G puis la somme totale de nucléotide A, C, T et G.
  4. S'assurer que taille de la séquence est bien comprise entre 5 et 10: si cette condition n'est pas vérifiée, le programe affichera "Longueur incorrecte".
  5. Dans le cas contraire (où la condition (4) est vérifiée), le programme affichera "Longueur correcte" et devra tester si la séquence contient exclusivement les nucléotides A,C,G,T. Si oui, il affichera "Alphabet valide" sinon il affichera "Alphabet non valide".

Boucles.

Présentation

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).

Boucles for

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:

# La variable v prend successivement la valeur des différents éléments de la liste for v in liste: # Pour chaque élément v de la liste instruction(v) # On effectue une opération avec v # La variable v prend successivement la valeur des différents éléments de la liste # La variable p contient la position for p,v in enumerate(liste): # Pour chaque élément v de la liste on énumère sa position (p) et sa valeur (v) instruction(v) # On effectue une opération avec v instruction(p) # On effectue une opération avec p

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"

Boucles while

La boucle while permet d'effectuer un jeu d'instruction tant qu'une condition est vrai.

while condition: # Tant que la condition est vrai (e.g a > 10) alors le jeu d'instruction est exécuté statement(s) # Le/les instruction(s) à exécuter exemple: while a < b : a=raw_input("Entrez un nombre: ")

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")

Breaks and continue

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.

########################### ### Break et continue ### ########################### ## Exemple 1 # La sortie est: # 0 1 2 3 4 for i in range(10): if i==5: break print(i) ## Exemple 2 # La sortie est # 1 2 8 9 10 i = 0 while i < 10: i += 1 if 2 < i < 8: continue print(i)

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).

############################## ### for/while ... else ### ############################## # L'un de vous entre une lettre sans le dire à l'autre. L'autre a dix essai pour deviner. secret = input() secret = secret.upper() for i in range(10): essai = input("essai "+str(i)) essai = essai.upper() if essai==secret: print("WIN: "+secret+" found!") break else: print("Not found after 10 attempts: LOST!")