Click here to load reader

Les types utilisateurs (Python) Corrigécregut.perso.enseeiht.fr/ENS/2015-apad-algo1/algo1-apad-2015-s2... · à des types structurés définis par le programmeur lui-même (ou qu’il

Embed Size (px)

Citation preview

  • PAD INPT

    ALGORITHMIQUE ET PROGRAMMATION 1

    Cours Python, Semaine 2

    avrilmai 2016

    Les types utilisateurs (Python)Corrig

    RsumCe document dcrit comment traduire en Python les types utilisateur du langage algo-

    rithmique. Il commence par dcrire les principaux types prdfinis en Python.

    Table des matires1 Types fondamentaux structurs 3

    1.1 Les listes (list) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.1 Cration de listes et accs ses lments . . . . . . . . . . . . . . . . . 31.1.2 Extraction de sous-listes (oprateur :) . . . . . . . . . . . . . . . . . . 41.1.3 Oprateurs + et * . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.4 Procdures et fonctions ddies (mthodes) . . . . . . . . . . . . . . . . 4

    1.2 Les tuples (tuple) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3 Chanes de caractres (str) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    2 Types numrs 92.1 Solution 1 : des constantes entires affectes un tuple . . . . . . . . . . . . . . 92.2 Solution 2 : la classe Enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    3 Les tableaux 113.1 Tableaux une dimension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    3.1.1 Cration (liste) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.1.2 Constantes de type tableau (tuple) . . . . . . . . . . . . . . . . . . . . . 113.1.3 Parcours dun tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.1.4 Affectation dun tableau un autre . . . . . . . . . . . . . . . . . . . . . 123.1.5 Comparaison entre tableau . . . . . . . . . . . . . . . . . . . . . . . . . 12

    3.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.3 Chanes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.4 Tableaux plusieurs dimensions . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    4 Les enregistrements 154.1 Dfinition du type (classe) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154.2 Cration de variables (instances) . . . . . . . . . . . . . . . . . . . . . . . . . . 164.3 Accs aux attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.4 Duplication dune variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    Cours Python, Semaine 2 c INPTPAD 1/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    Liste des exercicesExercice 1 : Initialiser un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Exercice 2 : Afficher un tableau dentier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    Cours Python, Semaine 2 c INPTPAD 2/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    Au-del des types fondamentaux lmentaires que sont les types numriques entiers (int) etrels (float), les chanes de caractres (str) et les boolens (bool), le langage Python disposede types fondamentaux structurs, cest--dire dont une variable de ce type contient non pas uneunique valeur lmentaire mais plusieurs valeurs la fois. Nous allons prciser ici les modalitsdutilisation des listes (list), trs utilises en Python, et des tuples (tuple) qui peuvent tre vuscomme un cas particulier de liste (liste constante).

    Nous dcrirons galement quelques types-utilisateurs (ou types personnaliss) correspondant des types structurs dfinis par le programmeur lui-mme (ou quil rcupre dans des modulesdfinis par dautres programmeurs) pour modliser le problme quil cherche rsoudre : lesnumrations, les tableaux et les enregistrements (ou agrgats).

    Dans le cadre de cet enseignement, nous naurons pas le temps de dvelopper les classes(class), qui constituent une des volutions les plus fondamentales de lalgorithmique (algorith-mique oriente objet) unifiant dans un mme concept la reprsentation des informations (classe= type-objet, instances = variables-objets) et leur manipulation par des sous-programmes (lesservices ou mthodes associs chaque classe dobjet). Nous en verrons cependant quelques no-tions dans la mesure o Python est un langage orient objet, et que tous les types que nous avonsvus jusqu prsent ou allons aborder partir de maintenant sont en ralit des classes !

    1 Types fondamentaux structurs

    1.1 Les listes (list)Une liste est en ensemble ordonn dlments accessibles chacun par leur rang (ou index) en

    son sein. En Python, le type de chacun des lments peut tre quelconque, y compris dans unemme liste. Mais en pratique, les listes sont essentiellement des ensembles homognes consti-tues dlments de mme type. Elles correspondent la notion algorithmique de tableau mono-dimensionnel.

    1.1.1 Cration de listes et accs ses lments

    Une premire manire de dfinir une liste est de le faire par extension, cest--dire en donnantles valeurs des lments qui la composent.

    >>> maListe = [1, 3, 5, 7] # dfinition par extension en utilisant les crochets>>> maListe[1, 3, 5, 7]>>> maListe[0] # accs par le rang. ATTENTION : le rang du premier lment est toujours 0 !1>>> len(maListe) # la function len (pour length) renvoie le nombre dlments dune liste4>>> maListe[4] # erreur si tentative daccs au-del de la fin de la listeTraceback (most recent call last):File "", line 1, in

    IndexError: list index out of range>>> maListe[3] # lindice du dernier lments dune liste est la longueur de la liste moins 17>>> maListe[-1] # les rangs ngatifs sont possibles : rfrence arrire partir de la fin7

    Cours Python, Semaine 2 c INPTPAD 3/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    >>> maListe[-4] # autre manire (inhabituelle) daccder au premier lment !1

    1.1.2 Extraction de sous-listes (oprateur :)

    >>> maListe[1:3] # rcupration dune sous-liste en prcisant rang de dbut et rang de fin (exclu)[3, 5]>>> maListe[1:] # loprateur : (appel slice) permet de rcuprer une partie de liste : droite ...[3, 5, 7]>>> maListe[:3] # ... ou gauche dune position de rfrence (exclue dans ce dernier cas) ...[1, 3, 5]>>> maListe[:] # ... ou mme toute la liste, ce qui est trs utile pour dupliquer une liste (cf. + bas)[1, 3, 5, 7]

    On peut aussi dfinir une liste par comprhension en donnant une proprit vrifie par seslments partir dun itrateur dans un intervalle.

    >>> autreListe = [i for i in range(1,10,2)] # dfinition par comprhension avec un itrateur>>> autreListe[1, 3, 5, 7, 9]>>> maListe = autreListe # ATTENTION : cette affectation cre un ALIAS sur autreListe ...>>> maListe[1, 3, 5, 7, 9]>>> maListe[4] = 11 # ... si on modifie un lment de maListe ...>>> maListe[1, 3, 5, 7, 11]>>> autreListe # ... autreListe est aussi modifie ! maListe et autreListe sont 2 noms dune mme liste[1, 3, 5, 7, 11]>>> maListe = autreListe[:] # CECI EST LA BONNE MANIERE DE DUPLIQUER UNE LISTE>>> maListe[4]=9>>> maListe[1, 3, 5, 7, 9]>>> autreListe[1, 3, 5, 7, 11]

    1.1.3 Oprateurs + et *

    On peut fabriquer une nouvelle liste par concatnation de 2 listes existantes avec loprateur+.

    >>> grosseListe = maListe + autreListe>>> grosseListe[1, 3, 5, 7, 9, 1, 3, 5, 7, 11]

    On peut aussi utiliser loprateur * en multipliant une liste de base.>>> listeAvecMotif = 5 * [1,2,3]>>> listeAvecMotif[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

    1.1.4 Procdures et fonctions ddies (mthodes)

    On peut effectuer sur toute liste des oprations prdfinies (mthodes) en utilisant la nota-tion pointe : la liste concerne, suivie dun point, suivi du nom de lopration, suivi de paren-thses (soit vides, soit avec la mention dun ou plusieurs paramtres). Voir exemples ci-dessous.

    Taper help(list) pour afficher laide associe au type list et afficher la liste des mthodes(procdures et fonctions) associes (ne pas tenir compte des mthodes __prfixes et suffixes__

    Cours Python, Semaine 2 c INPTPAD 4/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    avec 2 caractres underscores). Ces mthodes correspondent soit des procdures (qui ne ren-voient aucun rsultat - mention -> None ci-dessous), soit des fonctions (qui renvoient un rsultat- par exemple un entier pour les fonctions count et index, ou une liste pour la fonction copy).

    Mthodes-procdures associes aux listes, qui modifient la liste L sur laquelle porte laprocdure :

    L.append(object) -> None -- append object to endL.clear() -> None -- remove all items from LL.extend(iterable) -> None -- extend list by appending items from the iterableL.insert(index, object) -- insert object before indexL.remove(value) -> None -- remove first occurrence of value.L.reverse() -- reverse *IN PLACE*L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*

    Mthodes-fonctions associes aux listes, qui ne modifient gnralement pas la liste L surlaquelle porte la fonction (sauf cas particulier de la fonction pop qui retire un lment de la listeen le renvoyant comme rsultat) :

    L.copy() -> list -- a shallow copy of LL.count(value) -> integer -- return number of occurrences of valueL.index(value, [start, [stop]]) -> integer -- return first index of value.L.pop([index]) -> item -- remove and return item at index (default last).

    Voici quelques exemples dutilisation :>>> maListe = list() # cration dune liste vide. Autre faon : maListe = []>>> maListe[]>>> maListe.append(11) # ajout de llment 11 en fin de liste>>> maListe[11]>>> maListe.extend(range(21,100,10)) # ajout dun ensemble dlments en fin>>> maListe[11, 21, 31, 41, 51, 61, 71, 81, 91]>>> maListe.remove(51) # retrait dun lment spcifi par sa valeur>>> maListe[11, 21, 31, 41, 61, 71, 81, 91]>>> maListe.insert(4,21) # insertion dun lment une position choisie>>> maListe[11, 21, 31, 41, 21, 61, 71, 81, 91]>>> maListe.remove(61)>>> maListe[11, 21, 31, 41, 21, 71, 81, 91]>>> maListe.count(21) # renvoi du nombre doccurrences dun lment2>>> maListe.count(100) # renvoie 0 si llment nest pas dans la liste0>>> maListe.pop() # renvoi du dernier lment en le supprimant de la liste91>>> maListe[11, 21, 31, 41, 21, 71, 81]>>> maListe.index(41) # renvoi de la positon dun lment spcifi3>>> maListe.pop(3) # retrait (et renvoi) dun lment la position indique41>>> maListe[11, 21, 31, 21, 71, 81]>>> maListe.reverse() # inversion de lordre de la liste>>> maListe[81, 71, 21, 31, 21, 11]>>> maListe.sort() # tri de la liste par valeurs croissantes

    Cours Python, Semaine 2 c INPTPAD 5/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    >>> maListe[11, 21, 21, 31, 71, 81]>>> maListe.clear()>>> maListe[]

    1.2 Les tuples (tuple)Les tuples sont des listes dont le contenu nest pas modifiable (on dit immutable en

    Python, par opposition aux listes dont le contenu est mutable). Ainsi, tout ce qui a t dit surles listes sapplique aux tuples, lexception des procdures et fonctions destines modifier laliste sur laquelle elles portent. On pourra ainsi utiliser les fonctions copy, count et index.

    Les tuples sont crs et reprsents avec des parenthses au lieu de crochets. Les oprationsdaccs un lment ou une sous-partie dun tuple utilisent les crochets comme pour les listes.

    Leur nom est une gnralisation des termes couple (2 lments), triplet (3 lments),quadruplet (4 lments) ...n-uplet ou t-uplet (nombre quelconque n ou t dlments).

    >>> monTuple = tuple(range(1,11)) # creation dun tuple partir dun range>>> monTuple(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)>>> monTuple[0] # accs un element avec les crochets1>>> monTuple[3:5] # accs une sous partie avec les crochets et le slice (:)(4, 5)>>> monTuple[-1] # accs au dernier lment10>>> len(monTuple) # usage de la function len(gth)10>>> monTuple[3] = 44 # tentative de modification dun lment => ERREUR !Traceback (most recent call last):File "", line 1, in

    TypeError: tuple object does not support item assignment>>> monTuple = (11,21,31) # si on le raffecte, on perd le tuple initial>>> monTuple(11, 21, 31)

    1.3 Chanes de caractres (str)En Python, une chane de caractres (str) peut tre vu comme un cas particulier de tuple :

    liste non modifiable de caractres.En outre, les lments (caractres) ne sont pas spars par des virgules et espaces, et les

    valeurs utilisent les "guillemets" ou quotes au lieu des parenthses.Enfin, le type str dispose de trs nombreuses mthodes additionnelles pour manipuler les

    chanes de caractres. Taper help(str) pour en avoir la liste. En voici un extrait, class par cat-gories :

    Fonctions sur les minuscule/majuscules renvoyant une nouvelle chane S.lower() : Return a copy of the string S converted to lowercase. S.swapcase() : Return a copy of S with uppercase characters converted to lowercase and

    vice versa.

    Cours Python, Semaine 2 c INPTPAD 6/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    S.title() : Return a titlecased version of S S.upper() : Return a copy of the string S converted to upper case.

    Fonctions de recherche et comptage renvoyant un entier S.count(sub[, start[, end]]) : Return the number of non-overlapping occurrences of sub-

    string sub in string S[start :end]. Optional arguments start and end are interpreted as inslice notation.

    S.find(sub[, start[, end]]) : Return the lowest index in S (or -1) where substring sub isfound.

    S.rfind(sub[, start[, end]]) : Return the highest index in S (or -1) where substring sub isfound

    S.index(sub[, start[, end]]) : Like S.find() but raise ValueError when substring sub notfound.

    S.rindex(sub[, start[, end]]) : Like S.rfind() but raise ValueError when the substring is notfound.

    Fonctions de test renvoyant un boolen S.endswith(suffix[, start[, end]]) : Return True if S ends with the specified suffix S.startswith(prefix[, start[, end]]) : Return True if S starts with the specified prefix S.isalnum() : Return True if all characters in S are alphanumeric S.isalpha() : Return True if all characters in S are alphabetic S.isdecimal() : Return True if there are only decimal characters in S S.isdigit() : Return True if all characters in S are digits S.isidentifier() : Return True if S is a valid identifier according to the language definition. S.islower() : Return True if all cased characters in S are lowercase S.isnumeric() : Return True if there are only numeric characters in S S.istitle() : Return True if S is a titlecased S.isupper() : Return True if all cased characters in S are uppercase

    Fonctions de formatage renvoyant une nouvelle chane S.center(width[, fillchar]) : Return S centered in a string of length width. Padding is done

    using the specified fill character (default is a space) S.ljust(width[, fillchar]) : Return S left-justified in a Unicode string of length width. Pad-

    ding is done using the specified fill character (default is a space). S.rjust(width[, fillchar]) : Return S right-justified in a string of length width. Padding is

    done using the specified fill character (default is a space). S.format(*args, **kwargs) : Return a formatted version of S, using substitutions from

    args and kwargs. The substitutions are identified by braces ( and ). S.join(iterable) : Return a string which is the concatenation of the strings in the iterable.

    The separator between elements is S. S.replace(old, new[, count]) : Return a copy of S with all occurrences of substring old

    replaced by new. If the optional argument count is given, only the first count occurrences

    Cours Python, Semaine 2 c INPTPAD 7/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    are replaced. S.lstrip([chars]) : Return a copy of the string S with leading whitespace (or chars) remo-

    ved. S.rstrip([chars]) : Return a copy of the string S with trailing whitespace (or chars) remo-

    ved. S.strip([chars]) : Return a copy of the string S with leading and trailing whitespace (or

    chars) removed. S.zfill(width) : Pad a numeric string S with zeros on the left, to fill a field of the specified

    width. The string S is never truncated.

    Fonctions de sparation en morceaux renvoyant une liste de chanes S.partition(sep) -> (head, sep, tail) Search for the separator sep in S, and return the part

    before it, the separator itself, and the part after it. If the separator is not found, return Sand two empty strings.

    S.rpartition(sep) -> (head, sep, tail) Search for the separator sep in S, starting at theend of S, and return the part before it, the separator itself, and the part after it. If theseparator is not found, return two empty strings and S.

    S.rsplit(sep=None, maxsplit=-1) -> list of strings Return a list of the words in S, usingsep as the delimiter string, starting at the end of the string and working to the front

    S.split(sep=None, maxsplit=-1) -> list of strings Return a list of the words in S, usingsep as the delimiter string. If maxsplit is given, at most maxsplit splits are done. If sepis not specified or is None, any whitespace string is a separator and empty strings areremoved from the result.

    S.splitlines([keepends]) -> list of strings Return a list of the lines in S, breaking at lineboundaries. Line breaks are not included in the resulting list unless keepends is given andtrue.

    Et voici quelques exemples dutilisation de ces fonctions.>>> ch =" le langage Python ">>> ch le langage Python >>> ch[0] >>> ch[-7:-1]Python>>> len(ch)19>>> ch[0]="1" # ON NE PEUT PAS MODIFIER UNE CHAINE !Traceback (most recent call last):File "", line 1, in

    TypeError: str object does not support item assignment>>> ch.count("a")2>>> ch.index(P)12>>> ch.center(40,"=")========== le langage Python ===========>>> ch.count(" ")4>>> ch.upper()

    Cours Python, Semaine 2 c INPTPAD 8/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    LE LANGAGE PYTHON >>> ch.lower() le langage python >>> ch.swapcase() LE LANGAGE pYTHON >>> ch.strip() # suppression des espaces de tte et de queuele langage Python>>> ch.find("Py") # la chane "Py" est prsente12>>> ch.find("Langage") # la chane "Langage" (avec L majuscule) est absente-1>>> ch.isalpha()False>>> ch.replace(" ","-") # RAPPEL : la chane ch elle-mme nest pas modifie-le-langage-Python->>> ch.replace(" ","0")0le0langage0Python0>>> ch.replace(" ","0").isalnum() # on peut enchaner plusieurs appelsTrue>>> "123".zfill(6) # on peut utiliser une fonction directement sur une chane000123>>> ch.partition("Py")( le langage , Py, thon )>>> ch.split(" ")[, le, langage, Python, ]

    2 Types numrsLes types numrs nexistent pas directement en Python, mais il y a plusieurs manires de

    les reprsenter. Nous prsentons ici les 2 moyens les plus simples.

    2.1 Solution 1 : des constantes entires affectes un tupleDans le principe, on dfinit autant de variables (crites en majuscules) que de symboles du

    type numr :LUNDI = 0 ; MARDI = 0 ; ...

    On peut faire plus simple en utilisant une affectation multiple, ce que permet Python :LUNDI,MARDI,MERCREDI,JEUDI,VENDREDI,SAMEDI,DIMANCHE=0,1,2,3,4,5,6,7

    En fait, lcriture ci-dessus correspond une affectation unique de 2 tuples de 7 lments car,en Python, un tuple peut aussi scrire sans les parenthses habituelles.

    Il est galement possible de faire une double affectation :JOURS=LUNDI,MARDI,MERCREDI,JEUDI,VENDREDI,SAMEDI,DIMANCHE=0,1,2,3,4,5,6,7

    Ces 2 affectations se font de droite gauche : La 1re affecte le tuple de valeurs numriques au tuple de variables La 2nd affecte les valeurs du tuple de variables la variable-tuple JOURSOn peut enfin utiliser un itrateur range plutt que dcrire une une les valeurs, ce qui permet

    davoir lcriture finale suivante :JOURS = LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE = range(7)

    Cours Python, Semaine 2 c INPTPAD 9/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    Pour les mois de lanne, dont on veut que le premier corresponde 1, on peut crire :MOIS = JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN,\

    JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DCEMBRE = range(1,13)

    Remarque :Lorsquon veut scinder en 2 lignes physiques une longue ligne logique , on peut utiliser

    le caractre antislash (\).Lutilisation du tuple JOURS permet de pouvoir parcourir toutes les valeurs de lnumra-

    tion :>>> for j in JOURS : print(j,end=", ")0, 1, 2, 3, 4, 5, 6,

    Une limite de cette solution est quon nest pas protg contre un ventuel changement devaleur de lune ou lautre des constantes (par exemple, MARDI = 0 ne soulve aucune erreur ...).

    2.2 Solution 2 : la classe EnumDepuis la version 3.4 de Python, on peut utiliser le module enum (en minuscules) qui dfinit

    une classe Enum (avec un E majuscule) :from enum import Enum # importer la classe Enum depuis le module enumJOURS = Enum(JOURS,LUNDI MARDI MERCREDI JEUDI VENDREDI SAMEDI DIMANCHE)

    Il faut dabord importer la classe Enum du module enum (une fois pour toutes) avec linstructionimport. Puis on dfinit lnumration sous forme de variable JOURS, en spcifiant comme para-mtres de type chanes de caractres, dune part le nom de cette variable (qui doit tre identique),dautre part la liste des valeurs symboliques de lnumration spares par un espace.

    Comme prcdemment, on pourra parcourir toutes les valeurs de lnumration :>>> for j in JOURS : print(j)JOURS.LUNDIJOURS.MARDIJOURS.MERCREDIJOURS.JEUDIJOURS.VENDREDIJOURS.SAMEDIJOURS.DIMANCHE

    On remarque que llment j nest pas un entier mais un nom symbolique prfix par le nomde lnumration elle-mme. Il faudra toujours utiliser le prfixe JOURS. quand on voudra utiliserlune ou lautre des valeurs symboliques de lnumration. Ceci a lavantage de ne pas confondreles valeurs dnumration dans le cas o elles seraient utilises dans dautres numrations. Parexemple :

    >>> WEEK_END = Enum(WEEK_END,SAMEDI DIMANCHE)>>> WEEK_END.DIMANCHE

    >>> JOURS.DIMANCHE

    Cette solution doit tre privilgie car elle garantit que les constantes symboliques ne pour-ront pas tre modifie : une tentative daffectation JOURS.MARDI = 0 soulve une erreur.

    Pour plus de dtails sur le module enum, voir : https://www.python.org/dev/peps/pep-0435/

    Cours Python, Semaine 2 c INPTPAD 10/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    3 Les tableaux

    3.1 Tableaux une dimensionLusage algorithmique que lon fait dun tableau monodimensionnel correspond exactement

    au type liste (list) de Python. Se reporter au dbut de ce document pour voir lutilisation deslistes en Python.

    3.1.1 Cration (liste)

    En algorithmique, on a pris lhabitude de spcifier une taille maximale a priori pour les ta-bleaux, car un certains nombres de langages obligent cela. On peut lcrire ainsi en PYTHON :

    CAPACITE = int(10) # nombre maximal dlments du tableau lire)tableau = CAPACITE*[0]) # le tableau : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    On cre ainsi une liste contenant un nombre dlments gal la constante CAPACITE,chaque lment tant spcifi en tant que liste dun seul lment (entre les crochets), icilentier 0. On aurait pu mettre int(), ou int(0) la place, ou encore mettre une autre valeurdinitialisation (1 par exemple).

    On pourra ensuite affecter les valeurs dsires chaque lment du tableau avec une affecta-tion tableau[i], i tant son indice entre 0 et 9 ici.

    Puisquun tableau est une liste, on peut le crer avec dautres manires vues pour les listes,par exemple :

    tab = list(range(CAPACITE)) # cre [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]tab = list(range(1,CAPACITE+1)) # cre [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]tab = [i**2 for i in range(5)] # cre [0, 1, 4, 9, 16]

    On peut galement ne pas spcifier de taille priori et dagrandir le tableau au fur et mesuredes besoins, par exemple en utilisant les fonctions ddies append ou extent vues avec les listes.

    3.1.2 Constantes de type tableau (tuple)

    Si lon veut crer des tableaux constants, utiliser un tuple plutt quune liste, puisquun tuplea prcisment la proprit de ne pas tre modifiable. Par exemple, pour le nombre de jours quecontient chaque mois dune anne non bissextile :

    NB_JOURS_MOIS = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)NUM_MOIS = tuple(range(1,13)) # cre (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

    Attention : On rappelle que lindice du 1er lment dun tableau vaut toujours 0 !

    3.1.3 Parcours dun tableau

    On peut utiliser une classique boucle for avec un indice variant de 0 la taille du tableau :tab = list(10*(i+1) for i in range(CAPACITE))for i in range(CAPACITE) :

    print (tab[i],end=" ")print () # la boucle affiche : 10 20 30 40 50 60 70 80 90 100

    Cours Python, Semaine 2 c INPTPAD 11/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    On peut aussi utiliser une boucle utilisant directement les lments du tableau. Ceci est trsclassique en Python :

    for element in tab :print (element,end=" ")

    print ()# la boucle affiche : 10 20 30 40 50 60 70 80 90 100

    On a enfin la possibilit dune boucle donnant la fois lindex et llment (trs classiqueaussi) :

    for i, element in enumerate(tab) :print ("tab[",i,"] =", element)

    Cette boucle affichera tab[ 0 ] = 10, puis tab[ 1 ] = 20, ... jusqu tab[ 9 ] = 100.

    3.1.4 Affectation dun tableau un autre

    Pour mmoire, rappelons que faire une affectation directe dune liste une autre ne fait quecrer un nouvel alias qui dsigne la mme liste que celle dorigine. Donc, ne pas oublier de passerpar la notation suivante :

    nouveauTableau = tableau[:] # et non : nouveauTableau = tableau

    3.1.5 Comparaison entre tableau

    Lcriture nouveauTableau == tableau fonctionne en Python. Elle effectue une comparaison l-ment par lment. Dans le cas o la taille effective du tableau est plus petite que la taille maximaleprvue, cela fonctionne aussi dans la mesure o les lments non utiliss ont t initialiss zro.

    3.2 Exemples

    Exercice 1 : Initialiser un tableauInitialiser astucieusement un tableau de 10 entiers pour quil contienne les valeurs suivantes :

    1 2 3 4 5 6 7 8 9 10

    Solution : Si on considre un tableau dfinit par :1 Type2 Vecteur = Tableau [1..10] De Entier

    On constate que la valeur de la case dindice i est justement i. Pour initialiser un vecteur, il suffitdonc de parcourir les entiers de 1 10 pour remplir la case correspondante.

    1 Variable2 tab: Vecteur3 indice: Entier4 Dbut5 Pour indice

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    1 # -*- coding: utf-8 -*-2 """3 ROLE : Initialiser un tableau avec, dans lordre, les valeurs :4 1, 2, 3, 4, 5, 6, 7, 8, 9 et 10.5 Un tableau monodimensionnel est gr avec le type list.6 Un tableau CONSTANT peut tre gre avec le type tuple.7 NOTA : il y a plusieurs manires deffectuer cette initialisation8 AUTEUR : Claude Monteil 9 VERSION : 1.0 - 04/2016

    10 """11 # CONSTANTE12 CAPACITE = int(10) # nombre dlments du tableau13 print ("PLUSIEURS MANIERES DINITIALISER UNE TABLEAU de TYPE list :")14 #1.15 print ("1.en listant les lments : tab1 = [1,2,3,4,5,6,7,8,9,10]")16 tab1 = [1,2,3,4,5,6,7,8,9,10]17 print (" tab1 =",tab1)18 #2.19 print ("2.en utilisant range : tab2 = list(range(1,11))")20 tab2 = list(range(1,CAPACITE+1))21 print (" tab2 =",tab2)22 #3.23 print ("3.en ajoutant successivement les lments avec tab3.append(i) :")24 tab3 = list() # cration dune liste vide ; ou encore : tab3 = []25 for i in range(1,CAPACITE+1) :26 tab3.append(i)27 print (" tab3 =",tab3)28 #4.29 print ("4.en crant une liste de", CAPACITE, "lments : tab4 = CAPACITE*[0]")30 tab4 = CAPACITE*[0]31 print (" tab4 =",tab4)32 print (" puis en les affectant chacun sparment avec tab4[i-1] :")33 for i in range(1,11) :34 tab4[i-1] = i # attention : le premier lment est toujours tab4[0]35 print (" tab4 =",tab4)36 print ("ATTENTION : le 1er lment dune liste a toujours pour indice 0 !")37 print()38 #5.LE TYPE TUPLE (avec des parenthses) permet de grer des constantes-tableaux39 print ("TABLEAU CONSTANT : TYPE tuple AVEC DES PARENTHESES ET NON DES CROCHETS :")40 print ("1.en listant les lments : tuple1 = (1,2,3,4,5,6,7,8,9,10)")41 tuple1 = (1,2,3,4,5,6,7,8,9,10)42 print(" tuple1 =",tuple1)43 #6.44 print ("2.en utilisant range : tuple2 = tuple(range(1,11))")45 tuple2 = tuple(range(1,11))46 print (" tuple2 =",tuple2)47 #7.on ne peut pas affecter ou modifier un tuple une fois cr48 print ("On ne peut pas utiliser append avec un tuple : tester tuple1.append(11))")49 print ("On ne peut pas affecter un lment dun tuple: tester tuple1[0]=11")

    Exercice 2 : Afficher un tableau dentiercrire un programme qui affiche tous les lments dun tableau de capacit MAX (gale 10)mais dont la taille effective (cest--dire le nombre dlments utiles) est donn par la variablenb.

    Les lments du tableau seront crits entre crochets, dans lordre croissant de leur indice etspars par des points-virgules. Voici quelques exemples :

    1 [] -- un tableau vide (de taille effective nulle)2 [ 1; 2; 3] -- tableau contenant les 3 valeurs 1, 2 et 3.3 [ 421 ] -- tableau contenant la seule valeur 421

    Cours Python, Semaine 2 c INPTPAD 13/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    Solution : On constate que lon ne peut pas afficher directement chaque lment du tableau car lepoint-virgule ne doit pas tre mis aprs le dernier lment. le principe est donc dafficher dabordle premier lment puis, pour tous les lments suivants, dafficher le point-virgule sparateur etllment lui-mme. Ceci ne peut bien sr tre fait que si le tableau contient au moins un lment.

    3.3 Chanes de caractresLe type chane de caractres (str) a t prsent en section 1.3.

    3.4 Tableaux plusieurs dimensionsPour des usages simples, un tableau deux dimensions consistera en une liste de listes.Voici lexemple dun code crant une grille de 5 lignes et 7 colonnes :

    1 NB_LIGNES = int(5) ; NB_COLONNES = int(7) # par exemple23 #1.CREATION DE LA GRILLE4 print ("1.initialisation dune grille vierge ( 0)")5 #1.1.initialisation avec des entiers tous gaux 0 (par exemple)6 grille = [] # liste vide7 for ligne in range(NB_LIGNES) : # ajout dune liste vierge pour chaque ligne8 grille.append(list(NB_COLONNES*[0])) # initialisation avec des entiers9 #1.2.affichage de la grille ligne par ligne

    10 for ligne in range(len(grille)) : # affichage de la ligne courante11 print (grille[ligne])1213 #2.ACCES A CHAQUE ELEMENT : usage de grille[ligne][colonne]14 print ("2.accs chaque lment : grille[ligne][colonne]")15 for i in range(NB_LIGNES) :16 for j in range(NB_COLONNES) :17 grille[i][j] = 10 * (i+1) + (j+1)18 print (grille[i])

    Lxcution de ce programme donne :1.initialisation dune grille vierge ( 0)[0, 0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0][0, 0, 0, 0, 0, 0, 0]2.accs chaque lment : grille[ligne][colonne][11, 12, 13, 14, 15, 16, 17][21, 22, 23, 24, 25, 26, 27][31, 32, 33, 34, 35, 36, 37][41, 42, 43, 44, 45, 46, 47][51, 52, 53, 54, 55, 56, 57]

    Pour des usages plus spcialiss (en particulier dans le cas de calculs numriques avec desmatrices), il sera prfrable dutiliser le module numpy qui met disposition le type array.

    Cours Python, Semaine 2 c INPTPAD 14/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    4 Les enregistrementsLes enregistrements (ou agrgats) en Python sont un cas particulier trs simplifi de la no-

    tion de classes : on peut les dfinir comme une classe non munie de mthodes, cest--dire unestructure de donnes uniquement, non associe des procdures et fonctions permettant de lamanipuler.

    Dans la pratique, les enregistrements ne sont jamais utiliss, ce seront toujours des classesdisposant dun ensemble de mthodes adaptes, comme par exemple ce que lon a vue pour leslistes, les tuples et les chanes de caractres.

    4.1 Dfinition du type (classe)Voici comment dfinir un enregistrement Date dont chaque variable contiendra 3 attributs (le

    jour, le mois et lanne, tous trois de type entier).class Date : # dfinition dune classe = type-objet en Python

    def __init__ (outSelf,inJour, inMois, inAn) : # le nom __init__ est impos"""ROLE : initialise une nouvelle Date outSelf avec les infos indiquesENTREE inJour, inMois, inAn : int # paramtres donner chaque appelSORTIE outSelf : Date # la variable-objet qui sera initialise)"""outSelf.jour = int(inJour) # numero du jour dans le moisoutSelf.mois = int(inMois) # numero du mois dans lanneeoutSelf.annee= int(inAn) # numero de lannee

    # chaque variable de type Date aura les 3 attributs .jour, .mois et .annee

    On dtaillera en semaine 3 ce que sont les procdures et les fonctions. Pour le moment,retenons que le mot-cl def permet de dfinir ici une procdure nomme __init__ contenant 4paramtres :

    outSelf : cest la variable-objet qui sera initialise chaque appel cette procdure ;comme la procdure va dfinir compltement son nouvel tat, elle est en sortie de laprocdure, do le prfixe out devant son nom. La suite du nom, Self, correspond uneconvention largement utilise en Python pour dsigner ce paramtre

    inJour, inMois et inAn correspondent 3 entiers dont la valeur, prcise dans lappel __init__, servira initialiser les attributs correspondants de lobjet outSelf. Comme cesvaleurs doivent tre fournies par lappelant, elles sont donc en entre de la procdure__init__, do le prfixe in.

    On indique aprs la ligne de dfinition de cette procdure une docstring qui en prcise le rle etles modes de passage des paramtres, avec leur signification.

    Les instructions de la procdure consistent ensuite en 3 affectations qui dfinissent chacuneun attribut de la classe avec sa valeur dinitialisation.

    Ainsi, toute variable de type Date (on dit, en algorithmique oriente objet, toute instance dela classe Date) possdera 3 attributs entiers, respectivement nomms .jour, .mois et .annee.

    Un enregistrement permet donc de dfinir un ensemble dinformations accessibles chacunepar leur nom, et non plus par leur rang comme dans une liste, tuple ou tableau.

    Cours Python, Semaine 2 c INPTPAD 15/16

  • ALGORITHMIQUE ET PROGRAMMATION 1 Les types utilisateurs (Python)

    4.2 Cration de variables (instances)Cette procdure sera ensuite implicitement appele chaque fois que lon va crer un nouvel

    objet de type Date de la manire suivante :d1 = Date(14,7,1789)

    On retrouve ici une affectation classiquement utilise jusqu prsent pour crer une variableen utilisant le nom du type comme une fonction dans laquelle on prcise la valeur initiale.

    Cet appel de la procdure __init__ est en fait trs particulier (nous verrons par la suite com-ment seffectuent les appels de procdures, de manire beaucoup plus naturelle) car la procdure__init__ est appele de manire implicite et non pas explicite, et quen outre son 1er paramtreest sorti de la liste des paramtres et plac en partie gauche de laffectation. Ainsi, lors de cetteaffectation, les 3 valeurs dappel 14, 7 et 1789 seront respectivement affectes aux paramtresinJour, inMois et inAn, et la procdure __init__ effectuera ses 3 affectations sur les attributs de d1considr comme un alias de outSelf au cours de cette excution.

    4.3 Accs aux attributsPour accder aux informations de d1, on utilise ensuite la notation pointe, par exemple :print (d1.jour, d1.mois, d1.annee, sep="/")

    Cette instruction affichera : 14/7/1789.

    4.4 Duplication dune variableOn va retrouver ici le mme pige quavec les listes : si on crit d2 = d1, on ne cre pas une

    nouvelle variable mais simplement un nouvel alias qui dsigne la mme variable que d1.Pour effectuer une vritable duplication, il faut utiliser le module prdfini copy (fichier

    copy.py plac dans un rpertoire de rfrence pour lenvironnement SPYDER) qui dfinit unefonction copy (elle a rigoureusement le mme nom ...) que lon peut utiliser ainsi :

    from copy import copy # le module copy permet dutiliser la fonction copyd2 = copy(d1) # duplication dans d2 des 3 attributs de la variable d1

    Pour de laide sur le module copy, taper : help(copy), en utilisant les quotes ou les guille-mets.

    Pour de laide sur la fonction copy, taper : help(copy) sans utiliser de quotes ou guillemets.On peut galement faire afficher laide sur la classe Date en tapant : help(Date). Pour le

    moment, une seule mthode (__init__) est dfinie et laide affiche la docstring que lon a spcifiedans la dfinition de cette mthode.

    Cours Python, Semaine 2 c INPTPAD 16/16