• Aucun résultat trouvé

Programmation impérative en Python

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation impérative en Python"

Copied!
49
0
0

Texte intégral

(1)

Programmation impérative en Python

Cours 5. Les listes et les tuples

Olivier Baldellon à partir des notes, de Pierre Lezowski, Etienne Lozes et Jean-Paul Roy

Courriel :pré[email protected]

Page professionnelle :http://deptinfo.unice.fr/~obaldellon/

Université de Nice Sophia Antipolis (Université Côte d’Azur), Département d’Informatique

(2)

Sommaire

f Partie i. Annonces f Partie ii. Séquences

f Partie iii. Accès et constructeur f Partie iv. Mutabilité des listes f Partie v. Gestion de la mémoire f Partie vi. Petit algorithmes f Partie vii. Table des matières

(3)

QCM Noté

Partie i. Annonces

ÏIl y aura un QCM la semaine prochaine (semaine de 09/03) Ï il sera noté

Ï il se fera en fin de TP Ï il sera sur les chapitres 1 à 3 ÏVérifiez votre groupe sur Moodle

Ï Il faut venir au créneau de votre groupe Ï Sinon vous ne pourrez pas passer le QCM : 0/20 Ï En cas de problème, me contacter par mail.

(4)

Examen de mi-semestre

Partie i. Annonces

ÏExamen le mercredi 18 mars de 17h30 à 19h30 Ï Sur les chapitres 1 à 5

Ï On vous tiendra au courant du lieu ÏEn cas d’incompatibilité avec une autre UE.

Ï Débrouillez-vous avec l’autre enseignant :) Ï Me contacter par mail

ÏIl n’y aura pas de cours de python la semaine du 16 Mars.

Ï :’(

Ï Ni CM, ni TP, ni TD

(5)

Sommaire

f Partie i. Annonces f Partie ii. Séquences

f Partie iii. Accès et constructeur f Partie iv. Mutabilité des listes f Partie v. Gestion de la mémoire f Partie vi. Petit algorithmes f Partie vii. Table des matières

(6)

Définitions

Partie ii. Séquences

ÏUneséquenceest une suite finie de valeurs indexées.

Ï On connaît déjà le typestr(chaîne de caractères) Ï Il y a aussi lestupleset lelistes.

>>> t = (1,2,3)

>>> type(t)

<class 'tuple'>

>>> l = [1,2,3]

>>> type(l)

<class 'list'>

shell

ÏUne séquence peut contenir des éléments de types distincts :

>>> t = (2.0 , 'Salut', math.sqrt)# tuple de 3 éléments

>>> [1, 'B', t , [3,4,5]] # liste de 4 éléments [1, 'B', (2.0, 'Salut', <built-in function sqrt>), [3, 4, 5]]

shell

(7)

Tuples

Partie ii. Séquences ÏLestuplessont une généralisations des couples.

Ï couple, triplet (3-uplet), quadruplet (ou 4-uplet), …, n-uplet

Une fonction ne peut retourner qu’une valeur,

mais peut retourner un tuple.

def division(a,b):

q = 0 r = a

while r >= b:

r = r - b q = q + 1

# q=a//b et r=a%b return (q, r)

script

>>> t = division(37,7)

>>> t # 37 = 5*7 + 2 (5, 2)

>>> t + (3,4) # concaténation (5, 2, 3, 4)

>>> t[0]=17 # les tuples ne sont pas modifiables Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: 'tuple' object does not support item assignment shell

(8)

Listes

Partie ii. Séquences

ÏLeslistessont une généralisations des tuples.

ÏExemple :

Ï On souhaite conserver les prénoms des membres d’un club Ï On peut utiliser les listes pour les stocker.

>>> club = ['Alice', 'Bianca', 'Carlos', 'Dagobert']

>>> club = club + ['Etienne', 'Fatou']

>>> club

['Alice', 'Bianca', 'Carlos', 'Dagobert', 'Etienne', 'Fatou']

shell

ÏZut alors ! On a oublié l’accent sur Étienne ! ! !

>>> club[4]='Étienne'

>>> club

['Alice', 'Bianca', 'Carlos', 'Dagobert', 'Étienne', 'Fatou']

shell

ÏLes listes sontmutables.

(9)

Sommaire

f Partie i. Annonces f Partie ii. Séquences

f Partie iii. Accès et constructeur f Partie iv. Mutabilité des listes f Partie v. Gestion de la mémoire f Partie vi. Petit algorithmes f Partie vii. Table des matières

(10)

Initialisation

Partie iii. Accès et constructeur

ÏConstruction en extension

Ï tuples: les éléments entreparenthèsesséparés par des virgules Ï liste: les éléments entrecrochetsséparés par des virgules

Nombre d’éléments 0 1 cas général (ici 5 éléments)

Tuple () (2,) (3,4,1,(1,3),-6)

Liste [] [2] [3,4,1,(1,3),-6]

Chaîne '' '@' 'Salut'

Ï Un 1-uplet est possible mais peu utile :attention à la syntaxe(2,).

ÏLa fonctionlen(S)donne la longueur (nombre d’éléments de S)

>>> len('') 0>>> len((2,)) 1>>> len([0,1,2]) 3

shell

(11)

Opérations sur les séquences

Partie iii. Accès et constructeur

ÏOn peutconcaténerdeux séquences avec l’opérateur+

>>> 'Bon' + 'jour' 'Bonjour'

>>> (1,2) + (3,4) (1, 2, 3, 4)

>>> [1,2,3] + [7] + [8.5]

[1, 2, 3, 7, 8.5]

shell

ÏEn particulier, siS1etS2sont deux séquences on a len(S1+S2) == len(S1) + len(S2) ÏOn peutmultiplierune séquence par un entier :

>>> (1,2)*5

(1, 2, 1, 2, 1, 2, 1, 2, 1, 2)

>>> 4 * [ 3,4,5]

[3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5]

>>> 'AH '* 10 + 5*'!'

'AH AH AH AH AH AH AH AH AH AH !!!!!'

shell

ÏLes opérations sontcommunesà ces trois types de séquence.

(12)

Accès par indice

Partie iii. Accès et constructeur

ÏL’accès est commun aux chaines, tuples et listes.

>>> c = 'Saluton !'

>>> c[0] # Premier 'S'

>>> c[len(c)-1] # Dernier '!'

>>> t = (1,True,'profond')

>>> len(t) 3

>>> t[1]

True

shell >>> len(l) 3

>>> l[0] #Mon 1er est un chiffre 6

>>> l[1] #Mon 2nd est un booléean True

>>> l[2] #Mon 3ème est une chaîne 'Yeux'

>>> l #Mon tout est orange [6, True, 'Yeux']

shell

ÏComme pour les chaînes, on peut utiliser des indices négatifs.

>>> l[-1] , t[-2] , c[-3] # Sans parenthèses ('Yeux', True, 'n')

>>> t[666] # Horreur, une erreur Traceback (most recent call last):

File "<stdin>", line 1, in <module>

IndexError: tuple index out of range

shell

(13)

Parcours

Partie iii. Accès et constructeur

ÏPour parcourir une séquence, on peut utiliser des boucles.

Ï en itérantsur les indicesde0àlen(Seq)-1

Ï en itérant directementsur les élémentsde la séquence.

def affiche(Seq):

n=len(Seq)

for i in range(n):

print(Seq[i],end=' -> ') print('')

script

def affiche(Seq):

for e in Seq:

print(e,end=' -> ') print('')

script

>>> affiche(c)

S -> a -> l -> u -> t -> o -> n -> -> ! ->

>>> affiche(t)

1 -> True -> profond ->

>>> affiche(l) 6 -> True -> Yeux ->

shell

ÏC’est le même programme pour les trois types de séquences !

(14)

Écrire une fonction index

Partie iii. Accès et constructeur

ÏOn souhaite connaître l’indice d’un élément d’une séquence Ï On retourne le premier indice qui convient

Ï Si aucun indice ne couvient, on renvoie -1 def index(Seq,x):

for i in range(len(Seq)):

if Seq[i]==x:

return i

# On sort de la boucle si on a pas trouvé x return -1

script

ÏEt ça marche avec tous les types de séquence !

>>> print(c,t,l,sep=' ')

Saluton ! (1, True, 'profond') [6, True, 'Yeux']

>>> index(c,'o') 5

>>> index(t,False) -1

>>> index(l,True) 1

shell

(15)

La méthode index

Partie iii. Accès et constructeur ÏUne méthode similaire existe déjà.

Ï Mais il faut savoir l’écrire soit même !

>>> liste = [4, -2, False, 'Coucou',-2, (3,5)]

>>> liste.index('Coucou') 3

shell

Ï En cas de plusieurs index valides, c’est le premier qui est renvoyé.

Ï On peut donner un indice de départ

Ï Si aucun n’est valide, le programme se termine par un erreur.

>>> liste.index(-2) 1

>>> liste.index(-2,2) # on cherche à partir de liste[2]

4

>>> liste.index(5)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: 5 is not in list

>>> (10,20,30).index(30) # marche avec tuples et chaînes 2

>>> 'abcdef'.index('bcd') # marche avec des sous-chaînes 1

shell

(16)

Déstructuration

Partie iii. Accès et constructeur

ÏOn peutdéstructurerun tuple ou une liste.

Ï nécessite de connaître la taille en écrivant le programme.

Ï permet de définir plusieurs variables d’un coup

>>> liste=[1,2,3]

>>> [a,b,c] = liste

>>> a 1

>>> b 2

>>> c 3

shell >>> uplet=(1,2,3)

>>> (a,b,c) = uplet

>>> a 1

>>> b 2

>>> c 3

shell

ÏIl faut la même structure des deux côtés.

>>> liste=[1,2,3]

>>> [a,b] = liste

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: too many values to unpack (expected 2)

shell

(17)

Extraction de tranche

Partie iii. Accès et constructeur

ÏComme pour les chaînes, on peutextraire des tranches.

Ï On accède à un élément d’une séquence avec la notation[i]

Ï On accède à une suite d’élèments avec la notation[i,j]

Ï On accède à une suite d’élèments avec la notation[i,j,p]

>>> c = 'Salut à toi'

>>> l = ['Zéro','Un','Deux','Trois','Quatre','Cinq']

>>> t = (0,1,2,3,4,5)

shell

>>> c[6]

'à'>>> l[1:4]

['Un', 'Deux', 'Trois']

>>> t[1:6:2]

(1, 3, 5)

shell >>> extraire(c,6,7,1) 'à'>>> extraire(l,1,4,1) ['Un', 'Deux', 'Trois']

>>> extraire(t,1,6,2) (1, 3, 5)

shell

ÏExercice : Écrire la fonction extraire.

(18)

Construction par compréhension

Partie iii. Accès et constructeur

ÏUneconstruction par compréhension(de liste) consiste à imiter la notation mathématique

{

f(x)tels quex∈EetP(x)}

>>> [x * x for x in range(6)]

[0, 1, 4, 9, 16, 25]

>>> [c for c in 'azerty']

['a', 'z', 'e', 'r', 't', 'y']

shell

ÏUne expressionifsuivant leforpermet de filtrer les éléments.

>>> [x * x for x in range(20) if x%2==0 and x*x>20]

[36, 64, 100, 144, 196, 256, 324]

shell

ÏNe fonctionne qu’avec les listes !

(19)

Exercices

Partie iii. Accès et constructeur ÏTraduire les compréhensions suivantes en bouclefor.

>>> [x * x for x in range(6)]

[0, 1, 4, 9, 16, 25]

shell

>>> [c for c in 'azerty']

['a', 'z', 'e', 'r', 't', 'y']

shell

>>> [x * x for x in range(20) if x%2==0 and x*x>20]

[36, 64, 100, 144, 196, 256, 324]

shell

ÏMême question avec une double bouclefor

>>> L = [ (1,2), (3,4,5), (6,) ]

>>> [x for tuple in L for x in tuple]

[1, 2, 3, 4, 5, 6]

shell

(20)

Conversions

Partie iii. Accès et constructeur

ÏOn peut convertir une chaîne en tuple ou en liste.

>>> list('Saucisson')

['S', 'a', 'u', 'c', 'i', 's', 's', 'o', 'n']

>>> tuple('Découpage')

('D', 'é', 'c', 'o', 'u', 'p', 'a', 'g', 'e')

shell

ÏOn peut convertir les listes en tuples et vice-versa

>>> list((1,2,3,4)) [1, 2, 3, 4]

>>> tuple([1,2,3,4]) (1, 2, 3, 4)

shell

ÏExercice : écrire les deux fonctionstupleetlist.

(21)

Construction d’une matrice

Partie iii. Accès et constructeur

Une matrice est un tableau de nombre.

a b c d e f g h i



ÏOn représente souvent lesmatricescomme uneliste de listes [[a,b,c],[d,e,f],[g,h,i]]

>>> M = [[0,1,2],[10,11,12],[20,21,22]]

>>> M[1]

[10, 11, 12]

>>> M[1][2]

12

shell

ÏExercice 1 : Trouver le maximum d’une matrice ÏExercice 2 : Ajouter case par case deux matrices

(1 2 3 4 )

+ (50 60

70 80 )

= (51 62

73 84 )

(22)

Sommaire

f Partie i. Annonces f Partie ii. Séquences

f Partie iii. Accès et constructeur f Partie iv. Mutabilité des listes f Partie v. Gestion de la mémoire f Partie vi. Petit algorithmes f Partie vii. Table des matières

(23)

Modification de liste

Partie iv. Mutabilité des listes

ÏOn poseliste=[11,22,33];s='Chaine', ett = ('t','U','p','l','e') ÏOn peut modifier les listes.

>>> liste[1] = 'Choucroute'

>>> liste

[11, 'Choucroute', 33]

shell

ÏOn ne peut pas modifier les tuples et les chaînes

>>> s[3]='î'

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: 'str' object does not support item assignment

>>> t[1]='u'

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: 'tuple' object does not support item assignment shell

ÏOn peut cependant réaffecter une chaîne et un tuple

>>> s='Chaîne'

>>> t=('t','u','p','l','e')

shell

(24)

Remarques sur la mémoire

Partie iv. Mutabilité des listes

>>> c1 = 'Chaîne vachement très très longue'

>>> c2=c1

shell

ÏLa chaine'Chaîne … longue'est stockée une fois en mémoire.

Ï On dit que c1 et c2 pointe vers la même chaîne de caractère.

Ï l’affection c2=c1 est instantané.

ÏDémonstration avec une séquence mutable (une liste donc)

>>> l1=[1,2,3]

>>> l2=l1

>>> l1[2]=4

>>> l1 # l1 modifié : logique…

[1, 2, 4]

>>> l2 # Surprise !!!

[1, 2, 4]

shell

(25)

Ajout d’un élément

Partie iv. Mutabilité des listes

>>> l = [0,1,2]

>>> l = l + [3]

>>> l [0, 1, 2, 3]

shell >>> l = [0,1,2]

>>> l.append(3)

>>> l [0, 1, 2, 3]

shell

ÏLe premier programme

Ï recrée une liste similaireàl(peut-être long silest grand) Ï ajoute 3 à la fin de la nouvelle liste.

ÏLa méthodeappend

Ï modifiela listeldirectement.

>>> l1=[0,1,2] ; l2=[0,1,2]

>>> m1=l1 # La liste n'est pas recopiée

>>> m2=l2 # La liste n'est pas recopiée

>>> l1=l1+[3] # On crée une nouvelle liste

>>> print(l1,m1) [0, 1, 2, 3] [0, 1, 2]

>>> l2.append(3) # on modifie la liste

>>> print(l2,m2)

[0, 1, 2, 3] [0, 1, 2, 3]

shell

(26)

Exemple : créer la liste des diviseurs

Partie iv. Mutabilité des listes ÏLa fonctiondiviseurs(n)va retourner la liste des diviseurs de n.

Ï uniquement ceux non triviaux (distincts de 1 etn) Ï on impose ànd’être un entier strictement positif.

ÏListe ou tuple ?

Ï On peut efficacement ajouter des éléménts à une liste :append Ï Il n’y a pas d’équivalent pour les tuples (immutable/immuable) Ï On ne connaît pas à l’avance le nombre d’éléments du résultat Ï On va donc utiliser une liste plutôt qu’un tuple

def diviseurs(n):

res = []

for d in range(2, n):

if n % d == 0 : # Si d divise n res.append(d)

return res

script

>>> d = diviseurs(500)

>>> (len(d) , d)

(10, [2, 4, 5, 10, 20, 25, 50, 100, 125, 250])

shell

(27)

Méthodes usuelles sur les listes

Partie iv. Mutabilité des listes

https://docs.python.org/fr/3.7/tutorial/datastructures.html list.append(x) Ajoute un élément à la fin de la liste.

list.extend(x) Étend la liste en y ajoutant tous les éléments de l’itérable.

list.insert(i,x) Insère un élément à la position indiquée. Le premier argument est la position de l’élément courant avant lequel l’insertion doit s’effectuer.

list.remove(x) Supprime de la liste le premier élément dont la valeur est égale à x.

Erreur s’il n’existe aucun élément avec cette valeur.

list.pop(i) Enlève de la liste l’élément situé à la position indiquée et le renvoie en valeur de retour. Si aucune position n’est spécifiée,a.pop()enlève et renvoie le dernier élément de la liste.

list.index(x) Renvoie la position du premier élément de la liste dont la valeur égale x. Erreur si aucun élément n’est trouvé.

list.count(x) Renvoie le nombre d’éléments ayant la valeur x dans la liste.

list.sort() Ordonne les éléments dans la liste, en place.

list.reverse() Inverse l’ordre des éléments dans la liste, en place.

ÏExercices : à réécrire chez soi :)

(28)

Sommaire

f Partie i. Annonces f Partie ii. Séquences

f Partie iii. Accès et constructeur f Partie iv. Mutabilité des listes f Partie v. Gestion de la mémoire f Partie vi. Petit algorithmes f Partie vii. Table des matières

(29)

La pile et le tas

Partie v. Gestion de la mémoire ÏLa mémoire d’un programme comporte deux zones distinctes :

Ï lapile, qui contient lesvariables locales,

Ï letas, qui contient lesvariables globaleset lesobjets(séquences, fonctions, etc.).

x=3 # Tas

L=[1,2,3,4] # Tas

# f:Tas

def f(liste): # liste:Pile

z=2 # Pile

L=['a','b','c'] # Tas return liste+L f(L)

script

http://pythontutor.com/visualize.html

ÏDans la pile defon stocke : Ï les variables locales simples

Ï Un lien vers les séquences (str, tuple et liste)

(30)

La pile et les variables locales

Partie v. Gestion de la mémoire

ÏChaque appel de fonction crée unpile locale.

Ï Cette pile et les variables associées disparaissent à la fin de la fonction.

Ï Ladurée de viede ces variables est celle de l’appel.

def f(x):

y = 1 # ¬

g(y) # ­

print(x) # ® def g(y):

x = y f(3) # affiche 3

script

ÏChaque appel de fonction à son propreespace de nom.

Ï Lexdefn’est pas le même que celui deg Ï Cela permet de ne pas s’embrouiller

ÏSi on appelle plusieurs fois une fonction, il y auraune pile par appel.

(31)

La pile et les appels de fonctions

Partie v. Gestion de la mémoire

ÏLa durée de vie d’une variable globale est celle du programme.

Ï Sa portée s’arrêteaux définitions des fonctions.

Ï Dans une fonction, une variable que l’on modifie est implicitement locale, même si une variable globale porte le même nom.

x = 0

x = x + 1 # ¬ def f(y):

x = y # ­

f(2) # ®

print(x) # affiche 1 script

(32)

Le tas et les variables globales

Partie v. Gestion de la mémoire

ÏOn veut faire modifier une variable globale par une fonction.

ÏComment étendre sa portée à la définition de fonction ? ÏEn ajoutant le mot-cléglobal.

x = 0

x = x + 1 # ¬ def f(y):

global x x = y # ­

f(2) # ®

print(x) # affiche 1 script

Ïglobalest seulement requis pour modifier une variable globale.

ÏCependant, le code est plus clair en le précisant toujours.

(33)

Partage de variables

Partie v. Gestion de la mémoire

ÏRappel : dans Processing, on avait déjà vu le mot-cléglobalpour partager l’état du monde entre les différentes fonctions.

def setup():

global t t=0 def draw():

global t print(t) t=t+1

script

>>> setup()

>>> draw() 0>>> draw() 1>>> draw() 2

shell

ÏEn Processing, les fonctionssetup()etdraw()sont appelées automatiquement.

(34)

Listes et variables

Partie v. Gestion de la mémoire

ÏLors de l’affectationL=[1,2,3]:

Ï la variable L contient unlien(un pointeur) vers la liste [1,2,3]) Ï lepointeurde L est dans lapile

Ï lecontenu[1,2,3]est dans letas

ÏPlusieurs variables peuvent pointer vers la même liste !

>>> L = [1, 2, 3]

>>> M = L # ¬ M et L pointent vers la même liste

>>> M[0] = 4 # ­ modification indirecte de L[0]

>>> L [4, 2, 3]

shell

(35)

Être ou ne pas être égal…

Partie v. Gestion de la mémoire

ÏQue signifieLetMsont la même liste ? ÏÀ ne pas confondre :

Ï L’égalitétestée avec==: les listes ont lemême contenu.

Ï L’identitétestée avecis: les listespointent au même endroitmémoire.

>>> L = [1,2,3] ; N = [1,2,3]

>>> M = L

>>> print(M is L , M==L) # M et L sont identiques True True

>>> print(M is N , M==N) # Égales mais non identiques False True

shell

ÏExercice : écrire une fonctioncopy(L)qui retourne un liste égale mais distincte de L.

(36)

Append et affectation

Partie v. Gestion de la mémoire

>>> L = [1,2]

>>> M = L ; affiche()

L:[1, 2] M:[1, 2] L is M:True

>>> L.append(3) ; affiche() L:[1, 2, 3] M:[1, 2, 3] L is M:True

>>> L = L + [4] ; affiche()

L:[1, 2, 3, 4] M:[1, 2, 3] L is M:False

shell

ÏLe calcul deL+[4]créé une nouvelle liste Ï Peut être très long si L est grand Ï Crée un nouvel objet en mémoire ÏL’appel deL.append(3)prolonge la liste

Ï est très rapide Ï a un effet globale !

(37)

Listes et appels de fonction

Partie v. Gestion de la mémoire

ÏAttention :le contenu d’une liste esttoujours modifiable globalement.

Ï La variableLcontient un lien vers la liste[1,2,3]

Ï Ce lien n’est pas modifiable(par défaut) par un fonction (variable locale).

Ï Le contenupointé par le lien est toujours modifiable.

M = [1, 2, 3, 4, 5]

i = 1

def f(i, j , L):

(L[i], L[j]) = (L[j], L[i]) i = i + 1

f(i, 3, M)

print(M) # affiche [1, 4, 2, 3, 5]

print(i) # affiche 1

script

Ï Pas deglobal Mdans la fonctionf Ï Donc M n’est pas modifié (pointe

toujours vers la même liste)

Ï Mais le contenu de cette liste a changé !

(38)

Sommaire

f Partie i. Annonces f Partie ii. Séquences

f Partie iii. Accès et constructeur f Partie iv. Mutabilité des listes f Partie v. Gestion de la mémoire f Partie vi. Petit algorithmes f Partie vii. Table des matières

(39)

Chiffres dans une chaîne

Partie vi. Petit algorithmes

ÏCalculons la liste des chiffres d’une chaîne s.

Ï Nous utilisons la méthodeisdigit()de la classe str.

Ï Vous devez être capabled’écrireisdigit! (cf.TP 3)

>>> '456'.isdigit() True

shell >>> '45a6'.isdigit() False

shell

ÏMéthode classique avec bouclefor.

def chiffres(s):

l = []

for c in s:

if c.idigit():

l.append(c) return l

script

>>> chiffres('01ivier E5T 23l4 fois 5YMP4') ['0', '1', '5', '2', '3', '4', '5', '4']

shell

(40)

Chiffres dans une chaîne avec compréhension

Partie vi. Petit algorithmes

ÏMéthode Pythonesque : compréhension de liste.

def chiffres(s):

return [c for c in s if c.isdigit()]

script

ÏNotez l’ordre des instructions : Ï D’abord leforpuis leif

Ï Comme dans le programme précèdent.

ÏNe marche pas (forcément) avec les autres langages.

ÏDurant cette UEprivilégiez la méthode classique.

(41)

Plus petit diviseur

Partie vi. Petit algorithmes

ÏPrincipes :(Déjà vu dans un cours précédent : Cours 2) Ï on traite les nombres pairs (divisibles par 2) à part, Ï ddivisensi et seulement sin%d == 0,

Ï nnon premier admet nécessairement un diviseurdpn def ppdiv(n):

if n%2==0:

return 2

racine = int(sqrt(n))

for d in range(3,racine+1,2):

if n%d==0:

return d return n

script

>>> ppdiv(2003) # premier 2003

>>> ppdiv(1003) # non premier 17

>>> [(c,ppdiv(c)) for c in range(15,20)]

[(15, 3), (16, 2), (17, 17), (18, 2), (19, 19)]

shell

(42)

Liste des nombres premiers

Partie vi. Petit algorithmes

ÏIl est facile de tester si un nombre est premier en utilisantppdiv…

def estPremier(n):

if n<2:

return False else:

return ppdiv(n)==n

script

Ï… puis de construire la liste des nombres premiers jusqu’à n : def premiers(n):

l = []

for p in range(n + 1):

if estPremier(p):

l.append(p) return l

script

>>> premiers(50)

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

shell ÏExercice : écrire cette fonction en une ligne (par compréhension)

(43)

Tri d’une liste par ordre croissant

Partie vi. Petit algorithmes

ÏPython possède deux primitives pour trier une listeLde nombres.

Ï la fonctionsorted(L)qui construit une nouvelle copie deL

Ï La méthodeL.sort()qui trie la listeLen place (sans créer de nouvelle liste, en modifiant le contenu deL).

>>> L1 = [3, 1, 6, 5, 2]

>>> sorted(L1) [1, 2, 3, 5, 6]

>>> L1

[3, 1, 6, 5, 2]

>>> L1 == sorted(L1) False

shell

>>> L2 = [3, 1, 6, 5, 2]

>>> L2.sort()

>>> L2

[1, 2, 3, 5, 6]

>>> L2 == sorted(L2) True

shell

(44)

Tri : Temps de calcul

Partie vi. Petit algorithmes

ÏLe temps de calcul de cet algorithme pour trier une liste ànéléments est proportionnel àn·log(n). Petite expérience :

from time import time from random import randint def chrono(n):

# On crée une liste de n nombres aléatoires L = [randint(1,1000) for i in range(n)]

t = time() # On lance le chrono

L.sort() # On fait le tri

t = time() - t # On arrête le chrono print('Temps pour',n,':',int(t*1000),'ms')

script

>>> chrono(200000) Temps pour 200000 24 ms

>>> chrono(400000) Temps pour 400000 51 ms

shell

ÏEn doublantn, on fait un peu plus que doubler le temps de calcul Ï ce qui est cohérent avec «n·log(n)»

(45)

Tri par sélection — Qu’est-ce?

Partie vi. Petit algorithmes ÏIl existe de nombreux algorithmes de tri.

Ï Quicksort, tri rapide, fusion, par tas, du sleep, etc.

Ï les meilleurs sont enn·log(n)

Ï La tri par séléction est proportionnelle àn2 ÏConcrètement

[5,6,7,2,4]

[ 5,6,7,2,4]

[ 2,6,7,5,4]

[2, 6,7,5,4]

[2, 4,7,5,6]

[2,4, 7,5,6]

[2,4, 5,7,6]

[2,4,5, 7,6]

[2,4,5, 6,7]

[2,4,5,6, 7]

(46)

Tri par sélection — Comment ?

Partie vi. Petit algorithmes

Ïimintrouve le minimum à partir deiet renvoie son indice def imin(L, i):

m = i

for j in range(i + 1, len(L)): # i+1 … len(L)-1 if L[j] < L[m]:

m = j return m

script

ÏL’algorithme de tri par sélection def tri(L):

n = len(L)

for i in range(n-1):

m = imin(L,i) # minimum de la fin de liste (L[i], L[m]) = (L[m], L[i]) # échange print('L=', L) # pour espionner la boucle

script

ÏÀ la fin de chaque étape lesipremiers éléments sont triés.

ÏPar super efficace, mais ça marche !

(47)

Tri par sélection — L’humiliation

Partie vi. Petit algorithmes

def chrono2(f,n):

# On crée une liste de n nombres aléatoires L = [randint(1,1000) for i in range(n)]

t = time() ; f(L) ; t = time() - t print(f.__name__,':',int(t*1000),'ms')

script

>>> L = [4,2,7,11,2,1]

>>> tri(L)

L = [1, 2, 7, 11, 2, 4]

L = [1, 2, 7, 11, 2, 4]

L = [1, 2, 2, 11, 7, 4]

L = [1, 2, 2, 4, 7, 11]

L = [1, 2, 2, 4, 7, 11]

>>> chrono2(sorted,10000) sorted : 2 ms

>>> chrono2(tri,10000) # Après avoir enlevé les prints tri : 2566 ms

shell

(48)

Merci pour votre attention Questions

?

(49)

Cours 5 — Les listes et les tuples

f Partie i. Annonces QCM Noté Examen de mi-semestre f Partie ii. Séquences

Définitions Tuples Listes

f Partie iii. Accès et constructeur Initialisation

Opérations sur les séquences Accès par indice Parcours

Écrire une fonctionindex La méthodeindex Déstructuration Extraction de tranche

Construction par compréhension Exercices

Conversions Construction d’une matrice f Partie iv. Mutabilité des listes

Modification de liste Remarques sur la mémoire Ajout d’un élément Exemple : créer la liste des diviseurs Méthodes usuelles sur les listes f Partie v. Gestion de la mémoire

La pile et le tas La pile et les variables locales La pile et les appels de fonctions Le tas et les variables globales Partage de variables

Listes et variables Être ou ne pas être égal…

Appendet affectation Listes et appels de fonction

f Partie vi. Petit algorithmes Chiffres dans une chaîne

Chiffres dans une chaîne avec compréhension Plus petit diviseur

Liste des nombres premiers Tri d’une liste par ordre croissant Tri : Temps de calcul Tri par sélection — Qu’est-ce ? Tri par sélection — Comment ? Tri par sélection — L’humiliation f Partie vii. Table des matières

Références

Documents relatifs

Webassist Formation-Maths 3eme exercices corrigés sur les : Nombres Entiers

Fonctionnement d'une pile La structure de pile permet de retrouver les éléments dans l'ordre inverse de 1 Une structure de file permet de retrouver les éléments dans l'ordre où

b) Sur un tas binaire, écrivez l'algorithme d'un traitement récursif propMax(i) permettant d'assurer qu'à partir de l'indice i chaque élément du tableau est

Les deux expressions ne sont cependant pas équivalentes, car dans le premier cas, on a bien défini un tableau de taille &lt;val1&gt;x&lt;val2&gt; et un emplacement mémoire défini a

Pour représenter une liste contentant 3 éléments &lt;x,y,z&gt;, on gère un tableau unidimensionnel appelé tabÉlément d'enregistrements à deux champs, le premier appelé val

La liste finale est établie via la flèche pour fonctionnalités aditionelles (1) dans l’option de menu Gestion du cabinet - Bibliothèque, puis l’option Liste de patients (2).

(d) Modifier le code afin que l’image soit un dégradé vertical de bleu, avec la première ligne noire pur et la dernière ligne bleue pur.. (e) Modifier le code afin que l’image soit

• Quand tous les objets devant composer la liste sont englobés dans le rectangle de sélection, relâcher le bouton droit de la souris puis la touche Alt Alt.. • Les