IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Apprendre à programmer avec Python

Apprendre programmer avec Python


prcdentsommairesuivant

Chapitre 5 : Principaux types de donnes

Dans le chapitre 2, nous avons dj manipul des donnes de diffrents types : des nombres entiers ou rels, et des chanes de caractres. Il est temps prsent d'examiner d'un peu plus prs ces types de donnes, et galement de vous en faire dcouvrir d'autres.

5.1. Les donnes numriques

Dans les exercices raliss jusqu' prsent, nous avons dj utilis des donnes de deux types : les nombres entiers ordinaires et les nombres rels (aussi appels nombres virgule flottante). Tchons de mettre en vidence les caractristiques (et les limites) de ces concepts :

5.1.1. Les types integer et long

Supposons que nous voulions modifier lgrement notre prcdent exercice sur la suite de Fibonacci, de manire obtenir l'affichage d'un plus grand nombre de termes. A priori, il suffit de modifier la condition de bouclage, dans la deuxime ligne. Avec while c< 49: , nous devrions obtenir quarante-huit termes. Modifions donc lgrement l'exercice, de manire afficher aussi le type de la variable principale :

 
Sélectionnez

>>> a, b, c = 1, 1, 1
>>> while c<49:
        print c, " : ", b, type(b)
        a, b, c = b, a+b, c+1
...
...
... (affichage des 43 premiers termes)
...
44 : 1134903170 <type 'int'>
45 : 1836311903 <type 'int'>
46 : 2971215073 <type 'long'>
47 : 4807526976 <type 'long'>
48 : 7778742049 <type 'long'>

Que pouvons-nous constater ?

Si nous n'avions pas utilis la fonction type(), qui nous permet de vrifier chaque itration le type de la variable b, nous n'aurions rien remarqu du tout : la suite des nombres de Fibonacci s'affiche sans problme (et nous pourrions encore l'allonger de nombreux termes supplmentaires).

Il semble donc que Python soit capable de traiter des nombres entiers de taille illimite.

L'exercice que nous venons de raliser indique cependant qu'il se passe quelque chose lorsque ces nombres deviennent trs grands. Au dbut du programme, les variables a, b et c sont dfinies implicitement comme tant du type integer. C'est ce qui se passe toujours avec Python lorsqu'on affecte une valeur entire une variable, condition que cette valeur ne soit pas trop grande. Dans la mmoire de l'ordinateur, ce type de donne est en effet encod sous la forme d'un bloc de 4 octets (ou 32 bits). Or la gamme de valeurs dcimales qu'il est possible d'encoder sur 4 octets seulement s'tend de -2147483648 + 2147483647 (Voir cours d'informatique gnrale).

Les calculs effectus avec ce type de variable sont toujours trs rapides, parce que le processeur de l'ordinateur est capable de traiter directement par lui-mme de tels nombres entiers 32 bits. En revanche, lorsqu'il est question de traiter des nombres entiers plus grands, ou encore des nombres rels (nombres virgule flottante ), les logiciels que sont les interprteurs et compilateurs doivent effectuer un gros travail de codage/dcodage, afin de ne prsenter en dfinitive au processeur que des oprations binaires sur des nombres entiers de 32 bits au maximum.

Vous savez dj que le type des variables Python est dfini de manire dynamique.

Puisqu'il s'agit du type le plus performant (aussi bien en termes de vitesse de calcul qu'en termes d'occupation de place dans la mmoire), Python utilise le type integer par dfaut, chaque fois que cela est possible, c'est--dire tant que les valeurs traites sont des entiers compris entre les limites dj mentionnes plus haut (environ 2 milliards, en positif ou en ngatif).

Lorsque les valeurs traites sont des nombres entiers se situant au-del de ces limites, leur encodage dans la mmoire de l'ordinateur devient plus complexe. Les variables auxquelles on affecte de tels nombres sont alors automatiquement dfinies comme appartenant au type entier long (lequel est dsign par long dans la terminologie Python).

Ce type long permet l'encodage de valeurs entires avec une prcision quasi infinie : une valeur dfinie sous cette forme peut en effet possder un nombre de chiffres significatifs quelconque, ce nombre n'tant limit que par la taille de la mmoire disponible sur l'ordinateur utilis !

Exemple :

 
Sélectionnez

>>> a, b, c = 3, 2, 1
>>> while c < 15:
        print c, ": ", b
        a, b, c = b, a*b, c+1
1 : 2
2 : 6
3 : 12
4 : 72
5 : 864
6 : 62208
7 : 53747712
8 : 3343537668096
9 : 179707499645975396352
10 : 600858794305667322270155425185792
11 : 107978831564966913814384922944738457859243070439030784
12 : 64880030544660752790736837369104977695001034284228042891827649456186234
582611607420928
13 : 70056698901118320029237641399576216921624545057972697917383692313271754
88362123506443467340026896520469610300883250624900843742470237847552
14 : 45452807645626579985636294048249351205168239870722946151401655655658398
64222761633581512382578246019698020614153674711609417355051422794795300591700
96950422693079038247634055829175296831946224503933501754776033004012758368256
>>>

Dans l'exemple ci-dessus, la valeur des nombres affichs augmente trs rapidement, car chacun d'eux est gal au produit des deux termes prcdents.

Au dpart, les variables a, b et c sont du type integer, puisqu'on leur affecte des petites valeurs numriques entires : 3, 2 et 1. A partir de la 8e itration, cependant, les variables b et a sont automatiquement converties l'une aprs l'autre dans le type long : le rsultat de la multiplication des termes 6 et 7 est en effet dj bien suprieur la limite des 2 milliards voque plus haut.

La progression continue avec des nombres de plus en plus gigantesques, mais la vitesse de calcul diminue. Les nombres mmoriss sous le type long occupent une place variable dans la mmoire de l'ordinateur, en fonction de leur taille.

5.1.2. Le type float

Vous avez dj rencontr prcdemment cet autre type de donne numrique : le type nombre rel , ou nombre virgule flottante , dsign en anglais par l'expression floating point number , et que pour cette raison on appellera type float sous Python.

Ce type autorise les calculs sur de trs grands ou trs petits nombres (donnes scientifiques, par exemple), avec un degr de prcision constant.

Pour qu'une donne numrique soit considre par Python comme tant du type float, il suffit qu'elle contienne dans sa formulation un lment tel qu'un point dcimal ou un exposant de 10.

Par exemple, les donnes :

3.14 10. .001 1e100 3.14e-10

sont automatiquement interprtes par Python comme tant du type float.

Essayons donc ce type de donnes dans un nouveau petit programme (inspir du prcdent) :

 
Sélectionnez

>>> a, b, c = 1., 2., 1 # => a et b seront du type 'float'
>>> while c <18:
...     a, b, c = b, b*a, c+1
...     print b
2.0
4.0
8.0
32.0
256.0
8192.0
2097152.0
17179869184.0
3.6028797019e+16
6.18970019643e+26
2.23007451985e+43
1.38034926936e+70
3.07828173409e+113
4.24910394253e+183
1.30799390526e+297
        Inf
        Inf

Comme vous l'aurez certainement bien compris, nous affichons cette fois encore une srie dont les termes augmentent extrmement vite, chacun d'eux tant gal au produit des deux prcdents. Au huitime terme, nous dpassons dj largement la capacit d'un integer. Au neuvime terme, Python passe automatiquement la notation scientifique ( e+n signifie en fait : fois dix l'exposant n ). Aprs le quinzime terme, nous assistons nouveau un dpassement de capacit (sans message d'erreur) : les nombres vraiment trop grands sont tout simplement nots inf (pour infini ).

Le type float utilis dans notre exemple permet de manipuler des nombres (positifs ou ngatifs) compris entre 10-308 et 10308 avec une prcision de 12 chiffres significatifs. Ces nombres sont encods d'une manire particulire sur 8 octets (64 bits) dans la mmoire de la machine : une partie du code correspond aux 12 chiffres significatifs, et une autre l'ordre de grandeur (exposant de 10).


(5) Exercices :

5.1. crivez un programme qui convertisse en radians un angle fourni au dpart en degrs, minutes, secondes.

5.2. crivez un programme qui convertisse en degrs, minutes, secondes un angle fourni au dpart en radians.

5.3. Ecrivez un programme qui convertisse en degres Celsius une temperature exprimee au depart en degres Fahrenheit, ou l'inverse. La formule de conversion est : TF=TC X 1,8 +32

5.4. crivez un programme qui calcule les intrts accumuls chaque anne pendant 20 ans, par capitalisation d'une somme de 100 euros place en banque au taux fixe de 4,3 %

5.5. Une lgende de l'Inde ancienne raconte que le jeu d'checs a t invent par un vieux sage, que son roi voulut remercier en lui affirmant qu'il lui accorderait n'importe quel cadeau en rcompense. Le vieux sage demanda qu'on lui fournisse simplement un peu de riz pour ses vieux jours, et plus prcisment un nombre de grains de riz suffisant pour que l'on puisse en dposer 1 seul sur la premire case du jeu qu'il venait d'inventer, deux sur la suivante, quatre sur la troisime, et ainsi de suite jusqu' la 64e case.
crivez un programme Python qui affiche le nombre de grains dposer sur chacune des 64 cases du jeu. Calculez ce nombre de deux manires :

  • le nombre exact de grains (nombre entier)
  • le nombre de grains en notation scientifique (nombre rel)

5.2. Les donnes alphanumriques

Jusqu' prsent nous n'avons manipul que des nombres. Mais un programme d'ordinateur peut galement traiter des caractres alphabtiques, des mots, des phrases, ou des suites de symboles quelconques. Dans la plupart des langages de programmation, il existe pour cet usage une structure de donnes que l'on appelle chane de caractres (ou string en anglais).

5.2.1. Le type string (chane de caractres)

Sous Python, une donne de type string est une suite quelconque de caractres dlimite soit par des apostrophes (simple quotes), soit par des guillemets (double quotes).

Exemples :

 
Sélectionnez

>>> phrase1 = 'les oeufs durs.'
>>> phrase2 = '"Oui", rpondit-il,'
>>> phrase3 = "j'aime bien"
>>> print phrase2, phrase3, phrase1
"Oui", rpondit-il, j'aime bien les oeufs durs.

Les 3 variables phrase1, phrase2, phrase3 sont donc des variables de type string

Remarquez l'utilisation des guillemets pour dlimiter une chane dans laquelle il y a des apostrophes, ou l'utilisation d'apostrophes pour dlimiter une chane qui contient des guillemets. Remarquez aussi encore une fois que l'instruction print insre un espace entre les lments affichs.

Le caractre spcial \ (antislash) permet quelques subtilits complmentaires :

  • En premier lieu, il permet d'crire sur plusieurs lignes une commande qui serait trop longue pour tenir sur une seule (cela vaut pour n'importe quel type de commande).
  • A l'intrieur d'une chane de caractres, l'antislash permet d'insrer un certain nombre de codes spciaux (sauts la ligne, apostrophes, guillemets, etc.). Exemples :
 
Sélectionnez

>>> txt3 = '"N\'est-ce pas ?" rpondit-elle.'
>>> print txt3
"N'est-ce pas ?" rpondit-elle.
>>> Salut = "Ceci est une chane plutt longue\n contenant plusieurs lignes \
... de texte (Ceci fonctionne\n de la mme faon en C/C++.\n\
... Notez que les blancs en dbut\n de ligne sont significatifs.\n"
>>> print Salut
Ceci est une chane plutt longue
 contenant plusieurs lignes de texte (Ceci fonctionne
 de la mme faon en C/C++.
    Notez que les blancs en dbut
 de ligne sont significatifs.

Remarques :

  • La squence \n dans une chane provoque un saut la ligne.
  • La squence \' permet d'insrer une apostrophe dans une chane dlimite par des apostrophes
  • Rappelons encore ici que la casse est significative dans les noms de variables (Il faut respecter scrupuleusement le choix initial de majuscules ou minuscules).

Triple quotes :

Pour insrer plus aisment des caractres spciaux ou exotiques dans une chane, sans faire usage de l'antislash, ou pour faire accepter l'antislash lui-mme dans la chane, on peut encore dlimiter la chane l'aide de triples guillemets ou de triples apostrophes :

 
Sélectionnez

>>> a1 = """
... Usage: trucmuche[OPTIONS]
... { -h
... -H hte
... }"""
 
>>> print a1
Usage: trucmuche[OPTIONS]
{ -h
  -H hte
}

5.2.2. Accs aux caractres individuels d'une chane

Les chanes de caractres constituent un cas particulier d'un type de donnes plus gnral que l'on appelle des donnes composites. Une donne composite est une entit qui rassemble dans une seule structure un ensemble d'entits plus simples : dans le cas d'une chane de caractres, par exemple, ces entits plus simples sont videmment les caractres eux-mmes. En fonction des circonstances, nous souhaiterons traiter la chane de caractres, tantt comme un seul objet, tantt comme une collection de caractres distincts. Un langage de programmation tel que Python doit donc tre pourvu de mcanismes qui permettent d'accder sparment chacun des caractres d'une chane. Comme vous allez le voir, cela n'est pas bien compliqu :

Python considre qu'une chane de caractres est un objet de la catgorie des squences, lesquelles sont des collections ordonnes d'lments. Cela signifie simplement que les caractres d'une chane sont toujours disposs dans un certain ordre. Par consquent, chaque caractre de la chane peut tre dsign par sa place dans la squence, l'aide d'un index.

Pour accder un caractre bien dtermin, on utilise le nom de la variable qui contient la chane, et on lui accole entre deux crochets l'index numrique qui correspond la position du caractre dans la chane.

Attention, cependant : comme vous aurez l'occasion de le vrifier par ailleurs, les donnes informatiques sont presque toujours numrotes partir de zro (et non partir de un). C'est le cas pour les caractres d'une chane.

Exemple :

 
Sélectionnez

>>> ch = "Stphanie"
>>> print ch[0], ch[3]
S p

5.2.3. Oprations lmentaires sur les chanes

Python intgre de nombreuses fonctions qui permettent d'effectuer divers traitements sur les chanes de caractres (conversions majuscules/minuscules, dcoupage en chanes plus petites, recherche de mots, etc.). Nous approfondirons ce sujet un peu plus loin (voir page 121).

Pour l'instant, nous pouvons nous contenter de savoir qu'il est possible d'accder individuellement chacun des caractres d'une chane, comme cela a t expliqu ci-dessus. Sachons en outre que l'on peut aussi :

  • assembler plusieurs petites chanes pour en construire de plus grandes. Cette opration s'appelle concatnation et on la ralise sous Python l'aide de l'oprateur + (Cet oprateur ralise donc l'opration d'addition lorsqu'on l'applique des nombres, et l'opration de concatnation lorsqu'on l'applique des chanes de caractres. Exemple :

     
    Sélectionnez
    
    a = 'Petit poisson'
    b = ' deviendra grand'
    c = a + b
    print c
    petit poisson deviendra grand
    
  • dterminer la longueur (c'est--dire le nombre de caractres) d'une chane, en faisant appel la fonction intgre len() :

     
    Sélectionnez
    
    >>> print len(c)
    29
    
  • Convertir en nombre vritable une chane de caractres qui reprsente un nombre. Exemple :

     
    Sélectionnez
    
    >>> ch = '8647'
    >>> print ch + 45
        ==> *** erreur *** on ne peut pas additionner une chane et un nombre
    >>> n = int(ch)
    >>> print n + 65
    8712                      # OK : on peut additionner 2 nombres
    

    Dans cet exemple, la fonction intgre int() convertit la chane en nombre entier. Il serait galement possible de convertir une chane en nombre rel l'aide de la fonction float().

Exercices :

5.6. crivez un script qui dtermine si une chane contient ou non le caractre e .

5.7. crivez un script qui compte le nombre d'occurrences du caractre e dans une chane.

5.8. crivez un script qui recopie une chane (dans une nouvelle variable), en insrant des astrisques entre les caractres.
Ainsi par exemple, gaston devra devenir g*a*s*t*o*n

5.9. crivez un script qui recopie une chane (dans une nouvelle variable) en l'inversant. Ainsi par exemple, zorglub deviendra bulgroz .

5.10. En partant de l'exercice prcdent, crivez un script qui dtermine si une chane de caractres donne est un palindrome (c'est--dire une chane qui peut se lire indiffremment dans les deux sens), comme par exemple radar ou s.o.s . Grard

5.3. Les listes (premire approche)

Les chanes que nous avons abordes la rubrique prcdente constituaient un premier exemple de donnes composites, lesquelles sont utilises pour regrouper de manire structure des ensembles de valeurs. Vous apprendrez progressivement utiliser plusieurs autres types de donnes composites, parmi lesquelles les listes, les tuples et les dictionnaires.17 Nous n'allons cependant aborder ici que le premier de ces trois types, et ce de faon assez sommaire. Il s'agit l en effet d'un sujet fort vaste, sur lequel nous devrons revenir plusieurs reprises.

Sous Python, on peut dfinir une liste comme une collection d'lments spars par des virgules, l'ensemble tant enferm dans des crochets. Exemple :

 
Sélectionnez

>>> jour = ['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi']
>>> print jour
['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi']

Dans cet exemple, la valeur de la variable jour est une liste.


Comme on peut le constater dans l'exemple choisi, les lments qui constituent une liste peuvent tre de types varis. Dans cet exemple, en effet, les trois premiers lments sont des chanes de caractres, le quatrime lment est un entier, le cinquime un rel, etc. (Nous verrons plus loin qu'un lment d'une liste peut lui-mme tre une liste !). A cet gard, le concept de liste est donc assez diffrent du concept de tableau (array) ou de variable indice que l'on rencontre dans d'autres langages de programmation.

Remarquons aussi que comme les chanes de caractres, les listes sont des squences, c'est--dire des collections ordonnes d'objets. Les divers lments qui constituent une liste sont en effet toujours disposs dans le mme ordre, et l'on peut donc accder chacun d'entre eux individuellement si l'on connat son index dans la liste. Comme c'tait dj le cas pour les caractres dans une chane, il faut cependant retenir que la numrotation de ces index commence partir de zro, et non partir de un.

Exemples :

 
Sélectionnez

>>> jour = ['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi']
>>> print jour[2]
mercredi
>>> print jour[4]
20.357

A la diffrence de ce qui se passe pour les chanes, qui constituent un type de donnes nonmodifiables (nous aurons plus loin diverses occasions de revenir l-dessus), il est possible de changer les lments individuels d'une liste :

 
Sélectionnez

>>> print jour
['lundi', 'mardi', 'mercredi', 1800, 20.357, 'jeudi', 'vendredi']
>>> jour[3] = jour[3] +47
>>> print jour
['lundi', 'mardi', 'mercredi', 1847, 20.357, 'jeudi', 'vendredi']

On peut donc remplacer certains lments d'une liste par d'autres, comme ci-dessous :

 
Sélectionnez

>>> jour[3] = 'Juillet'
>>> print jour
['lundi', 'mardi', 'mercredi', 'Juillet', 20.357, 'jeudi', 'vendredi']

La fonction intgre len() , que nous avons dj rencontre propos des chanes, s'applique aussi aux listes. Elle renvoie le nombre d'lments prsents dans la liste :

 
Sélectionnez

>>> len(jour)
7

Une autre fonction intgre permet de supprimer d'une liste un lment quelconque ( partir de son index). Il s'agit de la fonction del()18 :

 
Sélectionnez

>>> del(jour[4])
>>> print jour
['lundi', 'mardi', 'mercredi', 'juillet', 'jeudi', 'vendredi']

Il est galement tout fait possible d'ajouter un lment une liste, mais pour ce faire, il faut considrer que la liste est un objet, dont on va utiliser l'une des mthodes. Les concepts informatiques d'objet et de mthode ne seront expliqus qu'un peu plus loin dans ces notes, mais nous pouvons ds prsent montrer comment a marche dans le cas particulier d'une liste :

 
Sélectionnez

>>> jour.append('samedi')
>>> print jour
['lundi', 'mardi', 'mercredi', 'juillet', 'jeudi', 'vendredi', 'samedi']
>>>

Dans la premire ligne de l'exemple ci-dessus, nous avons appliqu la mthode append() l'objet jour , avec l'argument 'samedi'. Si l'on se rappelle que le mot append signifie ajouter en anglais, on peut comprendre que la mthode append() est une sorte de fonction qui est en quelque manire attache ou intgre aux objets du type liste . L'argument que l'on utilise avec cette fonction est bien entendu l'lment que l'on veut ajouter la fin de la liste.

Nous verrons plus loin qu'il existe ainsi toute une srie de ces mthodes (c'est--dire des fonctions intgres, ou plutt encapsules dans les objets de type liste ). Notons simplement au passage que l'on applique une mthode un objet en reliant les deux l'aide d'un point. (D'abord le nom de la variable qui rfrence l'objet, puis le point, puis le nom de la mthode, cette dernire toujours accompagne d'une paire de parenthses).

Comme les chanes de caractres, les listes seront approfondies plus loin dans ces notes (voir page 132). Nous en savons cependant assez pour commencer les utiliser dans nos programmes. Veuillez par exemple analyser le petit script ci-dessous et commenter son fonctionnement :

 
Sélectionnez

jour = ['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi']
a, b = 0, 0
while a<25:
    a = a + 1
    b = a % 7
    print a, jour[b]

La 5e ligne de cet exemple fait usage de l'oprateur modulo dj rencontr prcdemment et qui peut rendre de grands services en programmation. On le reprsente par % dans de nombreux langages (dont Python). Quelle est l'opration effectue par cet oprateur ?


Exercices :

5.11. Soient les listes suivantes :

 
Sélectionnez

t1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
t2 = ['Janvier', 'Fvrier', 'Mars', 'Avril', 'Mai', 'Juin',
'Juillet', 'Aot', 'Septembre', 'Octobre', 'Novembre', 'Dcembre']

crivez un petit programme qui cre une nouvelle liste t3. Celle-ci devra contenir tous les lments des deux listes en les alternant, de telle manire que chaque nom de mois soit suivi du nombre de jours correspondant : ['Janvier',31,'Fvrier',28,'Mars',31, etc...].

5.12. crivez un programme qui affiche proprement tous les lments d'une liste. Si on l'appliquait par exemple la liste t2 de l'exercice ci-dessus, on devrait obtenir :

 
Sélectionnez

Janvier   Fvrier   Mars   Avril   Mai   Juin   Juillet   Aot   Septembre   Octobre  Novembre   Dcembre

5.13. crivez un programme qui recherche le plus grand lment prsent dans une liste donne. Par exemple, si on l'appliquait la liste [32, 5, 12, 8, 3, 75, 2, 15], ce programme devrait afficher :

 
Sélectionnez

le plus grand lment de cette liste a la valeur 75.

5.14. crivez un programme qui analyse un par un tous les lments d'une liste de nombres (par exemple celle de l'exercice prcdent) pour gnrer deux nouvelles listes. L'une contiendra seulement les nombres pairs de la liste initiale, et l'autre les nombres impairs. Par exemple, si la liste initiale est celle de l'exercice prcdent, le programme devra construire une liste pairs qui contiendra [32, 12, 8, 2], et une liste impairs qui contiendra [5, 3, 75, 15]. Astuce : pensez utiliser l'oprateur modulo (%) dj cit prcdemment.

5.15. crivez un programme qui analyse un par un tous les lments d'une liste de mots (par exemple : ['Jean', 'Maximilien', 'Brigitte', 'Sonia', 'Jean-Pierre', 'Sandra'] pour gnrer deux nouvelles listes. L'une contiendra les mots comportant moins de 6 caractres, l'autre les mots comportant 6 caractres ou davantage.

17 Vous pourrez mme crer vos propres types de donnes composites, lorsque vous aurez assimil le concept de classe (voir page 152).

18 Il existe en fait tout un ensemble de techniques qui permettent de dcouper une liste en tranches, d'y insrer des groupes d'lments, d'en enlever d'autres, etc., en utilisant une syntaxe particulire o n'interviennent que les index. Cet ensemble de techniques (qui peuvent aussi s'appliquer aux chanes de caractres) porte le nom gnrique de slicing (tranchage). On le met en oeuvre en plaant plusieurs indices au lieu d'un seul entre les crochets que l'on accole au nom de la variable. Ainsi jour[1:3] dsigne le sous-ensemble ['mardi', 'mercredi'].
Ces techniques un peu particulires sont dcrites plus loin (voir pages 121 et suivantes).


prcdentsommairesuivant

Licence Creative Commons
Le contenu de cet article est rédigé par Gérard Swinnen et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.