02_Baumgartner_Chappatte.ipynb-4 October 24, 2016 Joris Chappatte et David Baumgartner 1 Série 1 Remarque: On utilisera Python 3. 1.1 Exercice 1 Question a. b. a. c. d. e. f. g. h. Compément Vrai Faux x x Voir cell suivante x x x Si l’on oublie le duck typing. . . x x Voir cell suivante x x In [1]: # point c. 1+4*3 # si c'était évalulé de gauche à droite sans priorité des opérations, # point h. x = lambda: 0 # est une fonction d'arité 2 1.2 Exercice 2 a. A = 15, B = 13 b. A = 5, B = 5 c. Non, car la troisième instruction «écrase» la valeur de A. d. C <- A A <- B B <- C ou 1 A <- A+B B <- A-B A <- A-B 1.3 Exercice 3 • x**y désigne la puissance, équivalent mathématique de xy , donc est équivalente à x · · · · · x}. | · x {z y fois • x//y désigne la division euclidenne (aussi dite entière), et compte donc le nombre de fois que l’on peut « mettre au maximum y dans x » • x%y désigne le reste de la division euclidienne, donc c’est la soustraction de x - x//y. On suppose que l’arithmétique sur les flottants fonctionne comme dans un monde parfait, et que l’on n’a pas d’erreur d’arrondi (qui ne devraient a priori pas survenir dans ce genre de cas non-critique, mais dépend des implémentations). a. 15*4+2=60+2=62 b. 15*(4+2)=15*6=90 c. a=4;3**3+a ⇐⇒ 3**3+4=27+4=31 d. 4+3*3**2/2+7=4+3*9/2+7=4+27/2+7=4+13.5+7=17.5+7=24.5 (24 sur Python 2 car 27/2=13) e. 4+3*3**2/2.0+7=4+3*9/2.0+7=4+27/2.0+7=4+13.5+7=17.5+7=24.5 chose sur Python 2 car 27/2.0=13.5) (même f. 4+3*3**2//2.0+7=4+3*9//2.0+7=4+27//2.0+7=4+13.0+7=17.0+7=24.0 (même chose sur Python 2 car 27//2.0=13.0 (on note que c’est un flottant)) g. 79-5*7+3**2*2=79-5*7+9*2=79-35+9*2=79-35+18=44+18=62 h. (3*5**2 <= 150 / 2)=(3*25 <= 150/2)=(75 <= 150/2)=(75 <= 75.0)=True i. 34%8=2 j. (35%8 != 43%8)=(3 != 43%8)=(3 != 3)=False 1. Pour Python 2, / est la division entière (car le diviseur est entier) et retourne donc un entier, pour Python 3, c’est la division « réelle », et retourne donc un flottant 2. C’est la division réelle, car c’est une divsion par un flottant, autant sur Python 2 que Python 3 3. C’est euclidienne par 2.0, qui «compte» combien de fois au maximum l’on peut mettre 2.0 dans, en l’occurence 27. 2 1.4 1.5 Exercice 4 x y z Opération 7 7 7 23 23 23 23 11.0 – 2 2 2 -2 -2 4 4 – – 17 17 17 44 44 44 x=7 y=2 z=x+5*y x=x*3+2 y=-2 z=z-2*y+x y=4 x=z/y Exercice 5 a. (250 == 750 / 3)=(250 == 250.0)=True b. not (27/3 >= 9)=not (9.0 >= 9)=not True=False c. ((True or False) == (False or False))=(True == False)=False d. ((8 != 8) and True)=(False and True)=False e. ((5%2==0)ˆTrue)=((1==0)ˆTrue)=(FalseˆTrue)=True f. (not not (14%7 != 0) or True)=(not not (0 != 0) or True)=(not not False or True)=(not True or True)=(False or True)=True g. True and False or False and True or True and False or True=False or False and True or True and False or True=False and True or True and False or True=False or True and False or True=True and False or True=False or True=True 1.6 Exercice 6 a. x >= 5 and x < 11 b. (x < -3) or (x >= 7) or (x = 0) c. (x%2 == 1) and (x >= 1) and (x < 20) d. round(x*10**7) == round(math.pi/2*10**7) e. Fonctionnement de XOR: XOR(A,B) est vrai si et seulement si A est différent de B. (x or y) and not (x and y) 3 1.7 Exercice 7 a. Valide, mais déprécié par la PEP-08. b. Valide c. Valide, mais déprécié, les majuscules étant réservées aux classes. d. Invalide, car il commence par un caractère numérique e. Valide f. Invalide, car c’est un mot-clef g. Valide, mais déprécié (car classe) h. Invalide, car il y a le symbole -, qui représente l’opérateur de soustraction, et Variable commence par une majuscule i. Invalide, car le symbole ! est réservé. • La fonction type retrourne un type de l’objet (=“méthode d’instantiation” pour l’objet) passé en premier paramètre si l’on fournit un seul argument. Si l’on fournit trois arguments, type retourne un nouveau type d’objet: le premier argument étant le nom (obj.__name__) du type (ou classe) à retourner, le second les types (ou classes) dont le type/la classe dérive, et finalement les définitions des méthodes et attributs du type/de la classe retourné/e. a. int b. float c. bool d. bool e. str f. list g. tuple 1.8 1. 2. 3. 4. Exercice 8 truediv(neg(y), x) add(2,truediv(mul(x,y),z)) mul(neg(4),truediv(sub(10,mul(5,3)),sub(mul(4,2),7))) or_(not_(lt(mul(neg(12),13),mul(12,11))),ge(pow(11,10),pow(9,12))) 4 1.9 Exercice 9 In [2]: import math def imc(mass, size): assert size > 0 return mass/(size**2) def size_inv_imc(imc, mass): assert imc > 0 return math.sqrt(mass/imc) def mass_inc_imc(imc, size): return imc*(size**2) size2 = lambda v: size_inv_imc(21.75, v) mass2 = lambda v: mass_inc_imc(21.75, v) t = [*map(size2, [20, 40, 60]), 1.8, 2] m = [*map(mass2, t)] t1, t2, t3, t4, t5 = tuple(t) m1, m2, m3, m4, m5 = tuple(m) In [3]: %matplotlib inline import matplotlib.pyplot as plt plt.plot([t1, t2, t3, t4, t5], [m1, m2, m3, m4, m5]) plt.show() 5 In [4]: # Bonus :-) %matplotlib inline import numpy as np x = np.linspace(1, 2) mass_vec = np.vectorize(mass2) plt.plot(x, mass_vec(x)) Out[4]: [<matplotlib.lines.Line2D at 0x105cb5908>] 6 In [ ]: 7