• Aucun résultat trouvé

Parcours d'une séquence : for in

longueur de la chaîne chat = 4 longueur de la chaîne crocodile = 9

L'instruction for est un nouvel exemple d’instruction composée. N'oubliez donc pas le double point obligatoire à la fin de la ligne, et l'indentation du bloc d'instructions qui suit.

Le nom qui suit le mot réservé in est celui de la séquence qu'il faut traiter. Le nom qui suit le mot réservé for est celui que vous choisissez pour la variable destinée à contenir successivement tous les éléments de la séquence. Cette variable est définie automatiquement (c'est-à-dire qu'il est inutile de la définir au préalable), et son type est automatiquement adapté à celui de l'élément de la séquence qui est en cours de traitement.

Exemple :

divers = ['cheval', 3, 17.25, [5, 'Jean']] for e in divers:

print(e)

L'exécution de ce script donne : cheval

3 17.25 [5, 'Jean']

Bien que les éléments de la liste divers soient tous de types différents (une chaîne de caractères, un entier, un réel, une liste), on peut affecter successivement leurs contenus à la variable e, sans qu'il s'ensuive des erreurs (ceci est rendu possible grâce au typage dynamique des variables Python).

Exercices

Écrivez un script qui détermine si une chaîne contient ou non le caractère « e ». 1.

Écrivez un script qui compte le nombre d'occurrences du caractère « e » dans une chaîne. 2.

Écrivez un script qui recopie une chaîne (dans une nouvelle variable), en insérant des astérisques entre les caractères. Ainsi par exemple, « gaston » devra devenir « g*a*s*t*o*n »

3.

Écrivez un script qui recopie une chaîne (dans une nouvelle variable) en l'inversant. Ainsi par exemple, « zorglub » deviendra « bulgroz ».

4.

En partant de l'exercice précédent, écrivez un script qui détermine si une chaîne de caractères donnée est un

palindrome (c'est-à-dire une chaîne qui peut se lire indifféremment dans les deux sens), comme par exemple « radar » ou « s.o.s ».

5.

Solution

# Recherche d'un caractère particulier dans une chaîne # Chaîne fournie au départ :

chain = "Monty python flying circus" # Caractère à rechercher :

letter = "e"

# Recherche proprement dite :

i = 0 # indice du caractère en cours d'examen

found = False # "drapeau" à lever si le caractère recherché est présent while i < len(chain):

if chain[i] == letter: found = True i = i + 1 # Affichage :

print(u"Le caractère"), letter # Le caractère e if t == 1:

print(u"est présent") else:

print(u"est introuvable")

print(u"dans la chaîne"), chain # dans la chaîne Monty python flying circus 1.

Réfléchissez ! 2.

# Insertion d'un caractère d'espacement dans une chaîne # Chaîne fournie au départ :

ch = "Gaston"

# Caractère à insérer : cr = "*"

# Le nombre de caractères à insérer est inférieur d'une unité au # nombre de caractères de la chaîne. On traitera donc celle-ci à # partir de son second caractère (en omettant le premier). lc = len(ch) # nombre de caractères total

i = 1 # indice du premier caractère à examiner (le second, en fait) nch = ch[0] # nouvelle chaîne à construire (contient déjà le premier caractère) while i < lc: nch = nch + cr + ch[i] i = i + 1 # Affichage : print(nch) 3.

# Inversion d'une chaîne de caractères # Chaîne fournie au départ :

ch = "zorglub"

lc = len(ch) # nombre de caractères total

i = lc - 1 # le traitement commencera à partir du dernier caractère nch = "" # nouvelle chaîne à construire (vide au départ)

while i >= 0: nch = nch + ch[i] i = i - 1 # Affichage : print(nch) 4. Réfléchissez ! 5. Exercices

Dans un conte américain, huit petits canetons s'appellent respectivement : Jack, Kack, Lack, Mack, Nack, Oack, Pack et Qack. Écrivez un script qui génère tous ces noms à partir des deux chaînes suivantes :

prefixes = 'JKLMNOP' suffixe = 'ack'

Si vous utilisez une instruction for... in... , votre script ne devrait comporter que deux lignes. 1.

Rechercher le nombre de mots contenus dans une phrase donnée. 2.

Solution

prefixes, suffixe = "JKLMNOP", "ack" for p in prefixes:

print p + suffixe 1.

# Comptage du nombre de mots dans "chain"

chain = "Les petits ruisseaux font les grandes rivières" if len(chain) == 0:

print(0)

nm = 1 # la chaîne comporte au moins un mot

for c in chain:

if c == " ": # il suffit de compter les espaces nm = nm + 1

print(nm) 2.

L'instruction in peut être utilisée indépendamment de for, pour vérifier si un élément donné fait partie ou non d'une séquence. Vous pouvez par exemple vous servir de in pour vérifier si tel caractère alphabétique fait partie d'un groupe bien déterminé :

car ="e"

voyelles = "aeiouyAEIOUY" if car in voyelles:

print car,"est une voyelle"

D'une manière similaire, vous pouvez vérifier l'appartenance d'un élément à une liste : n = 5

nombrePremiers = [1, 2, 3, 5, 7, 11, 13, 17] if n in nombrePremiers:

print n, "fait partie de notre liste de nombres premiers"

Cette instruction très puissante effectue donc à elle seule un véritable parcours de la séquence. À titre d'exercice, écrivez les instructions qui effectueraient le même travail à l'aide d'une boucle classique utilisant l'instruction while.

Exercices

Écrivez un script qui affiche « vrai » si un caractère est un chiffre. 1.

Écrivez un script qui affiche « vrai » si un caractère est une majuscule. 2. Solution if character in "0123456789": print True else: print False 1. if character in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": print True else: print False 2.

Vous ne pouvez pas modifier le contenu d'une chaîne existante. En d'autres termes, vous ne pouvez pas utiliser l'opérateur [] dans la partie gauche d'une instruction d'affectation. Essayez par exemple d'exécuter le petit script suivant (qui cherche à remplacer une lettre dans une chaîne) :

salut = 'bonjour à tous' salut[0] = 'B'

print (salut)

Au lieu d'afficher « Bonjour à tous », ce script « lève » une erreur du genre : TypeError: object doesn't support item assignment. Cette erreur est provoquée à la deuxième ligne du script. On y essaie de remplacer une lettre par une autre dans la chaîne, mais cela n'est pas permis. Par contre, le script ci-dessous fonctionne :

salut = 'bonjour à tous' salut = 'B' + salut[1:] print (salut)

Dans cet autre exemple, en effet, nous ne modifions pas la chaîne "salut". Nous en recréons une nouvelle avec le même nom à la deuxième ligne du script (à partir d'un morceau de la précédente, soit, mais qu'importe : il s'agit bien d'une nouvelle chaîne).