Python2_c2 [Mode de compatibilité] - Polytech Nice Sophia
Transcription
Python2_c2 [Mode de compatibilité] - Polytech Nice Sophia
Un peu plus sur chaînes Programmation Langage de script : PYTHON Rappel : Les chaînes de caractères constituent un type de donnée composite, c'est-à-dire une entité faite elle-même d'un ensemble d'entités plus petites (caractères). Nous pouvons traiter ces données tantôt comme un seul objet, tantôt comme une suite ordonnée d'éléments. Ce sont des séquences (dont font partie aussi les listes) Niveau 2 Concaténation / Répétition : + ou * Indiçage ([]), Extractions ([:-1]), longueur ( méthodes len()) … Parcours d'une séquence (instruction for … in …) Formatage des chaînes de caractères Les chaînes de caractères ne sont pas modifiables (Création d'une nouvelle chaîne à chaque fois) 2 1 Le module string Le module string le module string contient de nombreux outils de traitement des chaînes de caractères: Voici quelques exemples de fonction du module string: s.split([sep]) Convertit une chaîne en une liste de sous-chaînes (caractère séparateur = espace par défaut) Ces nombreuses fonctions vont vous simplifier le travail lors de la récupération ou le traitement de fichiers de données. >>> c2="Votez pour moi" >>>a=c2.split() >>>print(a) ["Votez","pour","moi"] >>>c4="Cet exemple, parmi d'autres, peut servir" >>>print(c4.split(",")) ["Cet exemple", "parmi d'autres","peut servir"] Pour consulter la liste des fonctions disponibles, aller sur le site de python: http://docs.python.org/lib/string-methods.html sep.join(liste) Rassemble une liste de chaînes en une seule chaine de caractères Plus besoin d'importer le module dans les versions récentes de python 3 >>>b2=["Salut","les","copains"] >>>print(" ".join(b2)) Salut les copains >>>print("---".join(b2,)) Salut---les---copains 4 1 Le module string s.find(sch) Le module string s.lower() cherche la position d'une sous-chaîne dans la chaîne s.count(sch) compte le nombre de sous-chaînes sch dans la chaîne >>>ch1="le héron au long bec emmanché d'un long cou" >>>ch2="long" >>>print(ch1.count(ch2)) 2 s.upper() convertit une chaîne en majuscules s.swapcase() versa convertit toutes les majuscules en minuscules et vice- >>> ch4="La CIGALe et LA FourMi" print(ch4.swapcase()) lA cigalE ET la fOURmI s.index(c, [pos]) retrouve l'indice de la première occurrence du caractère c dans la chaîne >>> ch3="Portez ce vieux whisky au juge blond qui fume" >>>print(ch3.index("w")) 16 >>> print(ch3.index("e",5)) cherche seulement à partir 8 convertit une chaîne en minuscules >>> ch="ATTENTION : Danger !" >>>print(ch.lower()) attention : danger ! >>>ch1="Cette leçon vaut bien un fromage, sans doute ?" >>>ch2="fromage" >>>print(ch1.find(ch2)) 25 s.replace(c1,c2) remplace tous les caractères c1 par des caractères c2 dans la chaîne >>> ch5="Si ce n'est pas toi c'est donc ton frère" >>>print(ch5.replace(" ","*")) Si*ce*n'est*pas*toi*c'est*donc*ton*frère de l'indice 5 5 Le module string 6 Les chaînes sont des objets Rappel s.strip() renvoie une chaîne de caractères avec la suppression des espaces avant et après. Appartenance d'un élément à une séquence >>> tutu=" \tBonjour, voici une chaine \t \n" >>> print(tutu) Bonjour, voici une chaine L'instruction in peut être utilisée indépendamment de for, pour vérifier si un élément donné fait partie ou non d'une séquence. >>> tata=tutu.strip() >>> print(tata) Bonjour, voici une chaine >>> >>>car="e" >>>voyelles="aeiouyAEIOUY" >>>if car in voyelles: print(car, "est une voyelle") Renvoie un <Bool> True or False Il existe bien sur d'autres fonctions associées au module string ../.. 7 8 2 Un peu plus sur les listes Un peu plus sur les listes: méthodes Nous savons comment modifier un de ses éléments, mais il est aussi parfois très pratique d'en remanier la taille (e.g. ajouter, insérer ou supprimer un ou plusieurs éléments etc...). Les listes possèdent pour ça des méthodes: Rappel : Une liste est une structure de données qui contient une série de valeurs. >>>toto=[] >>>mix = ['girafe',5.0,'dahu',2] >>>Mix[1] 5.0 >>>Mix[-2] 'dahu' >>>Mix[1:3] [5.0,'dahu'] Création d'une liste vide Différents types acceptés Notion d'indiçage list.append(element) : ajoute un élément à la fin de la liste. >>> x = [1,2,3] >>> x.append(2239) >>> x [1, 2, 3, 2239] Indiçage négatif Sélection d'une partie del liste[indice] : supprime un élément à la position indice de la liste. Outils particuliers : >>>range(0,10) >>>len(Mix) Création d'une liste de taille 10 Longueur de la liste >>> del x[1] >>> x [1, 3, 2239] Utilisation de listes de listes >>>Mix[0][1] 'i' 9 Un peu plus sur les listes: méthodes Un peu plus sur les listes : exemple Exemple: Ecrivez un script qui recopie une chaîne (dans une nouvelle variable) en l'inversant. ("program" -> "margorp"). On peut l'améliorer grâce aux méthodes des listes et des chaînes de caractères: list.insert(indice,objet) : insère un objet dans une liste avant l'indice. >>> x.insert(2,-15) >>> x [1, 3, -15, 2239] Solution 1: chaine="zorglub"*500000 newchaine="" i=len(chaine)-1 while i >=0: newchaine=newchaine+chaine[i] i=i-1 print(newchaine) list.sort() : tri la liste. (Attention au mélange de type !) >>> x.sort() >>> x [-15, 1, 3, 2239] list.reverse() : inverse la liste. >>> x.reverse() >>> x [2239, 3, 1, -15] list.index(objet) : retrouver l'indice d'un élément. >>> x.index(-15) 3 10 11 Pb: si on traire une chaîne de milliers de caractères : coûteux en temps de calcul ! Tps= 7.20s Solution 2: chaine="zorglub"*500000 listch=[] i=len(chaine)-1 while i >=0: listch.append(chaine[i]) i=i-1 newchaine="".join(listch) print(newchaine) Plus rapide si chaîne longue ! Tps=1.53s 12 3 Un peu plus sur les listes Attention copie de listes Rappel : Les listes sont modifiables et une liste remaniée n'est pas renvoyée. (directement modifiée) Il est très important de savoir que l'affectation d'une liste (à partir d'une liste préexistante) crée en réalité une référence et non une copie : La méthode append est particulièrement pratique car elle permet de construire une liste associée à une boucle. Par exemple, si on veut convertir une chaîne de caractères en liste on peut utiliser quelque chose de la forme : >>> x = [1,2,3] >>> y = x >>> y [1, 2, 3] >>> x[1] = -15 >>> y [1, -15, 3] >>> seq = "CAAAGGTAACGC" >>> seq_list = [] >>> for i in seq: seq_list.append(i) Vous voyez que la modification de x modifie aussi y. Techniquement, Python utilise des pointeurs (la nouvelle liste pointe sur l'adresse machine de l'ancienne liste) vers les mêmes objets et ne crée pas de copie à moins que vous n'en ayez fait la demande explicitement. >>> seq_list ['C', 'A', 'A', 'A', 'G', 'G', 'T', 'A', 'A', 'C', 'G', 'C'] Remarquez que l'on peut utiliser directement la fonction list(seq) qui prend n'importe quel objet séquentiel (liste, chaîne de caractères, etc...) et qui renvoie une liste. 13 >>> x = [1,2,3] >>> y = x[:] >>> x[1] = -15 >>> y [1, 2, 3] Attention copie de listes Notion de pointeurs Pour le vérifier, on peut utiliser la fonction id() qui renvoie un objet correspondant à la position en mémoire d'une variable: Principe : >>> fable=["Je","plie","mais","ne","romps","point"] >>> phrase=fable >>> fable[4]="casse" >>> phrase ["Je","plie","mais","ne","casse","point"] >>> x = [1,2,3] >>>id(x) 30872064 >>> y = x >>> y [1, 2, 3] >>> id(y) 30872064 >>> z = x[:] >>> id(z) 31022472 14 fable >>> x[1] = -15 >>>x [1, -15, 3] "Je" "plie" "mais" "ne" "romps" "point" phrase fable[4]="casse" >>> z [1, 2, 3] fable "Je" "plie" "mais" "ne" "casse" "point" 15 phrase 16 4 Notion de pointeurs Importation de modules >>> fable=["Je","plie","mais","ne","romps","point"] >>> phrase=fable[:] >>> fable[4]="casse" >>> phrase ["Je","plie","mais","ne", "romps","point"] Il existe des questions tellement courantes qu'il serait peu productif de les réécrire à chaque fois des fonctions correspondantes. Les programmes qui les résolvent sont souvent fournis avec le langage de programmation dans des bibliothèques de fonctions (librairies). "Je" "plie" "mais" "ne" "romps" "point" fable En Python, un telle bibliothèque est constituée de nombreux modules et un module est constitué de plusieurs fonctions (ou procédures) déjà programmées. "Je" "plie" "mais" "ne" "romps" "point" phrase fable[4]="casse" fable "Je" "plie" "mais" "ne" "casse" "point" phrase "Je" "plie" "mais" "ne" "romps" "point" 17 Importation de modules 18 Importation de modules Dans un module, on prend soin de regrouper les fonctions qui permettent de gérer un type de problème donné, bien souvent ce sont simplement les opérations associées à une structure de données adaptée au problème. La plupart de ces modules sont déjà installés dans les versions standards de Python, voir http://docs.python.org/3/py-modindex.html On va avoir des modules pour des calculs mathématiques, la gestion de nombre aléatoire, des modules graphiques etc… Exemple: le module random (tirage aléatoire) Il faudra ne pas oublier en début du script d'importer les modules nécessaires à la résolution de notre problème. Un module est constitué: De variables comme des listes, des chaines de caractères, des dictionnaires… module.variable De fonctions et des procédures déjà programmées module.fonction() 19 >>> import random >>> random.randint(0,10) 9 L'instruction import vous permet d'importer toutes les fonctions du module random. Ensuite, nous utilisons la fonction randint() du module random. Notation: objet random.randint (la fonction randint est considérée comme une méthode de l'objet random, comme f.close() avec les fichiers). 20 5 Importation de modules Module math Le module math contient les définitions de nombreuses opérations mathématiques telles que sinus, cosinus, tangente, racine carré, etc… >>> random.randint(0,100) 52 >>> random.uniform(0,3.1415926535897931) 1.3634213820695191 Exemple: On peut ainsi utiliser toutes ses fonctions, par exemple shuffle, qui permute une liste aléatoirement, choice, sample, etc… >>> x = [1,2,3,4,5,6,8,9,10] >>> random.shuffle(x) >>> x [1, 4, 8, 10, 3, 5, 9, 6, 2] >>> random.shuffle(x) >>> x [6, 9, 5, 10, 8, 3, 4, 1, 2] >>> random.choice(x) 5 >>> >>> random.sample(x, 3) [9, 2, 4] import math nombre=121 angle=math.pi/6 print("racine carre de ", nombre, "=", math.sqrt(nombre)) print("sinus de ", angle, "radians =", math.sin(angle)) print(math.sqrt(121)) 21 22 Module turtle (rigolo !) Module turtle (rigolo !) Module Python qui permet de réaliser des "graphiques tortue", c'està-dire des dessins correspondant à la trace laissée par la "tortue virtuelle". Exemple: import turtle turtle.forward(120) turtle.left(90) turtle.color("red") turtle.backward(10) turtle.reset() # avancer d'une distance donnée # Tourner à gauche d'un angle donné (en degré) # couleur # reculer # effacer tout Exemple: import turtle import random color=["red","green","blue","black","yellow"] turtle.reset() a=0 while a <12: a=a+1 turtle.color(random.choice(color)) turtle.forward(150) turtle.left(150) Etc… voir http://www.python.org/doc/current/lib/module-turtle.html input("taper sur entree pour terminer") 23 24 6 Importation modules perso Importation modules perso exemple On peut même écrire soi-même des modules. Lorsque l’on veut écrire un gros logiciel, c’est généralement une bonne idée de le découper en modules (qui seront du même coup réutilisables par ailleurs). Il suffit alors d’importer les modules pour utiliser les fonctions qui y ont été programmées. Pour créer un module, il suffit de programmer les fonctions qui le constituent dans un fichier portant le nom du module, suivi du suffixe « .py ». Depuis un (autre) programme en Python, il suffit alors d’utiliser la commande import pour pouvoir utiliser ces fonctions. 25 Importation modules perso exemple 26 Gestions des exceptions Les exceptions sont les opérations qu'effectue un interpréteur ou un compilateur lorsqu'une erreur est détectée au cours de l'exécution d'un programme. L'exécution du programme est interrompue et un message d'erreur s'affiche: Librairie HeliQuest >>> print(55/0) Traceback (most recent call last): File "<pyshell#25>", line 1, in -toplevelprint(55/0) ZeroDivisionError: integer division or modulo by zero Il est possible de prévoir à l'avance certaines erreurs qui risque de se produire à tel ou tel endroit du programme, et d'inclure à cet endroit des instructions particulières qui seront activées seulement si l'erreur se produit. Instructions try – except - else 27 28 7 Gestions des exceptions Gestions des exceptions Exemple: Ne pas planter si le fichier n'est pas au bon endroit try : file=input("Entrez un nom de fichier:") try: f=open(file,"r") except: print("Le fichier", file, "est introuvable") bloc d'instructions except: bloc instruction Le bloc d'instructions qui suit directement try est exécuté par Python sous réserve. Si une erreur survient, Python annule l'instruction et exécute à sa place le code inclus dans le bloc qui suit l'instruction except. Si aucune erreur s'est produite dans les instructions qui suivent try, c'est le bloc qui suit l'instruction else qui est exécuté (facultatif). 29 Autre exemple: an=input("Entrez une annee: ") try: an=int(an) print(an) print("Merci") except: print("Vous n'avez pas entre une annee") print("c'est pas gentil") t=input("Tapez sur Entree pour terminer") else: print("Fin du programme") print("je peux faire plein de chose avec cette variable") t=input("Tapez sur Entree pour terminer") Un peu plus les dictionnaires Exemple 30 Un peu plus les dictionnaires En créant une liste de dictionnaires possédant les mêmes clés, on accède à leur intérêt principal (qui pourrait rappeler les bases de données) : >>> disque1 {'style': 'Trash Metal', 'author': 'Pantera', 'name': 'Far beyond driven', 'year': 2000} >>> disque2 {'style': 'Rock Pop', 'author': 'U2', 'name': 'War', 'year': 1983} Les méthodes keys et values renvoient les clés et les valeurs d'un dictionnaire (sous forme d'un objet dict_keys) : >>> disque1.keys() dict_keys(['style', 'author', 'name', 'year']) >>> disque1.values() dict_values(['Trash Metal', 'Pantera', 'Far beyond driven', 2000]) >>> discotheque = [disque1,disque2] >>> discotheque [{'style': 'Trash Metal', 'author': 'Pantera', 'name': 'Far beyond driven', 'year': 2000}, {'style': 'Rock Pop', 'author': 'U2', 'name': 'War', 'year': 1983}] >>> for i in discotheque: print(i['author'] ) Pantera U2 Pour vérifier si une clé existe, vous pouvez utiliser: >>> if "style" in disque2: print("la cle style existe dans le dico") la cle style existe dans le dico 31 32 8 Modules lié à Internet (! python 3) Modules lié à Internet Les URL (Universal Ressource Locator) sont des chaînes, ressemblant par exemple à : http://www.python.org . Des modules, urllib, urllib.request, urlparse fournissent des outils pour manipuler les url. (attention aux versions de Python !) urllib définit quelques fonctions pour créer des programmes destinés à être des utilisateurs actifs du Web. Par exemple: urlopen(url) ouvre en lecture un objet réseau auquel une URL fait référence. >>>import urllib.request >>>page=urllib.request.urlopen("http://www.python.org") >>>page.readline() '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\n' 33 Module lié à l'OS Exemple import urllib.request u=urllib.request.urlopen("http://www.pdb.org/pdb/files/1BTA.pdb") pdblines=u.readlines() u.close() for ligne in pdblines: print(ligne[:-1].decode("utf8") [:-1]) HEADER COMPND SOURCE SOURCE EXPDTA AUTHOR REVDAT JRNL JRNL JRNL JRNL JRNL RIBONUCLEASE INHIBITOR 09-MAY-94 1BTA BARSTAR (NMR, MINIMIZED AVERAGE STRUCTURE) (BACILLUS AMYLOLIQUEFACIENS) RECOMBINANT FORM EXPRESSED IN 2 (ESCHERICHIA COLI) NMR M.J.LUBIENSKI,M.BYCROFT,S.M.V.FREUND,A.R.FERSHT 1 31-JUL-94 1BTA 0 AUTH M.J.LUBIENSKI,M.BYCROFT,S.M.V.FREUND,A.R.FERSHT TITL THREE-DIMENSIONAL SOLUTION STRUCTURE AND ==13==C TITL 2 ASSIGNMENTS OF BARSTAR USING NUCLEAR MAGNETIC TITL 3 RESONANCE SPECTROSCOPY REF TO BE PUBLISHED 1BTA 1BTA 1BTA 1BTA 1BTA 1BTA 1BTA 1BTA 1BTA 1BTA 1BTA 1BTA …/… 2 3 4 5 6 7 8 9 10 11 12 13 34 Module lié à l'OS Module OS Le module os est la principale interface avec le système d'exploitation. Il offre un accès générique au système ainsi qu'une interface indépendant de la plateforme. Possibilités beaucoup plus limitées sous windows (!= Linux): >>>import os >>> os.getcwd() Création de répertoire (à partir du répertoire courant) >>>os.mkdir("TITITI") Suppression de fichier >>>os.remove("Fichier") Suppression d'un répertoire (doit être vide) >>>os.rmdir("TITITI") 'C:\\Enseignements\\EPU\\Python1EPU' Renommer un fichier ou un repertoire >>>os.rename(source, destination) Notez le \\ comme séparateur sous windows. >>> chemin=os.chdir("E:\\Enseignements") Attention : pas de demande de confirmation Fait de c:\\Enseignements le répertoire courant. >>> os.getcwd() 'E:\\Enseignements' >>>os.listdir(chemin) Renvoie une liste contenant les noms de tous les fichiers et sous répertoire de Chemin. (ordre quelconque). 35 >>> os.curdir '.' >>> os.sep '\\' # chaine représentant le répertoire courant # séparateur des composants d'un chemin 36 9 Module : re Module : re Le module re vous permet d'utiliser des expressions régulières au sein de Python. Les expressions régulières sont de très puissants outils de manipulation de texte et de données. C'est une sorte de "minilanguage" de programmation qui permettent de décrire et de "parser" du texte. Exemple sous Windows : *.txt l'étoile signifie "remplace n'importe quoi" La fonction search vous permet de rechercher un 'pattern' au sein d'une chaîne de caractères avec une syntaxe de la forme search(pattern, string). Si pattern existe dans string, python renvoie une instance MatchObject, si on utilise cette instance dans un test, il sera considéré comme vrai: >>> import re >>> chaine = "totogogototo" >>> if re.search("gogo",chaine): print(chaine) totogogototo 37 Pour chercher un motif (pattern) particulier, utilisation des métacaractères pour construire la demande: "^" ATGCGT mais pas à la chaîne CCATGTT. "$" n'importe quel caractère sauf A et B Exemple : l'expression CG[^AB]T correspond à CG9T, CGCT... mais pas à CGAT ni à CGBT. caractère d'échappement (pour protéger certains caractères) Exemple : l'expression \+ désigne le caractère + sans autre signification particulière. L'expression A\.G correspond à A.G et non pas à A suivi de n'importe quel caractère, suivi de G. "*" 0 à n fois le caractère précédent ou l'expression entre parenthèses précédente Exemple : l'expression A(CG)*T correspond à AT, ACGT, ACGCGT... "+" 1 à n fois le caractère précédent ou l'expression entre parenthèses précédente Exemple : l'expression ACGCGT... mais pas à AT. n'importe quel caractère (mais un caractère quand même) Exemple : l'expression A.G correspond à ATG, AtG, A4G, mais aussi à A-G ou à A G. "[ABC]" le caractère A ou B ou C (un seul caractère) Exemple : l'expression T[ABC]G correspond à TAG, TBG ou TCG, mais pas à TG. "[A-Z]" n'importe quelle lettre majuscule Exemple : l'expression C[A-Z]T correspond à CAT, CBT, CCT... "[a-z]" n'importe quelle lettre minuscule "[0-9]" n'importe quelle chiffre 38 Module : re "[A-Za-z0-9]" n'importe quelle caractère alphanumérique "\" fin de chaîne de caractères ou de ligne Exemple : l'expression ATG$ correspond à la chaîne de caractères TGCATG mais pas avec la chaîne CCATGTT. "." Module : re "[^AB]" début de chaîne de caractères ou de ligne Exemple : l'expression ^ATG correspond à la chaîne de caractères A(CG)+T correspond à 0 à 1 fois le caractère précédent ou l'expression entre parenthèses précédente Exemple : l'expression A(CG)?T correspond à AT ou ACGT. n fois le caractère précédent ou l'expression entre "{n}" parenthèses précédente n à m fois le caractère précédent ou l'expression entre "{n,m}" parenthèses précédente au moins n fois le caractère précédent ou l'expression "{n,}" entre parenthèses précédente au plus n fois le caractère précédent ou l'expression "{,m}" entre parenthèses précédente "(CG|TT)" chaînes de caractères CG ou TT Exemple : l'expression A(CG|TT)C correspond à ACGC ou ATTC. "?" ACGT, 39 40 10 Module : re Module : re Création de l'expression régulière: Exemples de motif: ch=" Sous ses pins, on trouve ses chaussures sous le transat " exp=re.compile("(sous|ses)") >>> type(exp) <class '_sre.SRE_Pattern'> "^L": la lettre L au début de la chaîne "[A-Z]$": n'importe quelle lettre à la fin de la chaîne Recherche cette expression dans la chaîne : result=re.search(exp,ch) va chercher l'expression dans la chaîne et stoppe dès succès. "(toto)" : le motif toto "(toto).*(tutu)" : motif toto n'importe quel caractère répété de 0 à n fois puis tutu "(toto|tutu)" : motif toto ou tutu >>> res=re.search(exp,ch) >>> if res: print("trouve") trouve result=re.findall(exp,chaine) va chercher toutes les expressions dans la chaîne. Renvoie une liste de ces motifs. "(tat)[^u]": motif tat puis n'importe quel caractère sauf le u >>> res=re.findall(exp,ch) >>> print(res) ['ses', 'ses', 'sous'] "(toto){2,4}": motif toto répété de 2 à 4 fois 41 Module : re >>> >>> >>> >>> >>> >>> >>> 42 Vitesse d'itération import time # creation d'une liste de x elements # (A adapter suivant la vitesse de vos machines) taille = 50000000 print("Création d'une liste avec %d elements" %( taille)) toto = range( taille ) # la variable 'a' accede à un element de la liste expression= re.compile("([0-9]+)\.([0-9]+)") resultat = re.search(expression, "pi vaut 3.14") resultat.group(0) '3.14' resultat.group(1) '3' resultat.group(2) '14' resultat.start() 8 resultat.end() 12 Dans cet exemple, on recherche un nombre composé de plusieurs chiffres [0-9]+, suivi d'un point \. (le point a une signification comme méta-caractère, donc il faut l'échapper avec \ pour qu'il ait une signification de point), suivi d'un nombre à plusieurs chiffres [0-9]+. Les parenthèses dans l'expression régulière permettent de créer des groupes qui seront récupérés ultérieurement par la fonction group(). La totalité de la correspondance est donné par group(0), le premier élément entre parenthèse est donné par group(1) et le second par group(2). 43 Exemple # méthode 1 print("method 1") start = time.time() for i in range( len(toto) ): a = toto[i] print("methode 1 (for in range) : %.1f secondes" %( time.time() - start )) # méthode 2 print("method 2") start = time.time() for ele in toto: a = ele print("methode 2 (for in) : %.1f secondes" %( time.time() - start )) 44 11 Vitesse d'itération Vitesse d'itération Creation d'une liste avec 50000000 elements methode 1 (for in range) : 13.2 secondes methode 2 (for in) : 4.7 secondes >>> #methode 3 start=time.time() for idx, ele in enumerate(toto): a=ele print("methode 3 (for in enumerate): %.1f secondes"%(time.time()-start)) La méthode la plus rapide pour parcourir une liste est donc d'itérer directement sur les éléments (for element in liste). Cette instruction est à privilégier le plus possible. La méthode for i in range(len(liste)) est particulièrement lente car la commande range(len(liste)) génère une énorme liste avec tous les indices des éléments (la création de liste est assez lente en Python). Creation d'une liste avec 50000000 elements methode 1 (for in range) : 13.2 secondes methode 2 (for in) : 4.7 secondes methode 3 (for in enumerate): 7.5 secondes La variable idx va correspondre à l'indice (utilisable en toto[idx]), ele sera l'élément de la liste toto. Par contre, si il vous faut récupérer le numéro d'indice ?? Une solution: fonction enumerate() 45 46 12