Tableaux/ en Tableaux/ en Une première couche Tableaux et Tableaux vs stephane@gonnord.org www.mp933.fr Lycée du parc - Lyon Vendredi 8 et 15 novembre 2013 Lycée du parc
1. Tableaux vs. Tableaux/vecteurs ; ; la chêvre et le choux. 2. ; slicing ; en compréhension. 3. Seconde couche de théorie append et extend ; copie de liste ; passage en argument. 4. Quelques manipulations effectives de parcours basique ; recherche d un maximum ; recherche d un élément ; etc. Tableaux/ en Tableaux et Tableaux vs
Tableaux (vecteurs) vs. Deux structures concurrentes Les x : Un bloc (intervalle) de mémoire. Accès direct en temps constant. Ne peut être «prolongé» à moindre coût. Tableaux/ en Tableaux et Tableaux vs Les (chaînées) : Accès au premier élément, ajout en tête : facile. Ou le contraire! Accès au k-ème : difficile, coûteux.
Une implémentation très astucieuse Les x redimensionnables : pour ajouter/étendre à moindre coût, mais avec accès rapide au k-ième ; recopié au delà de certains seuils. Tableaux/ en Tableaux et Tableaux vs Agrandissement d un jusqu à 1025 éléments : 1 + 2 + 3 + + 1025 1 + 2 + 4 + 8 + + 2048 Complexité : pire des cas, moyenne, amorti...
t = [...,...,...] ; t = [0] * 10 len(t) t[0], t[1],..., t[n-1], t[-1],..., t[-n] >>> x = 5 >>> id(x) 161288320 >>> x = 12 >>> id(x) 161288236 >>> t = [12, 15, 42] >>> id(t) 168387212 >>> t[1] = 841 >>> t [12, 841, 42] >>> id(t) 168387212 Tableaux/ en Tableaux et Tableaux vs
t[a: b] : une tranche de t >>> t = [42, 12, 15, 19, 16, 3, 40] >>> t[2 : 4] [15, 19] Mais recopiée ailleurs! >>> t1 = t[2 : 5] >>> t1 [15, 19, 16] >>> t1[1] = 6 >>> t, t1 ([42, 12, 15, 19, 16, 3, 40], [15, 6, 16]) >>> id(t), id(t1) 152527500, 152529132 Des variantes : t[a: ] ; t[ : b] ; t[ : ] ; t[2: -3] ; t[10: 2] ; t[a : b : s] Tableaux/ en Tableaux et Tableaux vs
Comprehension Dans R : {x R; x 1} = {cost t [0,10]} Tableaux/ en Tableaux et Tableaux vs [x for x in s if condition(x)] >>> [i for i in range(10) if i%3 == 0] [0, 3, 6, 9] [phi(x) for x in s] >>> [i**2 for i in range(4)] [0, 1, 4, 9] [phi(x) for x in s if condition(x)] >>> [i**2 for i in range(10) if i%3 == 0] [0, 9, 36, 81]
Pour appliquer une fonction à chaque élément d une liste >>> def f(x): return 2*x >>> map(f, [3, 10, 40]) [6, 20, 80] >>> map(est_premier, [3, 24, 91, 101]) [True, False, False, True] >>> map(len, [ [1,15], [10], [4,5,6,7] ]) [2, 1, 4] Attention : évaluation retardée en Python 3 >>> map(f, [1, 4, 10]) <map object at 0xa4ffb2c> >>> list(map(f, [1, 4, 10])) [2, 8, 20] Tableaux/ en Tableaux et Tableaux vs
>>> t = [1, 3] >>> t + [17] [1, 3, 17] >>> t [1, 3] >>> id(t) 152528972 >>> t = t + [17] >>> t, id(t) ([1, 3, 17], 152528428) >>> t.append(1515) >>> t, id(t) ([1, 3, 17, 1515], 152528428) >>> t.extend([ pif, 19, paf ]) >>> id(t), t (152528428, [1, 3, 17, 1515, pif, 19, paf ]) Tableaux/ en Tableaux et Tableaux vs
Une liste est une adresse : >>> t1 = [4, 2, 15] >>> t2 = t1[ : ] >>> t3 = t1 >>> t1, t2, t3 [4, 2, 15], [4, 2, 15], [4, 2, 15] >>> map(id, [t1, t2, t3]) [145335084, 145386956, 145335084] >>> t2[1] = 1515 >>> t3[1] = 841 >>> t1, t2, t3 ([4, 841, 15], [4, 1515, 15], [4, 841, 15]) Tableaux/ en Tableaux et Tableaux vs En première approximation : ma_copie = t[ : ] copy.copy vs copy.deepcopy
(Experts : passage par valeur car =pointeur!) Consultation : oui! def maximum(t):... Écriture : possible, mais attention... C est super! def echange(t, i, j): t[i], t[j] = t[j], t[i] C est une catastrophe! Si la fonction est mal écrite (ou volontairement néfaste), elle peut détruire la donnée. Tableaux/ en Tableaux et Tableaux vs
de liste Première version : for i in range(len(t)):... (travail sur t[i]) Deuxième version (souvent meilleure) : for x in t:... (travail direct sur x) Exemples : trouver le maximum d un... ou bien l indice correspondant. Tableaux/ en Tableaux et Tableaux vs
Version 1 : def somme1(t): res = 0 for i in range(len(t)): res = res + t[i] return res Version 2 : def somme2(t): res = 0 for x in t: res = res + x return res Version 3 (votre préférée...) : def somme3(t): return sum(t) Tableaux/ en Tableaux et Tableaux vs
Version 1 : def maxi(t): assert( len(t)>0 ) maxi_provisoire = t[0] for x in t: if x>maxi_provisoire: maxi_provisoire = x return maxi_provisoire Version 2 (...) : def maxi_feignasse(t): return max(t) Tableaux/ en Tableaux et Tableaux vs Exercice : retourner la position du maximum.
End game Merci de votre attention! Tableaux/ en Tableaux et Tableaux vs