INF8007 — Langages de script - Structures de contrôle et

publicité
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
Téléchargement