Les conteneurs 1 : Chaînes de caractères.

Conteneurs

Un conteneur permet permet de stocker un grand nombre de données, nous avons déjà rencontré un conteneur : les chaînes de caractères (string) qui stockent des caractères (mais que des caractères). Python offre de base quatre conteneurs :

Le fonctionnement des chaînes de caractères, des tuples et des listes sont assez similaires dans le sens où une donnée est indéxée. Les dictionnaires sont eux un peu à part.

Les chaînes de caractères.

Dans une chaine de caractère tous les caractères ont un indice, le premier à l'indice 0 et ainsi de suite, si on sort de la chaine il y a une erreur.

CaractèresBonjour à tous.
Indice01234567891011121314

Considérons l'exemple suivant

Exemple

 
		

Pour parcourir les élèments d'une chaine de caractère, on dispose de deux moyens :

Une chaine de caractère est immuable, c'est à dire qu'on ne peut pas la modifier. On peut cependant en créer à partir d'une précédente à l'aide de la contanénation par exemple.

Exemple

 	
		

Le script suivant revient à faire mot.upper(), cette facon de lier fonction et variable est propre à la programmation objet qui sera au programme l'an prochain.

Le slicing.

Le slicing est est une technique hors programme mais très intéressante en python, elle permet de découper des chaînes (mais aussi des listes et des tuples).

Exemple

 	
		
Q.C.M.

Si mot = "Bonjour à tous" alors que vaut len(mot)





Q.C.M.

Si mot = "Bonjour à tous" alors que vaut mot[2] ?





Q.C.M.

Si mot = "Bonjour à tous" alors quelle valeur donner à début et fin pour que mot[debut:fin] soit égal à "à" ?





Q.C.M.

Si mot = "Bonjour" à quoi est égal mot[3:] ?





Q.C.M.

Si mot = "Bonjour à tous" donner tous ce qui donne "o" ?





Exercices

En partant de mot = "bonjour a tous" et sans utilisez le signe " ou ' ecrire :

  1. "BONJOUR A TOUS"
  2. "bonjour"
  3. "jourbon"
  4. "bonjour a tousbonjour a tous"
  5. "bonjour a tous bonjour a tous"
  6. bonjouratous"

Algorithme sur les conteneur : Compter.

Algorithme

Un algorithme classique et très courant sur les conteneurs (donc sur les chaines) et le fait de compter. On peut représenter l'algorithme de la facon suivante :

Il existe de nombreuses façons de l'implémenter en python, avec une boucle for ou while, par compréhension ou non. En voici différentes :


		

		

		

Exercices

Dans les exercices suivant, on se forcera à utiliser les indices des éléments d'une chaîne (libre à vous de refaire les fonctions sans après où si vous avez terminé).

  1. Faire une fonction compte_caracteres(chaine,lettre) qui demande une chaîne de caractère et une lettre en paramètre et qui retourne le nombre de fois où la lettre apparaît dans la chaîne. Par exemple compte_caracteres("Bonjour","o") doit retourner 2 (il y a deux o dans bonjour), compte_caracteres("Bonjour","z") doit retourner 0 (il y a 0 z dans bonjour). Indication il faut prendre un caractère de la chaîne après l'autre et le comparer avec le caractère lettre si c'est le cas il faut incrémenter un compteur.
  2. Faire une fonction de test de la fonction précédente.
  3. Utiliser la fonction précédente pour faire une fonction test_caractere(chaine,lettre) qui retourne True si la lettre est dans la chaine et False sinon. PAr exemple test_caractere("bonjour","o") = True et test_caractere("bonjour","z") = False. Critiquer le choix d'implémentation de cette fonction et faire une meilleure version.
  4. Faire une fonction qui test les versions précédentes.
  5. Faire une fonction test_egalite(chaine1,chaine2) qui teste si deux chaînes sont égales. La fonction retourne un boole. Évidement la fonction peut se faire en une ligne avec return chaine1 == chaine2 mais je vous demande de ne pas utiliser l'égalité de chaîne (par contre vous pouvez utiliser l'égalité entre deux caractères). Par exemple test_egalite("bonjour","bonjour") = True et test_egalite("bonjour","salut") = False . Indication : Penser à la longueur des chaines puis il vaut mieux tester si les caractères sont différents car cela entraîne directement la fin de la fonction, si la fonction arrive à son terme c'est donc que les chaînes sont égales.
  6. Faire une fonction qui teste la fonction précédente.
  7. Faire une fonction egalite_sans_majuscules(chaine1,chaine2) qui teste si deux chaînes sont égales en ne tenant pas compte des majuscules-minuscules. Le retour doit être un boole. Par exemple egalite_sans_majuscules("BONJOuR","bonjour") = True et egalite_sans_majuscules("Lu","bonjour") = False (Indication il faut utiliser upper() et lower())
  8. Faire une fonction qui teste la version précédente.
  9. Faire une fonction ote_espace(chaine) qui va retourner une chaîne identique à la chaîne donnée en paramètre moins les espaces. ote_espace("Bonjour a tous") = "Bonjouratous" par exemple.
  10. Faire une fonction de test de la précédente.
  11. Faire une fonction qui test si la phrase est un palindrome. Par exemple test_palindrome("ABBA") = True et test_palindrome("Doors") = False
Solutions
Projet

On souhaite réaliser un jeu de pendu minimaliste (a vous de l’améliorer si vous le souhaiter) suivant le schéma suivant :

Exercices
  1. Faire une fonction qui teste si deux chaines sont des anagrammes l'une de l'autre.
  2. Faire une fonction qui teste si une chaine (un mot pour vous donnez une idée est présente dans une autre chaine (un texte).
  3. Faire une fonction qui retourne le caractére apparaisant le plus dans une chaine.
  4. Faire une fonction qui inverse une chaine de caractère ("abc" devient "cba").
Projet à compléter
Solution