SHS: Objectif Code
Jouons avec Python - jeux de mots
Vous savez désormais que le Python est un langage de programmation où tout est objet avec différents types (entier, chaîne, flottant...) et qui impose certaines règles pour que la machine exécute ce qu'on lui demande de faire (sinon nous récupérons un message d'erreur).
Commençons dès maintenant à aborder ces concepts sous un aspect plus ludique. Prenons un problème très simple mais concret: je dispose d'une chaîne de caractères et je souhaite en connaître le nombre de mots. Imaginons la phrase suivante:
"Bonjour, je suis Jean-Paul et je suis fan de Python"
Il nous faudrait donc une commande qui nous permettrait de compter le nombre de mots... Mais pour avoir le nombre de mots, nous devons d'abord indiquer à la machine ce que nous appelons un mot: ici, un groupe de caractères qui ne contient que des lettres ou des signes comme '-' (Jean-Paul). C'est donc l'absence d'espace " " qui définit ce que nous appelons un mot. Il nous faut maintenant éclater notre chaîne en autant de mots qu'il y a d'espaces: utilisons split().
>>> p = "Bonjour, je suis Jean-Paul et je suis fan de Python"
>>> p.split(' ')
['Bonjour,', 'je', 'suis', 'Jean-Paul', 'et', 'je', 'suis', 'fan', 'de', 'Python']
Mais qu'avons nous récupéré ?
>>> type(p.split(' '))
<type 'list'>
Notre méthode split() appliquée sur notre objet string nous renvoie une liste! L'interpréteur sépare notre chaîne en autant de morceaux séparés par un espace et stocke ces morceaux dans une liste.
Une liste, c'est donc un objet qui contient plusieurs valeurs (variables, groupes de variables, etc...). Nous souhaitons ici en récupérer la longueur (length en Anglais) pour connaître le nombre de mots contenus dans la chaîne initiale :
>>> mots = p.split(' ')
>>> print(mots)
['Bonjour,', 'je', 'suis', 'Jean-Paul', 'et', 'je', 'suis', 'fan', 'de', 'Python']
>>> print(len(mots))
10
Et voilà! Nous savons maintenant que notre phrase comporte 10 mots. Pratique cette fonction len()! Juste pour voir, utilisons-la avec notre chaîne:
>>> print(len(p))
51
51? Si vous comptez un à un les caractères (espaces et virgules compris) de notre chaîne "Bonjour, je suis Jean-Paul et je suis fan de Python", vous devriez totaliser... 51 caractères.
Appliquée à une liste ou une chaîne, la fonction len() renvoie le nombre d'éléments qui composent l'objet: le nombre d'éléments (mots) pour la liste, le nombre de caractères pour la chaîne.
Maintenant, nous souhaitons remplacer le prénom Jean-Paul par Marie mais sans avoir à réécrire toute notre chaîne. La méthode replace() devrait nous aider:
>>> print(p.replace('Jean-Paul', 'Marie'))
Bonjour, je suis Marie et je suis fan de Python
La méthode replace prend deux arguments: le premier est l'élément à remplacer, le second l'élément de substitution. Ainsi on peut s'amuser à remplacer les 'a' par des 'e' ou encore les 'n' par 'N' :
>>> print(p.replace('a', 'e'))
Bonjour, je suis Jeen-Peul et je suis fen de Python
>>> print(p.replace('n', 'N'))
BoNjour, je suis JeaN-Paul et je suis faN de PythoN
Je souhaite maintenant afficher tous les caractères de la chaîne en majuscule ou en minuscule. J'utilise les méthodes upper() et lower():
>>> p.upper()
'BONJOUR, JE SUIS JEAN-PAUL ET JE SUIS FAN DE PYTHON'
>>> p.lower()
'bonjour, je suis jean-paul et je suis fan de python'
Maintenant, je veux savoir si le mot "Python" se trouve dans notre chaîne p, ainsi que le mot "Java". Je peux le faire de deux manières :
>>> "Python" in p # la chaîne "Python" est-elle dans (in) la chaîne p?
True # vrai
>>> "Java" in p .. "Java"?
False # faux
>>> p.find('Python') # méthode find() de l'objet qui renvoie...
45 # 'Python' a été trouvé à partir de l'indice 45 de la chaîne p
>>> p.find('Java') # ou bien si la recherche est infructueuse...
-1 # "Java" n'a pas été trouvé
Ces deux techniques renvoient deux résultats bien distincts:
- "in" effectue un test et renvoie un BOOLEEN (une variable qui est soit vraie - True - soit fausse - False)
- find() parcours la chaîne et repère l'emplacement du premier caractère de la chaîne recherchée: on parle d'indice.
Chaque chaîne contient un nombre fini de caractère et il est ainsi possible de s'y repérer à partir de chacun de l'emplacement de chacun de ses caractères (l'indice):
>>> p[45] # quel est donc le caractère à l'indice 45 de p?
'P' # nous retrouvons le "P" de "Python" !!!
>>> p[45:51] # de l'indice 45 à 50 (le 51 est en fait exclu) ?
'Python'
>>> p[0:51] # de l'indice 0 à l'indice 50
'Bonjour, je suis Jean-Paul et je suis fan de Python'
>>> p[0:10] # les dix premiers caractères de 0 à 9
'Bonjour, j'
Vous avez dû remarquer que le premier indice n'est pas 1 mais 0. Retenez tout de suite la logique: quand on parcourt les éléments d'une chaîne ou d'une liste, le premier élément se situe TOUJOURS à l'indice 0 et le dernier à la longueur de la chaîne (ou de la liste) moins 1.
C'est pourquoi, notre chaîne p qui compte 51 caractère se termine à l'indice 50 (de 0 à 50 inclus, il y a bien 51 nombres). D'ailleurs, si vous réclamez le caractère qui se situe à l'indice (index) 51 de p, vous allez vous faire houspiller:
>>> p[51]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
Avec une liste, c'est le même esprit:
>>> mots = p.split(' ')
>>> mots[0]
'Bonjour,'
>>> mots[9]
'Python'
Il ne me reste plus qu'à vous présenter un dernier outil très pratique pour créer de l'interaction entre la machine et l'utilisateur: la commande input(). Rien de meilleur que de mettre directement les pieds dedans:
>>> n1 = input("Nombre 1 : ")
Nombre 1 : 6
>>> n2 = input("Nombre 2 : ")
Nombre 2 : 7
>>> print(n1*n2)
42
Avec input() nous avons pu, en une seule instruction, imprimer un message à l'écran et préparer le stockage de la saisie vers une variable (n1 ou n2). En appuyant sur la touche entrée, la valeur saisie est stockée dans une variable prête à être utilisée par la suite.
Petit exercice: calculer le taux de croissance annuel moyen (TCAM). Il s'agit donc d'écrire les commandes qui permettront de:
- Saisir une valeur initiale et une valeur finale ainsi qu'un intervalle de temps (nombre d'années, généralement)
- Effectuer le calcul du TCAM
- Afficher, à l'aide de print(), la valeur du taux (n'hésitez pas à chercher sur le web une solution pour limiter le nombre de chiffres après la virgule!)
Pour rappel, la formule du TCAM est :
Evidemment il vous faudra trouver la solution qui permet de calculer la racine enième en Python (il s'agit plutôt d'une astuce mathématique - je n'en dis pas plus si ce n'est que tout ce que nous avons vu jusque maintenant suffit pour traiter le problème)
ESSAYEZ PAR VOUS-MÊME AVANT DE CONSULTER LA SOLUTION QUI SUIT
>>> initiale = float(input('Valeur initiale : '))
Valeur initiale : 33
>>> finale = float(input('Valeur finale : '))
Valeur finale : 133
>>> duree = input("Nombre d'années : ")
Nombre d'années : 20
>>> tcam = (finale/initiale)**(1./duree)-1
>>> print(tcam*100)
7.21779835924
Récapitulons les différentes fonctions et méthodes que nous venons de voir, avant de nous perdre:
- split() qui sépare les éléments d'une chaîne selon un séparateur (espace, virgule, une lettre - n'importe quel caractère) et renvoie une liste
- la fonction len() qui renvoie le nombre d'éléments contenus dans une chaîne ou une liste
- la méthode replace() qui substitue une chaîne par une autre
- upper() et lower() qui transforment les caractères en majuscules ou minuscules
- in qui effectue un test de présence d'une chaîne dans une autre
- find() qui renvoie l'indice du premier caractère d'une chaîne contenue dans une autre
- les indices qui renvoient à un élément d'une liste ou un caractère d'une chaîne et dont le premier se situe toujours à l'index 0
- la commande input() qui permet de récupérer une saisie depuis un terminal.
Vous voilà un minimum outillé(e) pour créer un premier programme en dehors de l'interpréteur. Dans la prochaine partie, nous allons rédiger notre premier script et apprendre à l'exécuter.