Itérateurs Expressions régulières Les caractères Python 2 c. 3 INF8007 — Langages de script Structures de contrôle et expressions régulières Michel Desmarais Génie informatique et génie logiciel École Polytechnique de Montréal Hiver, 2017 (31 janvier 2017) INF8007 — Langages de script — Structures de contrôle et expressions régulières 1/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Structures de contrôle et expressions régulières 1 Boucles et itérateurs 2 Expressions régulières 3 Les caractères Python 2 c. 3 INF8007 — Langages de script — Structures de contrôle et expressions régulières 2/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Boucle while w h i l e expression : instruction 1 ... else : instruction 2 ... # optionnel break : sort de la boucle sans exécuter le corps de else continue : saute les instructions de la boucle qui suivent else : corps exécuté seulement si la boucle se termine par expression == False INF8007 — Langages de script — Structures de contrôle et expressions régulières 3/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Boucle for f o r i i n sequence : instruction 1 ... sequence peut être tout objet itérable comme une liste, un nuplet, ou un dictionnaire (l’itérateur sera alors assigné à chaque clé en séquence). On peut aussi utiliser plusieurs itérateurs : > > > f o r (i , j ) i n ( (1 , 2 ) ,(3 , 4 ) ) : ... p r i n t i+j ... 3 7 INF8007 — Langages de script — Structures de contrôle et expressions régulières 4/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Quelques exemples avec for > > > f o r i i n range (1 , 10 , 2 ) : ... print i 1 3 5 7 9 > > > zip ( [ 'a ' , 'b ' , 'c '] , range (1 , 4 ) ) [ ( 'a ' , 1 ) , ( 'b ' , 2 ) , ( 'c ' , 3 ) ] > > > f o r i i n zip ( [ 'a ' , 'b ' , 'c '] , range (1 , 4 ) ) : ... print i ( 'a ' , 1 ) ( 'b ' , 2 ) ( 'c ' , 3 ) INF8007 — Langages de script — Structures de contrôle et expressions régulières 5/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Assignations imbriquées >>> >>> 1 >>> 2 >>> >>> 3 >>> (a , b ) = (1 , 2 ) a b (a , [b , c ] ) = (1 , [2 , 3 ] ) c INF8007 — Langages de script — Structures de contrôle et expressions régulières 6/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Assignations dans une boucle for > > > zip ( [ ( 'a ' , 'A ') ,( 'b ' , 'B ') ,( 'c ' , 'C ') ] , range (1 , 4 ) ) [ ( ( 'a ' , 'A ') , 1 ) , ( ( 'b ' , 'B ') , 2 ) , ( ( 'c ' , 'C ') , 3 ) ] > > > f o r ( (i , j ) ,k ) i n \ zip ( [ ( 'a ' , 'A ') ,( 'b ' , 'B ') ,( 'c ' , 'C ') ] ,\ range (1 , 4 ) ) : ... p r i n t (i ,j , k ) ... ( 'a ' , 'A ' , 1 ) ( 'b ' , 'B ' , 2 ) ( 'c ' , 'C ' , 3 ) INF8007 — Langages de script — Structures de contrôle et expressions régulières 7/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Objets itérateurs Les boucles peuvent en fait s’appliquer à des objets itérateurs. Par exemple, la fonction open(file) retourne un itérateur. Ces instructions affichent donc le contenu d’un fichier : f o r i i n open ( ' fichier ') print i De manière générale, tout objet iter qui implémente les méthodes next() et iter () peut servir dans une boucle for i in iter. La boucle s’arrête lorsque la méthode next() lève l’exception StopIteration. INF8007 — Langages de script — Structures de contrôle et expressions régulières 8/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Autres expressions Tests dans une séquence : > > > i f 12 i n range (1 , 100 ) : p r i n t True True > > > i f 12 i n range ( 20 , 100 ) : p r i n t True > > > i f 'b ' i n ( 'a ' , 'b ' , 'c ') : p r i n t True True Liste avec boucle for : >>> [0 , >>> [0 , [ x f o r x i n range ( 4 ) ] 1, 2, 3] [ x * * 2 f o r x i n range ( 4 ) ] 1, 4, 9] INF8007 — Langages de script — Structures de contrôle et expressions régulières 9/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 La fonction map Itérateur qui collectionne les résultats : >>> ... ... >>> 3 >>> [4 , d e f plus (a , b ) : return a + b plus (1 , 2 ) map ( plus , (1 ,2 , 3 ) , (3 ,4 , 5 ) ) 6, 8] La fonction apply(f,args) fait une application unique : > > > apply ( ( lambda a , b : a + b ) , (1 , 2 ) ) 3 INF8007 — Langages de script — Structures de contrôle et expressions régulières 10/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 lambda comme fonction anonyme On peut créer une fonction anonyme avec l’expression : ( lambda args : expression ) Par exemple : > > > ( lambda a , b : a + b ) (1 , 2 ) 3 > > > map ( ( lambda a , b : a + b ) , (1 , 2 ) , (3 , 4 ) ) [4 , 6 ] INF8007 — Langages de script — Structures de contrôle et expressions régulières 11/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Assignation des arguments L’assignation des arguments peut se faire par positionnement, par défaut, ou par nom. > > > ( lambda ' xy ' > > > ( lambda ' xz ' > > > ( lambda ' xuz ' > > > ( lambda ' xyu ' a , b = 'y ': a + b ) ( 'x ') a , b = 'y ': a + b ) ( 'x ' , 'z ') a , b = 'y ' ,c = 'z ': a + b + c ) ( 'x ' , 'u ') a , b = 'y ' ,c = 'z ': a + b + c ) ( 'x ' ,c = 'u ') INF8007 — Langages de script — Structures de contrôle et expressions régulières 12/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Assignation des arguments (2) Assignations variables : > > > ( lambda a ,b , c : a + b + c ) ( * ( 'x ' , 'y ' , 'z ') ) ' xyz ' > > > ( lambda a = 'x ' ,b = 'y ' ,c = 'z ': a + b + c ) \ ( * * { 'b ': 'u ' , 'a ': 'v '} ) ' vuz ' Nombre indéfini d’arguments : > > > ( lambda a , * b : (a , b ) ) ( 'x ' , 'y ' , 'z ') ( 'x ' , ( 'y ' , 'z ') ) INF8007 — Langages de script — Structures de contrôle et expressions régulières 13/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Compréhension de listes Semblable au map et très courant en Python. > > > [ elem * 2 f o r elem i n range ( 4 ) ] [0 , 2 , 4 , 6 ] > > > [ elem * 2 f o r elem i n range ( 4 ) i f elem > 1 ] [4 , 6 ] > > > [ str ( elem2 ) + elem1 f o r ( elem1 , elem2 ) i n zip ( [ 'a ' , 'b ' , 'c '] , range ( 3 ) ) ] [ ' 0a ' , ' 1b ' , ' 2c '] INF8007 — Langages de script — Structures de contrôle et expressions régulières 14/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Compréhension d’ensembles et de dictionnaires (python 3) On utilise les accolades pour créer des ensembles (set) : > > > { i f o r i i n range ( 4 ) } {0 , 1 , 2 , 3 } On créé un dictionnaire avec la syntaxe <clé>:<valeur> : > > > { x : y f o r (x , y ) i n zip ( ( 'a ' , 'b ' , 'c ') , range ( 3 ) ) } { 'a ': 0 , 'c ': 2 , 'b ': 1 } INF8007 — Langages de script — Structures de contrôle et expressions régulières 15/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exemple de compréhension de dictionnaires Exemple d’utilisation pour créer un dictionnaire de fichiers contenant la longeur de chacun. > > > r = { f : os . stat ( f ) f o r f i n glob . glob ( '* roman *. py ') } > > > r [ ' roman1 . py '] . st_size 2192 INF8007 — Langages de script — Structures de contrôle et expressions régulières 16/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Structures de contrôle et expressions régulières 1 Boucles et itérateurs 2 Expressions régulières 3 Les caractères Python 2 c. 3 INF8007 — Langages de script — Structures de contrôle et expressions régulières 17/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Les expressions régulières Une des utilisation les plus fréquentes pour les langages de script Module nommé re (import re) Documentation complète : http://docs.python.org/library/re.html INF8007 — Langages de script — Structures de contrôle et expressions régulières 18/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Manipulations de chaı̂nes caractères Quelques opérations utiles pour les chaı̂nes de caractères dont la documentation est aux liens suivants : http://docs.python.org/library/stdtypes.html# string-methods http://docs.python.org/library/string.html Une introduction est disponible au lien : http://docs.python.org/howto/regex.html#regex-howto > > > 'A man with two noses '. strip ( ' ') 'A man with two noses ' > > > 'A man with two noses '. split ( ' ') [ 'A ' , ' man ' , ' with ' , ' two ' , ' noses ' , ' ' , ' ' , ' ' , ' ' , ' '] > > > 'A man with two noses '. strip ( ' ') . split ( ' ') [ 'A ' , ' man ' , ' with ' , ' two ' , ' noses '] > > > re . sub ( ' + ' , ' ' , 'A man with two noses ') 'A man with two noses ' INF8007 — Langages de script — Structures de contrôle et expressions régulières 19/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Manipulations de chaı̂nes caractères (2) > > > re . sub ( ' <\ W +(\ w +)\ W + > ' , ' <\g <1 > > ' , ' < BALISE > ' > > > re . sub ( ' <\ W +(\ w +)\ W + > ' , ' <\g <1 > > ' , ' <? php BALISE > ' > > > re . sub ( ' <\ W +(\ w +)\ W + > ' , ' <\g <1 > > ' , ' < BALISE > ' > > > re . sub ( ' <\ W +(\ w +)\ W + > ' , \ lambda s : ' < ' + s . group ( 1 ) + ' > ' ' < BALISE > ' INF8007 — Langages de script — Structures de contrôle et expressions régulières '< BALISE > ') ' <? php ' <? , '< BALISE > ') BALISE > ') BALISE > ') 20/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exemples d’expressions régulières Quels sont les balises du fichier index.html du site INF8007 ? > > > i m p o r t urllib > > > f = urllib . request . urlopen ( \ " http :// www . cours . polymtl . ca / inf8007 / index . html " ) > > > index = f . read ( ) . decode ( 'utf - 8 ') > > > len ( index ) 4957 > > > r = re . findall ( ' <(\ w +)\ W + ' , index ) > > > len ( r ) 122 > > > r [ : 10 ] [ ' html ' , ' HEAD ' , ' META ' , ' META ' , ' STYLE ' , ' LINK ' ,\ ' TITLE ' , ' BODY ' , ' link ' , ' table '] INF8007 — Langages de script — Structures de contrôle et expressions régulières 21/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Sensibilité au contexte > > > r = re . findall ( '\ w + ' , index ) > > > len ( r ) 812 > > > r [ 1 : 20 ] [ ' HTML ' , ' PUBLIC ' , ' W3C ' , ' DTD ' , ' HTML ' , '4 ' , ' 01 ' , ' Transitional ' , ' EN ' , ' http ' , ' www ' , ' w3 ' , ' org ' , ' TR ' , ' html4 ' , ' loose ' , ' dtd ' , ' html ' , ' lang '] > > > re . findall ( ' <(\ w +?) > ' , index ) [ ' HEAD ' , ' TITLE ' , ' tr ' , ' tr ' , ' td ' , ' br ' , ... ' td ' , ' br ' , ' h3 ' , 'p ' , 'p ' , ' script ' , ' script '] INF8007 — Langages de script — Structures de contrôle et expressions régulières 22/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Structures de contrôle et expressions régulières 1 Boucles et itérateurs 2 Expressions régulières 3 Les caractères Python 2 c. 3 INF8007 — Langages de script — Structures de contrôle et expressions régulières 23/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 String en Python 2 et 3 Python 2 comporte des chaı̂nes (strings) Unicode et des chaı̂nes 8-bits Une chaı̂ne Unicode UTF8 encode les 128 premiers caractères ASCII selon ce standard, puis le autres avec une séquence d’échappement ; son type est unicode Une chaine Unicode peut être encodée u’abcd’ Une chaı̂ne 8-bits suit le standard ISO-8859 (aussi connu sous latin-1 ) et sont type est str Python 3 n’utilise que du UTF8 pour les chaı̂nes et leur type est str Python 2 et 3 ont aussi des structures de données du type octets INF8007 — Langages de script — Structures de contrôle et expressions régulières 24/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exemples de chaı̂nes en Python 2 > > > f = open ( ' temp ' , ' rb ') > > > sraw = f . read ( ) > > > sraw ' abc \ xe9 \ n ' > > > sraw = = ' abcé \ n ' False > > > ' abcé \ n ' ' abc \ xc3 \ xa9 \ n ' > > > sraw = = u ' abcé \ n ' - c : 1 : UnicodeWarning : Unicode equal comparison failed to convert both arguments to Unicode interpreting them as being unequal False INF8007 — Langages de script — Structures de contrôle et expressions régulières 25/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exemples de chaı̂nes en Python 2 (suite) > > > sraw . decode ( ' latin1 ') u ' abc \ xe9 \ n ' > > > sraw . decode ( ' latin1 ') . encode ( ' utf8 ') ' abc \ xc3 \ xa9 \ n ' > > > sraw . decode ( ' latin1 ') . encode ( ' utf8 ') = = ' abcé \ n ' True INF8007 — Langages de script — Structures de contrôle et expressions régulières 26/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exemples de chaı̂nes en Python 2 (suite) > > > p r i n t sraw abc \ 351 > > > sraw ' abc \ xe9 \ n ' > > > p r i n t sraw . decode ( ' latin1 ') abcé > > > type ( sraw . decode ( ' latin1 ') ) < type ' unicode '> > > > type ( sraw ) < type ' str '> > > > sraw . decode ( ' latin1 ') u ' abc \ xe9 \ n ' > > > sraw . decode ( ' latin1 ') . encode ( ' utf8 ') ' abc \ xc3 \ xa9 \ n ' > > > p r i n t sraw . decode ( ' latin1 ') . encode ( ' utf8 ') abcé >>> INF8007 — Langages de script — Structures de contrôle et expressions régulières 27/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exemples de chaı̂nes en Python 3 Moins de confusion avec Python 3... > > > f = open ( ' temp ' , ' rb ') > > > sraw = f . read ( ) > > > sraw b ' abc \ xe9 \ n ' > > > sraw = = ' abcé \ n ' False > > > u ' abcé \ n ' File " < stdin > " , line 1 u ' abcé \ n ' ^ SyntaxError : invalid syntax > > > type ( sraw ) < c l a s s ' bytes '> INF8007 — Langages de script — Structures de contrôle et expressions régulières 28/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exemples de chaı̂nes en Python 3 (suite) > > > sraw . decode ( ' latin1 ') ' abcé \ n ' > > > type ( sraw . decode ( ' latin1 ') ) < c l a s s ' str '> > > > sraw . decode ( ' latin1 ') . encode ( ' utf8 ') b ' abc \ xc3 \ xa9 \ n ' > > > sraw . decode ( ' latin1 ') . encode ( ' utf8 ') = = \ ' abcé \ n '. encode ( ' utf8 ') True >>> Ou encore : > > > " abcé \ n " . decode ( ' utf8 ') . encode ( ' latin1 ') = = sraw True INF8007 — Langages de script — Structures de contrôle et expressions régulières 29/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exercice Charger la page : http://www.cours.polymtl.ca/inf8007/index.html et créer un dictionnaire de fréquence des mots, incluant les balises. Quel est la fréquence du mot “Séances” ? INF8007 — Langages de script — Structures de contrôle et expressions régulières 30/30 Itérateurs Expressions régulières Les caractères Python 2 c. 3 Exercice Charger la page : http://www.cours.polymtl.ca/inf8007/index.html et créer un dictionnaire de fréquence des mots, incluant les balises. Quel est la fréquence du mot “Séances” ? Solution : (en supposant les instructions précédentes pour initialiser r) : freq = { } f o r i i n r: v = freq . get ( i ) i f v: freq [ i ] = v + 1 else : freq [ i ] = 1 > > > freq [ ' Séances '] 2 INF8007 — Langages de script — Structures de contrôle et expressions régulières 30/30