Exercices Corrigés de Python
July 8, 2017 | Author: yaya92126 | Category: N/A
Short Description
python...
Description
Programmation 1 Variables : notion de type et de valeur d’une variable, types simples. Démonstration : >>> a = 3 >>> print(a) 3 >>> print(type(a)) >>> >>> a = 3.14 >>> print(a) 3.14 >>> print(type(a)) >>> >>> b = a >>> print(b) 3.14 >>> a = 4 >>> print(b) 3.14 >>> s = 'abc' >>> print(s) abc >>> print(type(s)) >>> >>> s = "abc" >>> print(s) abc >>> print(type(s)) >>> 1
>>> print(s[0]) a >>> print(s[1]) b >>> print(len(s)) 3 >>> >>> l = ['a', 'b', 'c'] >>> print(l) ['a', 'b', 'c'] >>> print(type(l)) >>> >>> print(l[0]) a >>> print(l[1]) b >>> print(len(l)) 3 Questions : x = 3 x = 4 que vaut x ? 4 a = 4 b = a a = 5 que vaut b ? 4 b = 2 a = b b = b + 1 a = a b = a que vaut b ? 2 Exercice : inverser le contenu de deux variables 2
>>> a 4 >>> b 3.14 >>> tmp = a >>> a = b >>> b = tmp >>> a 3.14 >>> b 4 Expressions et instructions simples : affectation, opérateurs usuels, distinction entre expression et instruction. Une expression s’évalue et a une valeur Une valeur a un type >>> a=2 >>> a = 2 >>> b = a + 3 >>> b 5 >>> "bon" + "jour" 'bonjour' >>> b + max([4, 2, 8, 5, 7]) 13 Une instruction n’a pas de valeur C’est une commande qui est exécutée >>> a = 2 # est une instruction >>> b = (a = 2) # on ne peut pas mettre son résultat dans une variable File "", line 1 b = (a = 2) # on ne peut pas mettre son résultat dans une variable ^ SyntaxError: invalid syntax 3
>>> print(a) # est une instruction 2 >>> type(print(a)) # print(a) n'a pas de valeur ni de type File "", line 1 type(print(a)) # print(a) n'a pas de valeur ni de type ^ SyntaxError: invalid syntax Exercice : différencier les expressions des instructions a = 2, a == 2, l = [1,2,3], l = l + l, if a > 0:, a = b = 3, ab >= 0, x/2 if x%2==0 else 3*x+1 Instructions conditionnelles : expressions booléennes et opérateurs logiques simples, instruction if. Variantes avec alternative (else). Exercice : écrire les termes de la suite de Syracuse. Partant d’un entier positif, on le divise par 2 s’il est pair et on le multiplie par 3 et on ajoute 1 sinon. Instructions itératives : boucles for, boucles conditionnelles while. Fonctions : notion de fonction (au sens informatique), définition dans le langage utilisé, paramètres (ou arguments) et résultats, portée des variables. def f(x): return x + 1 f(3), f(f(3)) def g(x): x = x Manipulation de quelques structures de données : chaînes de caractères (création, accès à un caractère, concaténation), listes (création, ajout d’un élément, suppression d’un élément, accès à un élément, extraction d’une partie de liste), tableaux à une ou plusieurs dimensions. Fichiers : notion de chemin d’accès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier. Algorithmique 1 Exercice : recherche dans une liste Ecrire une fonction indice qui prend un élément et une liste en paramètre et qui retourne le premier indice de l’élément si celuici apparaît dans la liste. 4
# * coding: utf8 * def indice(x, liste): """ Retourne la premiere position de x dans la liste. Args: x: l'element cherché liste: la liste dans lequel x est cherché Returns: l'indice de la premiere occurrence de x sur liste Raises: ValueError si l'élément n'est pas présent >>> indice(5, [2, 1, 0, 3, 3, 5, 1]) 5 >>> indice(0, [2, 1, 0, 3, 3, 5, 1]) 2 >>> indice(2, [2, 1, 0, 3, 3, 5, 1]) 0 >>> indice(3, [2, 1, 0, 3, 3, 5, 1]) 3 >>> indice(9, [2, 1, 0, 3, 3, 5, 1]) Traceback (most recent call last): ... ValueError: non trouve """ index=0 for e in liste: if x==e: return index index = index + 1 raise ValueError("non trouve") 5
if __name__ == "__main__": import doctest doctest.testmod() Exercice : recherche du maximum dans une liste de nombres # * coding: utf8 * def recherche_max(liste): """ Retourne l'élément maximum d'une liste d'entiers. Args: liste: la liste d'entiers Returns: l'élément maximal >>> recherche_max([2, 1, 0, 3, 3, 5, 1]) 5 >>> recherche_max([3, 4, 7, 12, 100, 52]) 100 >>> recherche_max([3, 7, 12, 53]) 3 >>> recherche_max([]) Traceback (most recent call last): ... ValueError: liste vide """ if len(liste)>0: max=liste[0] for e in liste: if e>max: max = e return max 6
else: raise ValueError("liste vide") if __name__ == "__main__": import doctest doctest.testmod() Exercice : calcul de la moyenne et de la variance. # * coding: utf8 * def moyenne(liste): """ Retourne la moyenne des éléments d'une liste. Args: liste: la liste d'éléments Returns: la moyenne >>> moyenne([1,2,3,4,5,6]) 3.5 >>> moyenne([3,2,1,1,2,3]) 0.0 >>> moyenne([3,2,1,1.0,2,3]) 0.0 >>> moyenne([]) Traceback (most recent call last): ... ValueError: liste vide """ if len(liste)>0: return sum(liste)/float(len(liste)) else: raise ValueError("liste vide") 7
def variance(liste): """ Retourne la variance des éléments d'une liste. Args: liste: la liste d'éléments Returns: la variance >>> variance([1,2,3,4,5,6]) == sum( (3.5i)**2 for i in range(1,6+1))/6 True >>> variance([]) Traceback (most recent call last): ... ValueError: liste vide """ if len(liste)>0: moy = moyenne(liste) somme = 0.0 for x in liste: somme = somme + (xmoy)**2 return somme/len(liste) else: raise ValueError("liste vide") if __name__ == "__main__": import doctest doctest.testmod() Exercice : recherche par dichotomie dans un tableau trié. # * coding: utf8 * def est_dans(x, liste): 8
""" Retourne vrai si x est dans la liste. Args: x: l'element cherché liste: la liste triée dans lequel x est cherché Returns: vrai si x est dans liste faux sinon >>> est_dans(0, [0, 1, 1, 2, 3, 3, 5]) True >>> est_dans(1, [0, 1, 1, 2, 3, 3, 5]) True >>> est_dans(2, [0, 1, 1, 2, 3, 3, 5]) True >>> est_dans(3, [0, 1, 1, 2, 3, 3, 5]) True >>> est_dans(4, [0, 1, 1, 2, 3, 3, 5]) False >>> est_dans(5, [0, 1, 1, 2, 3, 3, 5]) True >>> est_dans(5, []) False """ bi = 0 bs = len(liste) 1 while bi epsilon: pivot = (bi+bs)/2.0 if abs(f(pivot)) = 0 : bi = pivot else: bs = pivot raise ValueError("pas de solution") if __name__ == "__main__": import doctest doctest.testmod() Exercice : méthodes des rectangles et des trapèzes pour le calcul approché d’une intégrale sur un segment. Exercice : recherche d’un mot dans une chaîne de caractères. On utilisera pour cela un algorithme naïf. Mais on peut imaginer l’étude des algorithmes de KnuthMorrisPratt, ou RabinKarp par exemple. # * coding: utf8 * def est_prefix(mot, chaine): """ Retourne vrai si mot est prefix de chaine. Args: mot: le mot cherché chaine: la chaine laquelle mot est cherché (en tête) Returns: vrai si mot est prefix de chaine faux sinon >>> est_prefix('a', 'abc') True >>> est_prefix('b', 'abc') False 11
>>> est_prefix('ab', 'abc') True >>> est_prefix('abc', 'abc') True >>> est_prefix('bc', 'abc') False >>> est_prefix('', '') True >>> est_prefix('', 'abc') True >>> est_prefix('a', '') False """ if len(mot) > len(chaine): return False for i in xrange(len(mot)): if mot[i] != chaine[i]: return False return True def est_sous_chaine(mot, chaine): """ Retourne vrai si mot apparait dans chaine. Args: mot: le mot cherché chaine: la chaine dans laquelle mot est cherché Returns: vrai si mot est dans chaine faux sinon >>> est_sous_chaine('a', 'abc') True 12
>>> est_sous_chaine('b', 'abc') True >>> est_sous_chaine('bb', 'abbc') True >>> est_sous_chaine('bc', 'abc') True >>> est_sous_chaine('', '') True >>> est_sous_chaine('abc', '') False """ # on veut aller de 0 à len(chaine)len(mot) inclus for i in xrange(0,len(chaine)len(mot)+1): if est_prefix(mot,chaine[i:]): return True return False if __name__ == "__main__": import doctest doctest.testmod() Exercice : étant donné un tableau d’entiers, retourner un tableau commençant avec les entiers pairs et se terminant avec les entiers impairs # * coding: utf8 * def pair_a_gauche(t): """ Retourne un tableau où les élments pairs sont à gauche. Args: t: le tableau à classer Returns: un tableau où les éléments pairs sont à gauche >>> pair_a_gauche([1,2,3,4,5]) 13
[2, 4, 5, 3, 1] >>> pair_a_gauche([2,3,4,5,6,7]) [2, 4, 6, 7, 5, 3] >>> pair_a_gauche([]) [] """ res = list(t) x=0 y=len(t)1 for a in t: if a%2 == 0: res[x]=a x=x+1 else: res[y]=a y=y1 return res if __name__ == "__main__": import doctest doctest.testmod() Exercice : même exercice en utilisant des compréhensions de liste # * coding: utf8 * def pair_a_gauche_comprehension(t): """ Retourne un tableau où les éléments pairs sont à gauche. Args: t: le tableau à classer Returns: un tableau où les éléments pairs sont à gauche >>> pair_a_gauche_comprehension([1,2,3,4,5]) [2, 4, 1, 3, 5] 14
>>> pair_a_gauche_comprehension([2,3,4,5,6,7]) [2, 4, 6, 3, 5, 7] >>> pair_a_gauche_comprehension([]) [] """ return [x for x in t if x % 2 == 0] + [x for x in t if x % 2 == 1] if __name__ == "__main__": import doctest doctest.testmod()
15
Algorithmique 2 Piles Exercice: Ecrire une fonction qui permet de savoir si une expression de parenthèse est correcte. Exemple (()), ()(), ()(()), … Contreexemple )()(, ((), ())), … Récursivité Exercice: Comptez le nombre de mots (sur ‘(‘ et ‘)’ ) de longueur n bien parenthésés. Exercice: Etant donnée une chaîne de caractères comme “debarbouiller”, calculez la longueur de la plus longue soussuite croissante contenue dans ce mot. Par exemple “abill” a une longueur 5. L’ordre des lettres est a t[j+1]: (t[j],t[j+1]) = (t[j+1],t[j]) return t Exercice: Tri par insertion. On trouve le plus petit élément de la liste, et on le permute avec le premier élément de la liste, on continue avec le deuxième plus petit mis à la place du deuxième, etc jusqu’à la fin de la liste. def triinsertion(t): """ Tri d'une liste Args: t: liste à trier Returns t ( triée ) >>> tribulle([1, 4, 2, 8, 3]) [1, 2, 3, 4, 8] >>> tribulle([5, 3, 4, 4]) [3, 4, 4, 5] >>> tribulle([9, 8, 7, 6, 5, 4, 3, 2, 1]) [1, 2, 3, 4, 5, 6, 7, 8, 9] """ for i in range(len(t)1): (minimum,min_index) = (sys.maxint,0) for j in range(i,len(t)): if minimum > t[j]: (minimum,min_index) = (t[j],j) 17
(t[min_index],t[i]) = (t[i],t[min_index]) return t Exercice: Trouver l’élément médian d’une liste L donnée en argument. On rappelle qu’il s’agit de l’élément x tel que la moitié des éléments de T est plus petit que x, l’autre étant plus grande. def median(t): """ Calcule l'élément médian d'une liste Args: t: la liste Returns: l'élément médian Raises: IndexError si t est vide >>> median([1, 5, 3, 3, 5, 9]) 5 >>> median([1, 4, 3, 5, 5]) 4 """ t.sort() return t[len(t)/2]
18
Programmation 2 Classes et objets TD compte bancaire Interfaces graphiques Bases de données Exercice : compte bancaire
L'objectif de ce TD est de s'exercer à la spécification et à la programmation de classes élémentaires. En particulier, il s'agit à partir d'un énoncé d'identifier et de définir les caractéristiques d'une classe modélisant un concept donné. [TD inspiré d’un exercice proposé par Philippe Genoud, Université de Grenoble] "Cahier des charges" Il s'agit de définir une classe Python CompteSimple permettant de modéliser des comptes bancaires. La somme d'argent disponible sur un compte, appelée solde, est exprimée en Euros. Le solde est un nombre décimal positif, nul ou négatif. On dit que le compte est à découvert lorsque son solde est négatif. En aucun cas le découvert d'un compte ne peut être supérieur à une valeur fixée, appelée decouvert_autorise. Par exemple pour un compte dont le découvert maximal autorisé est 2000 €, le solde ne pourra jamais être inférieur à 2000 €. Le découvert maximal autorisé peut varier d'un compte à un autre, il est fixé arbitrairement par la banque à la création du compte et peut être ensuite révisé selon les modifications des revenus du titulaire du compte. Créditer un compte consiste à ajouter un montant positif au solde du compte. Débiter un compte consiste à retirer un montant positif au solde du compte. Le solde résultant ne doit en aucun cas être inférieur au découvert maximal autorisé pour ce compte. Lors d'une opération de retrait, un compte ne peut être débité d'un montant supérieur à une valeur désignée sous le terme de debit_maximal autorisé. Comme le découvert maximal autorisé, le débit maximal autorisé peut varier d'un compte à un autre et est fixé arbitrairement par la banque à la création du compte. Il peut être ensuite révisé selon les modifications des revenus du titulaire du compte. Effectuer un virement consiste à débiter un compte au profit d'un autre compte qui sera crédité du montant du débit. Lors de la création d'un compte, en l'absence de dépôt initial le solde est fixé à 0 €. Les valeurs par défaut pour le découvert maximal autorisé et le débit maximal autorisé sont respectivement de 0 € et 500 €. 19
Travail demandé : A partir du "cahier des charges" précédent élaborer une spécification de la classe Python modélisant un compte bancaire. ● quelles sont les méthodes proposées par la classe ? ● quelles sont les variables d’instances nécessaires ? ● quelle est la signature du constructeur de classe ? Réaliser une implantation en prenant soin de documenter le comportement du constructeur et des différentes méthodes. Scénario de test : ● créer un compte c1 ayant 1000 € comme dépot initial ● afficher le solde de ce compte. Le résultat doit être de la forme 1000 € ● débiter 50 € de ce compte et afficher le solde courant ● créer un compte c2 ● transférer 200 € du compte c1 vers le compte c2. Afficher le solde des deux comptes ● transférer 2000 € du compte c1 vers le compte c2. Afficher le solde des deux comptes "Cahier des charges" (suite) Un compte bancaire est associé à un client titulaire du compte, ce client est décrit par son nom ainsi que par la liste des comptes qu’il possède. Toutes les informations relatives à un client doivent pouvoir être affichées (nom du client, liste de ses comptes et soldes respectifs)
Travail demandé ● réaliser une implantation en langage Python de la classe Client (constructeur prenant en paramètre le nom du client ainsi que la liste des comptes associés) ● la classe client devra permettre d’afficher la situation financière d’un client. Par exemple : Client: A Compte 1 : 0 € Compte 2 : 300 € ● créer 2 clients (A et B). Le premier possède 2 comptes (le compte c1 créé précédemment et un nouveau compte initialisé à 50 €) et le second un seul compte (le compte c2 créé précédemment). affichez la situation financière de ces clients. L’affichage doit être de la forme *** situation initiale Client: A Compte 1 : 750 € Compte 2 : 50 € Client: B 20
Compte 1 : 200 € Modifier la classe Client de sorte que chaque client ait un numéro de client unique. Modifier la méthode qui affiche la situation financière d’une client de sorte que le numéro apparaisse. # * coding: utf8 * class CompteSimple: def __init__(self, depot_initial = 0.0, decouvert = 0.0, debit = 500.0): self.solde = depot_initial self.decouvert_autorise = decouvert self.debit_maximal = debit def __str__(self): """ Returns: une chaine représentant le solde du compte >>> c1 = CompteSimple(200); print(c1) 200 € """ return str(self.solde) + " €" def credit(self, montant): """ Args: montant: le montant positif à créditer >>> c1 = CompteSimple(200); c1.credit(100); print(c1) 300 € >>> c1 = CompteSimple(200); c1.credit(100); print(c1) Traceback (most recent call last): ... ValueError: montant negatif """ if montant
View more...
Comments