Midilibre.fr
Tous les blogs | Alerter le modérateur| Envoyer à un ami | Créer un Blog


22/10/2008

[python] - Python débutant : fonctions & conditions - programmer un carnet de téléphone

python_deb.jpgNous avons vu la dernière fois comment débuter en programmation avec Python. Nous avons vu que finalement cela n'était pas si compliqué que cela. Alors du coup aujourd'hui on augmente un petit peu le niveau et nous allons aborder trois nouvelles notions : les fonctions, les conditions et les boucles.
Petites définitions avant de commencer. Une fonction en programmation est un bout de code que l'on peut appeller pour lui faire effectuer un traitement, par exemple si dans votre programme vous retailler une photo, au lieu de remettre 10 fois le même code vous pouvez faire appel à votre fonction qui contiendra le code pour retailler la fonction (il vaut mieux 1 code de 10 lignes appelé des dizainnes des fois plutot que 10 lignes répété des dizainnes de fois), vous économisez des lignes de codes et la lecture en sera simplé. Avec l'usage vous verrez que c'est extremement souple. nous allons le voir de toutes facons avec notre carnet téléphonique.
Concernant les boucles et les conditions, il s'agit en fait de spécifier au programme ce qu'il doit faire, ainsi vous allez pouvoir dire a votre programme "tant qu'il y a des personnes dans le carnet" on affiche leur nom. ou bien "si la demande est ajouter" on fera quelque chose de particulier, en l'occurence appeler la fonction ajouter pour permettre l'ajout de la personne.

Passons à la pratique. Je vous propose de récupérer le fichier source ici.

Récapitulons ce que nous voulons faire : un carnet avec des numéros de téléphone, nous voudrons donc ajouter un numero, effacer un numéro, l'afficher. Et surtout stocker nos informations dans un fichier et pouvoir les lire ultérieurment. En faisant cette démarche de conceptualisation vous avez déja fait 50% du travail puisque vous avez défini la structure du programme, et chacune de ces idées que nous avons énnoncé ci dessous correspondent en fait à la notion de fonction, ainsi vous pouvez en déduire que notre programme aura 5 fonctions.

Rappelez vous, il nous faut faire tout d'abord les bonnes déclarations au début du fichier, voici ce que nous avons :

#!/usr/bin/python
#-*- coding: utf-8 -*-

import sys
import os
fichier = 'fichier_donnee.txt'

Nous déclarons que le programme doit être lancé avec python et avec un encodage utf-8 (par rapport au accent), nous importons sys et os pour pouvoir appeller os.system (qui permettra de nettoyer le terminal) et sys.exit pour sortir du programme. nous déclarons une variable fichier, qui sera le nom du fichier ou nous stockerons les éléments que nous allons saisir. Le fait de placer le nom de la variable tout en haut et en dehors des fonctions permet de définir une variable globale qui sera visible partout, à l'inverse d'une variable locale (déclaré dans une fonction par exemple) qui elle ne sera visible que dans la fonction.

Maintenant prenons le point de départ de notre programme (qui est en fait tout à la fin) :

          if __name__ == "__main__":
os.system('clear')
if os.path.isfile(fichier) == False :
openfile=open(fichier,'w')
openfile.close()
ma_liste_tel = lire_le_fichier()

Premier point nous allons effacer le terminal, pour que cela soit plus propre, pour cela nous appelons la fonction système clear. Puis nous testons l'existence du fichier défini dans la variable fichier. Si il n'existe pas (IF == FALSE) alors nous le créeons avec open. Par contre si il existe alors nous appelons la fonction lire_le_fichier.(nous verrons plus bas comment définir une fonction)

Il est temps de créer notre première boucle. A la ligne 64, vous pouvez voir qu'il y a une while True, ce qui signifie que nous créons une boucle infini, tant que vous ne fermez pas le programme, il continuera à s'exécuter.

Cette boucle consiste a poser toujours la même question: que voulez vous faire ? nous allons donc stocker la variable de retour dans question :
question = raw_input('Que voulez vous faire ? Options : ajouter*nom*tel - effacer nom - afficher nom - sortir > ')

tout ce que voulez allez répondre sera stocké dans question, il ne restera plus qu'à analyser ce que contient question pour effectuer des actions et appeller les bonnes fonctions.

Nous avons 4 actions, la première permettra de marquer ajouter*stephane*235689 (je sépare les éléments * pour pouvoir les stocker et les analyser dans un tableau, cela évite les problèmes lié à l'utilisation d'espaces ou de virgules, .... on a rarement vu un numéro de téléphone avec un *).

Pour tester la variable question nous appelons de nous if, if question == 'sortir': alors nous appelons sys.exit() (notez que pour effectuer une comparaison nous utilisons == et non pas = qui lui affecterait la variable, question vaudrait alors toujours 'sortir')

SINON SI question commence par afficher (elif question.startswith('afficher'): elif veut dire sinon si) alors appelons la fonction affiche_tout(). Le try en début permet de vérifier que tout se passe bien, si il y a une erreur alors c'est ce qui est dans except qui sera appelé. En l'occurence, nous tentons de récupérer un tableau avec split en détectant espaces(ajouter stephane donne un tableau avec deux éléments ajouter et stephane), si il y a une erreur (vous n'avez pas mis de nom) alors except prends le relais et affiche (avec la commande print) qu'il y a une erreur. Nous pouvons alors appeler notre tableau avec aff_nom[1] (comme nous comptons à partir de 0 aff_nom[0] vaut afficher). Il suffit maintenant d'appeler la fonction avec une variable dedans : affiche_numero(aff_nom[1])

Nous faisons pareil avec la fonction effacer et ajouter (qui elle sera découper avec des * pour permettre de taper un numéro de téléphone avec des points des virgules des espaces...) cette derniere appellera une fonction avec deux variables (que nous séparons par des virgules) mais le principe est le même.

Nous avons donc un SI (if) des SINON SI (elif).... et si rien ne se vérifie (cad si vous avez tapez par exemple gbzfzshbfshsf ... ) nous appelons un SINON (else) qui clos la série de test, qui permet d'afficher une phrase qui indique que le programme n'a rien compris : print 'Bravo ! une forte tête ! j'aime ça ! Ce n' est pas une option valable'

Le coeur du programme est crée, il reste a dire au programme ce qu nous allons faire avec nos fonctions. Pour définir une fonction on utilise def le_nom_de_la_fonction(variable1, variable2,....)

Prenons l'appel de fonction affiche_numero(qui): ademettons que vous ayez appellé la fonction comme suis : affiche_numéro('steph') le programme va se rendre au def affiche_numero(qui) et la variable qui prendra alors la valeur de steph. vous pouvez alors utiliser cette variable qui pour lui appliquer un traitement. Notre variable qui est donc stocké, nous la testons. Dans le cas ou le nom est égal à tout alors nous allons lister toutes les entrées définit. Nous appelons un autre type de boucle un FOR, qui reviendrait a dire que tant que des éléments sont fournit alors on recommence. Qui dans notre cas équivaut à "tant que je peut lire mon fichier" je fait quelque chose.

Les fonctions efface_numero() et ajoute_numero() fonctionne sur le même principe, on récupère la variable qui, et on ajoute ou on retire l'entrée. Dans chaque cas nous enregistrons notre fichier, en appelant la fonction ecrire_le_fichier() avec la valeur de la liste ma_liste_tel.

Les fonctions d'écriture dans le fichier sont assez simple. (on ouvre le fichier avec open et tant qu'ils y a des entrées dans notre liste (FOR) alors on écris (write). une fois terminé on ferme proprement le ficheir avec close())

Quand à la fonction de lecture, elle est également facile à comprendre, on ouvre le fichier (on n'oublie pas try pour lever d'éventuelle probleme) avec open, on lit le fichier ligne par ligne (avec un WHILE - qui équivaut a un TANT QUE) et traite la variable ligne.

donnees = ligne[:-1]
On enlève le dernière caractère (qui est un retour à la ligne, on en a pas besoin)

donnees_split = donnees.split('*')
dico[donnees_split[0]]= str(donnees_split[1])

On génére un tableau avec le nom et le tel, on affecte ensutie les variables

ligne = notre_fichier.readline()
on lis la ligne suivante (et on repart dans le while si elle existe, sinon on passe à la suite)

Puis on ferme notre fichier. 92 Lignes de codes plus tard (en comptant les lignes vides c'est dire) vous avez un programme tout à fait fonctionnel et prêt à recevoir vos demandes d'ajout de personne. On peut imaginer augmenter la capacité du programme en ajouter un champs adresse, prénom,... je vous laisse faire, pour voir si vous avez compris.

La prochainne fois nous verrons comment gréffer trés simplement ce que nous venons de créer a une interface graphique.