File: chap1_introduction.tex, line 185
>>> x = 3 >>> y = 6 >>> z = x * y >>> print z 18 >>>
File: chap1_introduction.tex, line 258
if PLAT_WIN command.go.*.py=python -u "$(FileNameExt)" command.go.subsystem.*.py=0 command.go.*.pyw=pythonw -u "$(FileNameExt)" command.go.subsystem.*.pyw=1
File: chap1_introduction.tex, line 266
if PLAT_WIN command.go.*.py=c:\Python26\python -u "$(FileNameExt)" command.go.subsystem.*.py=0 command.go.*.pyw=c:\Python26\pythonw -u "$(FileNameExt)" command.go.subsystem.*.pyw=1
File: chap1_introduction.tex, line 340
print "premier message"
File: chap1_introduction.tex, line 344
print 3.141592 * 5*5 print 3.141592 * 5**2
File: chap1_introduction.tex, line 349
from math import * # permet d'utiliser les extensions mathématiques de Python print pi * 5**2
File: chap1_introduction.tex, line 356
print (3.141592 * 5*5)
File: chap1_introduction.tex, line 366
print "accentué"
File: chap1_introduction.tex, line 372
File "essai.py", line 1 SyntaxError: Non-ASCII character '\xe9' in file i.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
File: chap1_introduction.tex, line 381
# coding: latin-1 print "accentué"
File: chap1_introduction.tex, line 390
# coding: cp1252 print "accentué"
File: chap1_introduction.tex, line 399
# coding: utf-8 print "accentué"
File: chap1_introduction.tex, line 411
#!/usr/local/bin/python
File: chap1_introduction.tex, line 524
import psyco psyco.full ()
File: chap1_introduction.tex, line 596
import matplotlib.pylab as pylab
File: chap1_introduction.tex, line 603
#!/usr/bin/env pythonw2.6 import matplotlib matplotlib.use("WXAgg") import matplotlib.pylab as pylab
File: chap1_introduction.tex, line 618
2004-08-07 21:08:15.153 Python[695] *** _NSAutoreleaseNoPool(): Object 0x30ead0 of class NSCFArray autoreleased with no pool in place - just leaking
File: chap2_type.tex, line 22
somme = 0 # initialisation : la somme est nulle for i in range(1,n) : # pour tous les indices de 1 à n exclu somme = somme + i # on ajoute le i ème élément à somme
File: chap2_type.tex, line 55
x = 3.5 # création d'une variable nombre réel appelée x initialisée à 3.5 # 3.5 est un réel, la variable est de type "float" sc = "chaîne" # création d'une variable chaîne de caractères appelée str # initialisée à "chaîne", sc est de type "str"
File: chap2_type.tex, line 70
x = 3 # affectation de la valeur entière 3 à la variable x y = 3.0 # affectation de la valeur réelle 3.0 à la variable y
File: chap2_type.tex, line 83
x = 5.5
File: chap2_type.tex, line 94
x = \ 5.5
File: chap2_type.tex, line 128
s = None print s # affiche None
File: chap2_type.tex, line 146
x = 3 y = 3.0 print "x =", x, type(x) print "y =", y, type(y)
File: chap2_type.tex, line 155
x = 3 <type 'int'> y = 3.0 <type 'float'>
File: chap2_type.tex, line 196
x = int (3.5) y = float (3) z = int ("3") print "x:", type(x), " y:", type(y), " z:", type(z) # affiche x: <type 'int'> y: <type 'float'> z: <type 'int'>
File: chap2_type.tex, line 207
i = int ("3.5") # provoque une erreur i = int (float ("3.5")) # fonctionne
File: chap2_type.tex, line 221
x = 11 y = 2 z = x / y # le résultat est 5 et non 5.5 car la division est entière
File: chap2_type.tex, line 229
x = float (11) y = float (2) z = x / y # le résultat est 5.5 car c'est une division entre deux réels
File: chap2_type.tex, line 255
x = 4 < 5 print x # affiche True print not x # affiche False
File: chap2_type.tex, line 287
x = True y = False
File: chap2_type.tex, line 309
t = "string = texte" print type (t), t t = 'string = texte, initialisation avec apostrophes' print type (t), t t = "morceau 1" \ "morceau 2" # second morceau ajouté au premier par l'ajout du symbole \, # il ne doit rien y avoir après le symbole \, # pas d'espace ni de commentaire print t t = """première ligne seconde ligne""" # chaîne de caractères qui s'étend sur deux lignes print t
File: chap2_type.tex, line 330
<type 'str'> string = texte <type 'str'> string = texte, initialisation avec apostrophes morceau 1morceau 2 première ligne seconde ligne
File: chap2_type.tex, line 374
s = "C:\\Users\\Dupre\\exemple.txt" s = r"C:\Users\Dupre\exemple.txt"
File: chap2_type.tex, line 395
x = 5.567 s = str (x) print type(s), s # <type 'str'> 5.567 print len(s) # affiche 5
File: chap2_type.tex, line 444
res = s.fonction (...)
File: chap2_type.tex, line 535
st = "langage python" st = st.upper () # mise en lettres majuscules i = st.find ("PYTHON") # on cherche "PYTHON" dans st print i # affiche 8 print st.count ("PYTHON") # affiche 1 print st.count ("PYTHON", 9) # affiche 0
File: chap2_type.tex, line 549
s = "un;deux;trois" mots = s.split (";") # mots est égal à ['un', 'deux', 'trois'] mots.reverse () # retourne la liste, mots devient égal à # ['trois', 'deux', 'un'] s2 = ";".join (mots) # concaténation des éléments de mots séparés par ";" print s2 # affiche trois;deux;un
File: chap2_type.tex, line 569
".... %c1 .... %c2 " % (v1,v2)
File: chap2_type.tex, line 579
x = 5.5 d = 7 s = "caractères" res = "un nombre réel %f et un entier %d, une chaîne de %s, \n" \ "un réel d'abord converti en chaîne de caractères %s" % (x,d,s, str(x+4)) print res res = "un nombre réel " + str (x) + " et un entier " + str (d) + \ ", une chaîne de " + s + \ ",\n un réel d'abord converti en chaîne de caractères " + str(x+4) print res
File: chap2_type.tex, line 595
un nombre réel 5.500000 et un entier 7, une chaîne de caractères, un réel d'abord converti en chaîne de caractères 9.5 un nombre réel 5.5 et un entier 7, une chaîne de caractères, un réel d'abord converti en chaîne de caractères 9.5
File: chap2_type.tex, line 606
"%n.df" % x
File: chap2_type.tex, line 618
x = 0.123456789 print x # affiche 0.123456789 print "%1.2f" % x # affiche 0.12 print "%06.2f" % x # affiche 000.12
File: chap2_type.tex, line 651
x = (4,5) # création d'un T-uple composé de 2 entiers x = ("un",1,"deux",2) # création d'un T-uple composé de 2 chaînes de caractères # et de 2 entiers, l'ordre d'écriture est important x = (3,) # création d'un T-uple d'un élément, sans la virgule, # le résultat est un entier
File: chap2_type.tex, line 713
a = (4,5) a [0] = 3 # déclenche une erreur d'exécution
File: chap2_type.tex, line 720
Traceback (most recent call last): File "<pyshell#78>", line 1, in -toplevel- a[0]=3 TypeError: object doesn't support item assignment
File: chap2_type.tex, line 729
a = (4,5) a = (3,) + a[1:2] # crée un T-uple d'un élément concaténé # avec la partie inchangée de a
File: chap2_type.tex, line 745
print complex (1,1) # affiche (1+1j)
File: chap2_type.tex, line 786
x = [4,5] # création d'une liste composée de deux entiers x = ["un",1,"deux",2] # création d'une liste composée de # deux chaînes de caractères # et de deux entiers, l'ordre d'écriture est important x = [3,] # création d'une liste d'un élément, sans la virgule, # le résultat reste une liste x = [ ] # crée une liste vide x = list () # crée une liste vide y = x [0] # accède au premier élément y = x [-1] # accède au dernier élément
File: chap2_type.tex, line 958
[9, 0, 3, 5, 4, 7, 8] [0, 3, 4, 5, 7, 8, 9]
File: chap2_type.tex, line 964
def compare (x,y): # crée une fonction if x > y : return -1 # qui retourne -1 si x<y, elif x == y : return 0 # 0 si x == y else : return 1 # 1 si x < y x.sort (compare) # trie la liste x à l'aide de la fonction compare # cela revient à la trier par ordre décroissant print x
File: chap2_type.tex, line 979
[9, 8, 7, 5, 4, 3, 0]
File: chap2_type.tex, line 987
x = [9,0,3,5,0] print x.index (1) # cherche la position de l'élément 1
File: chap2_type.tex, line 996
Traceback (most recent call last): File "c:/temp/temp", line 2, in -toplevel- print x.index(1) ValueError: list.index(x): x not in list
File: chap2_type.tex, line 1007
x = [9,0,3,5,0] try: print x.index(1) except ValueError: print "1 n'est pas présent dans la liste x" else: print "trouvé"
File: chap2_type.tex, line 1018
1 n'est pas présent dans la liste x
File: chap2_type.tex, line 1030
range (debut, fin [,marche])
File: chap2_type.tex, line 1043
print range (0,10,2) # affiche [0, 2, 4, 6, 8]
File: chap2_type.tex, line 1051
print xrange (0,10,2) # affiche xrange(0,10,2)
File: chap2_type.tex, line 1062
s = 0 for n in range (1,20,2) : # ce programme est équivalent à s += n # s = sum (range(1,20,2))
File: chap2_type.tex, line 1073
x = ["un", 1, "deux", 2, "trois", 3] for n in range (0, len(x)) : print "x [%d] = %s" % (n, x [n]) # le résultat est présenté à droite
File: chap2_type.tex, line 1084
x [0] = un x [1] = 1 x [2] = deux x [3] = 2 x [4] = trois x [5] = 3
File: chap2_type.tex, line 1105
x = ["un", 1, "deux", 2] for el in x : print "la liste inclut : ", el
File: chap2_type.tex, line 1115
la liste inclut : un la liste inclut : 1 la liste inclut : deux la liste inclut : 2
File: chap2_type.tex, line 1126
y = list () for i in range(0,5) : y.append (i+1) print y # affiche [1,2,3,4,5]
File: chap2_type.tex, line 1137
y = [ i+1 for i in range (0,5)] print y # affiche [1,2,3,4,5]
File: chap2_type.tex, line 1147
y = [ i for i in range(0,5) if i % 2 == 0] # sélection les éléments pairs print y # affiche [0,2,4] z = [ i+j for i in range(0,5) \ for j in range(0,5)] # construit tous les nombres i+j possibles print z # affiche [0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, # 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]
File: chap2_type.tex, line 1162
a = (1,0,7,0,0,0) b = [2,2,3,5,5,5] c = [ "un", "deux", "trois", "quatre" ] d = zip (a,b,c) print d # affiche [(1, 2, 'un'), (0, 2, 'deux'), # (7, 3, 'trois'), (0, 5, 'quatre')]
File: chap2_type.tex, line 1177
s = "" while <condition> : s += ...
File: chap2_type.tex, line 1185
s = [] while <condition> : s.append ( ... ) s = "".join (s)
File: chap2_type.tex, line 1201
l = [4,5,6] l2 = l print l # affiche [4,5,6] print l2 # affiche [4,5,6] l2 [1] = "modif" print l # affiche [4, 'modif', 6] print l2 # affiche [4, 'modif', 6]
File: chap2_type.tex, line 1213
l = [[0,1], [2,3]] l1 = l [0] l1 [0] = "modif" # ligne équivalente à : l [0][0] = "modif"
File: chap2_type.tex, line 1223
import copy l = [4,5,6] l2 = copy.copy(l) print l # affiche [4,5,6] print l2 # affiche [4,5,6] l2 [1] = "modif" print l # affiche [4,5,6] print l2 # affiche [4, 'modif', 6]
File: chap2_type.tex, line 1238
import copy l = [1,2,3] l2 = copy.copy (l) l3 = l print l == l2 # affiche True print l is l2 # affiche False print l is l3 # affiche True
File: chap2_type.tex, line 1253
import copy l = [[1,2,3],[4,5,6]] l2 = copy.copy (l) l3 = copy.deepcopy (l) l [0][0] = 1111 print l # affiche [[1111, 2, 3], [4, 5, 6]] print l2 # affiche [[1111, 2, 3], [4, 5, 6]] print l3 # affiche [[1, 2, 3], [4, 5, 6]] print l is l2 # affiche False print l [0] is l2 [0] # affiche True print l [0] is l3 [0] # affiche False
File: chap2_type.tex, line 1270
l = [1,"a"] ll = [l,3] # ll contient l l [0] = ll # l contient ll print l # affiche [[[...], 3], 'a'] print ll # affiche [[[...], 'a'], 3] import copy z = copy.deepcopy (l) print z # affiche [[[...], 3], 'a']
File: chap2_type.tex, line 1306
x = { "cle1":"valeur1", "cle2":"valeur2" } y = { } # crée un dictionnaire vide z = dict () # crée aussi un dictionnaire vide
File: chap2_type.tex, line 1316
print x ["cle1"]
File: chap2_type.tex, line 1443
d = { "un":1, "zéro":0, "deux":2, "trois":3, "quatre":4, "cinq":5, \ "six":6, "sept":1, "huit":8, "neuf":9, "dix":10 } key = d.keys () key.sort () for k in key: print k,d [k]
File: chap2_type.tex, line 1456
d = { "un":1, "zero":0, "deux":2, "trois":3, "quatre":4, "cinq":5, \ "six":6, "sept":1, "huit":8, "neuf":9, "dix":10 } dinv = { } # création d'un dictionnaire vide, on parcout for key,value in d.items () : # les éléments du dictionnaire comme si # c'était une liste de 2-uple (clé,valeur) dinv [value] = key # on retourne le dictionnaire print dinv # affiche {0: 'zero', 1: 'un', 2: 'deux', # 3: 'trois', 4: 'quatre', 5: 'cinq', 6: 'six', # 8: 'huit', 9: 'neuf', 10: 'dix'}
File: chap2_type.tex, line 1474
d = { "un":1, "zero":0, "deux":2, "trois":3, "quatre":4, "cinq":5, \ "six":6, "sept":1, "huit":8, "neuf":9, "dix":10 } print d.items () print d.iteritems ()
File: chap2_type.tex, line 1483
[('trois', 3), ('sept', 1), ('neuf', 9), ('six', 6), ('zero', 0), ('un', 1), ('dix', 10), ('deux', 2), ('huit', 8), ('quatre', 4), ('cinq', 5)] <dictionary-itemiterator object at 0x0115DC40>
File: chap2_type.tex, line 1495
File "essai.py", line 6, in <module> for k in d : RuntimeError: dictionary changed size during iteration
File: chap2_type.tex, line 1508
d = {4:4,5:5,6:6} d2 = d print d # affiche {4: 4, 5: 5, 6: 6} print d2 # affiche {4: 4, 5: 5, 6: 6} d2 [5] = "modif" print d # affiche {4: 4, 5: 'modif', 6: 6} print d2 # affiche {4: 4, 5: 'modif', 6: 6}
File: chap2_type.tex, line 1523
d = {4:4,5:5,6:6} import copy d2 = copy.copy(l) print d # affiche {4: 4, 5: 5, 6: 6} print d2 # affiche {4: 4, 5: 5, 6: 6} d2 [5] = "modif" print d # affiche {4: 4, 5: 5, 6: 6} print d2 # affiche {4: 4, 5: 'modif', 6: 6}
File: chap2_type.tex, line 1544
k = { 1:1} d = { } d [k] = 0
File: chap2_type.tex, line 1554
Traceback (most recent call last): File "cledict.py", line 3, in <module> d [k] = 0 TypeError: dict objects are unhashable
File: chap2_type.tex, line 1567
k = { 1:1} d = { } d [id (k)] = 0
File: chap2_type.tex, line 1575
k = {1:1} d = { } d [id (k)] = 0 b = k print d [id(b)] # affiche bien zéro c = {1:1} print d [id(c)] # provoque une erreur car même si k et c ont des contenus égaux, # ils sont distincts, la clé id(c) n'existe pas dans d
File: chap2_type.tex, line 1590
class A : pass k = A () d = { } d [k] = 0 print d # affiche {<__main__.A object at 0x0120DB90>: 0} print id (k), hex(id(k)) # affiche 18930576, 0x120db90 print d [id(k)] # provoque une erreur
File: chap2_type.tex, line 1605
class A (dict): def __hash__(self): return id(self) k = A () k ["t"]= 4 d = { } d [k] = 0 print d # affiche {{'t': 4}: 0}
File: chap2_type.tex, line 1635
x == eval (repr(x)) # est toujours vrai (True) x == eval (str (x)) # n'est pas toujours vrai
File: chap2_type.tex, line 1648
x = 32 y = 9 op = "+ - * / % // & | and or << >>".split () for o in op : s = str (x) + " " + o + " " + str (y) print s, " = ", eval (s)
File: chap2_type.tex, line 1661
32 + 9 = 41 32 - 9 = 23 32 * 9 = 288 32 / 9 = 3 32 % 9 = 5 32 // 9 = 3 32 & 9 = 0 32 | 9 = 41 32 and 9 = 9 32 or 9 = 32 32 << 9 = 16384 32 >> 9 = 0
File: chap2_type.tex, line 1687
x = 3 print dir ()
File: chap2_type.tex, line 1694
['__builtins__', '__doc__', '__file__', '__name__', 'x']
File: chap2_type.tex, line 1733
x = 3 print x, type(x) # affiche 3 <type 'int'> x = 3.5 print x, type(x) # affiche 3.5 <type 'float'>
File: chap2_type.tex, line 1754
x = 5 # affecte 5 à x y = 6 # affecte 6 à y x,y = 5,6 # affecte en une seule instruction 5 à x et 6 à y
File: chap2_type.tex, line 1767
x,y = divmod (17,5) print x,y # affiche 3 2 print "17 / 5 = 5 * ", x, " + ",y # affiche 17 / 5 = 5 * 3 + 2
File: chap2_type.tex, line 1778
x,y = point = 5,5
File: chap2_type.tex, line 1789
i = int(2**28) for k in range (0,4) : i *= int(2) print type(i),i
File: chap2_type.tex, line 1798
<type 'int'> 536870912 <type 'int'> 1073741824 <type 'long'> 2147483648 <type 'long'> 4294967296
File: chap2_type.tex, line 1815
print set ( (1,2,3) ) & set ( (2,3,5) ) # construit l'intersection qui est set([2, 3])
File: chap3_syntaxe.tex, line 44
initialisation de la variable moy à 0 faire pour i allant de 1 à N moy reçoit moy + ni moy reçoit moy / N
File: chap3_syntaxe.tex, line 53
ligne 1 : initialisation de la variable moy à 0 ligne 2 : initialisation de la variable i à 1 ligne 3 : moy reçoit moy + ni ligne 4 : i reçoit i + 1 ligne 5 : si i est inférieur ou égal à N alors aller à la ligne 3 ligne 6 : moy reçoit moy / N
File: chap3_syntaxe.tex, line 75
import keyword print keyword.iskeyword("for") # affiche True print keyword.iskeyword("until") # affiche False
File: chap3_syntaxe.tex, line 144
if condition1 : instruction1 instruction2 ... else : instruction3 instruction4 ...
File: chap3_syntaxe.tex, line 158
if condition1 : instruction1 instruction2 ...
File: chap3_syntaxe.tex, line 168
if condition1 : instruction1 instruction2 ... elif condition2 : instruction3 instruction4 ... elif condition3 : instruction5 instruction6 ... else : instruction7 instruction8 ...
File: chap3_syntaxe.tex, line 207
le nombre est positif le nombre est négatif signe = 1
File: chap3_syntaxe.tex, line 232
File "test.py", line 7 print "le nombre est négatif" ^ IndentationError: unindent does not match any outer indentation level
File: chap3_syntaxe.tex, line 293
if condition : instruction1 else : instruction2
File: chap3_syntaxe.tex, line 306
if condition : instruction1 else : instruction2
File: chap3_syntaxe.tex, line 333
x = -5 if x < 0 : signe = -1 elif x == 0 : signe = 0 else : signe = 1
File: chap3_syntaxe.tex, line 349
x = -5 if x < 0 : signe = -1 elif x == 0 : signe = 0 else : signe = 1
File: chap3_syntaxe.tex, line 366
s = raw_input ("dites oui : ") # voir remarque suivante if s == "oui" or s [0:1] == "o" or s [0:1] == "O" or s == "1" : print "oui" else : print "non"
version graphique de la fonction \codesindex{raw\_input
import Tkinter def question (legende) : reponse = [""] root = Tkinter.Tk () root.title ("pseudo raw_input") Tkinter.Label (text = legende).pack (side = Tkinter.LEFT) s = Tkinter.Entry (text= "def", width=80) s.pack (side = Tkinter.LEFT) def rget () : reponse [0] = s.get () root.destroy () Tkinter.Button (text = "ok", command = rget).pack (side = Tkinter.LEFT) root.mainloop () return reponse [0] print "reponse ", question ("texte de la question")
File: chap3_syntaxe.tex, line 425
signe = 0 x = 0 if x < 0 : signe = -1 elif x == 0: pass # signe est déjà égal à 0 else : signe = 1
File: chap3_syntaxe.tex, line 437
File "nopass.py", line 6 else : ^ IndentationError: expected an indented block
File: chap3_syntaxe.tex, line 471
while cond : instruction 1 ... instruction n
File: chap3_syntaxe.tex, line 488
n = 0 while n < 3: print "à l'intérieur ", n n += 1 print "à l'extérieur ", n
File: chap3_syntaxe.tex, line 502
à l'intérieur 0 à l'intérieur 1 à l'intérieur 2 à l'extérieur 3
File: chap3_syntaxe.tex, line 519
n = 0 while n < 3 : print n n + 1 # n n'est jamais modifié, l'instruction correcte serait n += 1
File: chap3_syntaxe.tex, line 541
for x in set : instruction 1 ... instruction n
File: chap3_syntaxe.tex, line 556
t = (1,2,3,4) for x in t: # affiche les nombres 1,2,3,4 print x # chacun sur une ligne différente
File: chap3_syntaxe.tex, line 565
d = { 1:2, 3:4, 5:6, 7:-1, 8:-2 } print d # affiche le dictionnaire {8: -2, 1: 2, 3: 4, 5: 6, 7: -1} k = d.keys () print k # affiche les clés [8, 1, 3, 5, 7] k.sort () print k # affiche les clés triées [1, 3, 5, 7, 8] for x in k: # affiche les éléments du dictionnaire print x,":",d [x] # triés par clés croissantes
File: chap3_syntaxe.tex, line 578
d = { 1:2, 3:4, 5:6, 7:-1, 8:-2 } for x in sorted(d): # pour les clés dans l'ordre croissant print x,":",d [x]
File: chap3_syntaxe.tex, line 589
sum = 0 N = 10 for n in range(0,N): # ou for n in xrange(0,N): (plus rapide) sum += n # additionne tous les entiers compris entre 0 et N-1
File: chap3_syntaxe.tex, line 598
l = [ 4, 5, 3, -6, 7, 9] sum = 0 for n in range(0,len (l)): # ou for n in xrange(0,len (l)) : (plus rapide) sum += l [n] # additionne tous les éléments de l
File: chap3_syntaxe.tex, line 613
[ expression for x in ensemble ]
File: chap3_syntaxe.tex, line 623
y = list () for i in range(0,5) : y.append (i+1) print y # affiche [1,2,3,4,5]
File: chap3_syntaxe.tex, line 632
y = [ i+1 for i in range(0,5)] # résume trois lignes du programme précédent print y # affiche [1,2,3,4,5]
File: chap3_syntaxe.tex, line 647
d = ["un", "deux", "trois"] for x in d: print x # affichage de tous les éléments de d
File: chap3_syntaxe.tex, line 660
d = ["un", "deux", "trois"] it = iter (d) # obtient un itérateur sur d while True: try: x = it.next () # obtient l'élément suivant, s'il n'existe pas except StopIteration: break # déclenche une exception print x # affichage de tous les éléments de d
File: chap3_syntaxe.tex, line 674
d = [ (1,0,0), (0,1,0), (0,0,1) ] for v in d: print v
File: chap3_syntaxe.tex, line 683
d = [ (1,0,0), (0,1,0), (0,0,1) ] for x,y,z in d: print x,y,z
File: chap3_syntaxe.tex, line 691
d = [ (1,0,0), (0,1,0,6), (0,0,1) ] # un élément de taille quatre for x,y,z in d: print x,y,z
File: chap3_syntaxe.tex, line 699
Traceback (most recent call last): File "c:\temp\delete.py", line 2, in -toplevel- for x,y,z in d: print x,y,z ValueError: unpack tuple of wrong size
File: chap3_syntaxe.tex, line 713
a = range(0,5) b = [x**2 for x in a] for x,y in zip (a,b): print y, " est le carré de ", x # affichage à droite
File: chap3_syntaxe.tex, line 723
0 est le carré de 0 1 est le carré de 1 4 est le carré de 2 9 est le carré de 3 16 est le carré de 4
File: chap3_syntaxe.tex, line 743
d = ["un", "deux", "trois"] for x in d: print x # une seule instruction
File: chap3_syntaxe.tex, line 750
d = ["un", "deux", "trois"] i = 0 while d [i] != "trois" : i += 1 print "trois a pour position ", i
File: chap3_syntaxe.tex, line 769
d = dict () for i in range(1,100): # d [i] est vrai si i est un nombre premier d [i] = True # au début, comme on ne sait pas, on suppose # que tous les nombres sont premiers for i in range(2,100): # si d [i] est faux, if not d [i]: continue # les multiples de i ont déjà été cochés # et peut passer à l'entier suivant for j in range (2,100): if i*j < 100: d [i*j] = False # d [i*j] est faux pour tous les multiples de i # inférieurs à 100 print "liste des nombres premiers" for i in d: if d [i]: print i
File: chap3_syntaxe.tex, line 789
d = dict () for i in range(1,100): d [i] = True for i in range(2,100): if d [i]: for j in range (2,100): if i*j < 100 : d [i*j] = False print "liste des nombres premiers" for i in d: if d [i]: print i
File: chap3_syntaxe.tex, line 813
l = [6,7,5,4,3] n = 0 c = 5 for x in l: if x == c: break # l'élément a été trouvé, on sort de la boucle n += 1 # si l'élément a été trouvé, cette instruction # n'est pas exécutée print "l'élément ",c, " est en position ", print n # affiche l'élément 5 est en position 2
File: chap3_syntaxe.tex, line 829
set = range (1,21) n = 53 for x in set: for y in set: c = x*x + y*y if c == n: break if c == n: break # cette seconde instruction break est nécessaire # pour sortir de la seconde boucle # lorsque la solution a été trouvée if c == n: # le symbole \ permet de passer à la ligne sans changer d'instruction print n, " est la somme des carrés de deux entiers :", \ x, "*", x, "+", y, "*", y, "=", n else: print n, " n'est pas la somme des carrés de deux entiers"
File: chap3_syntaxe.tex, line 849
53 est la somme des carrés de deux entiers : 2 * 2 + 7 * 7 = 53
File: chap3_syntaxe.tex, line 863
L = [6,7,5,4,3] n = 0 c = 1 for x in L : if x == c : print "l'élément ", c, " est en position ", n break n += 1 else: print "aucun élément ", c, " trouvé" # affiche aucun élément 1 trouvé
File: chap3_syntaxe.tex, line 886
li = range (0,10) print li # affiche [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] for i in range (0, len (li)): if i == 5 : del li [i:i+2] print li [i] # affiche successivement 0, 1, 2, 3, 4, 7, 8, 9 et # produit une erreur print li
File: chap3_syntaxe.tex, line 901
li = range (0,10) print li # affiche [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] i = 0 for t in li : if i == 5 : del li [i:i+2] i = i+1 print t # affiche successivement 0, 1, 2, 3, 4, 5, 8, 9 print li # affiche [0, 1, 2, 3, 4, 7, 8, 9]
File: chap3_syntaxe.tex, line 916
li = range (0,10) print li # affiche [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] for i in li : if i == 5 : del i print li # affiche [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
File: chap3_syntaxe.tex, line 956
def fonction_nom (par_1, ..., par_n) : instruction_1 ... instruction_n return res_1, ..., res_n
File: chap3_syntaxe.tex, line 971
x_1, ..., x_n = fonction_nom (valeur_1, valeur_2, ..., valeur_n)
File: chap3_syntaxe.tex, line 978
fonction_nom (valeur_1, valeur_2, ..., valeur_n)
File: chap3_syntaxe.tex, line 992
import math def coordonnees_polaires (x,y): rho = math.sqrt(x*x+y*y) # calcul la racine carrée de x*x+y*y theta = math.atan2 (y,x) # calcule l'arc tangente de y/x en tenant # compte des signes de x et y return rho, theta def affichage (x,y): r,t = coordonnees_polaires(x,y) print "cartésien (%f,%f) --> polaire (%f,%f degrés)" \ % (x,y,r,math.degrees(t)) affichage (1,1) affichage (0.5,1) affichage (-0.5,1) affichage (-0.5,-1) affichage (0.5,-1)
File: chap3_syntaxe.tex, line 1016
cartésien (1.000000,1.000000) --> polaire (1.414214,45.000000 degrés) cartésien (0.500000,1.000000) --> polaire (1.118034,63.434949 degrés) cartésien (-0.500000,1.000000) --> polaire (1.118034,116.565051 degrés) cartésien (-0.500000,-1.000000) --> polaire (1.118034,-116.565051 degrés) cartésien (0.500000,-1.000000) --> polaire (1.118034,-63.434949 degrés)
File: chap3_syntaxe.tex, line 1033
def fonction_nom (param_1, param_2 = valeur_2, ..., param_n = valeur_n): ...
File: chap3_syntaxe.tex, line 1046
def commander_carte_orange (nom, prenom, paiement = "carte", nombre = 1, zone = 2): print "nom : ", nom print "prénom : ", prenom print "paiement : ", paiement print "nombre : ", nombre print "zone :", zone commander_carte_orange ("Dupré", "Xavier", "chèque") # les autres paramètres nombre et zone auront pour valeur # leurs valeurs par défaut
File: chap3_syntaxe.tex, line 1063
def commander_carte_orange (nom, prenom, paiement = "carte", nombre = 1, zone): print "nom : ", nom # ...
File: chap3_syntaxe.tex, line 1069
File "problem_zone.py", line 1 def commander_carte_orange (nom, prenom, paiement = "carte", nombre = 1, zone): SyntaxError: non-default argument follows default argument
File: chap3_syntaxe.tex, line 1082
def fonction (l = [0,0]) : l [0] += 1 return l print fonction () # affiche [1,0] : résultat attendu print fonction () # affiche [2,0] : résultat surprenant print fonction ( [0,0]) # affiche [1,0] : résultat attendu
File: chap3_syntaxe.tex, line 1096
import copy def fonction (l = [0,0]) : l = copy.copy (l) l [0] += 1 return l
File: chap3_syntaxe.tex, line 1114
x_1, ..., x_n = fonction_nom (param_1 = valeur_1, ..., param_n = valeur_n)
File: chap3_syntaxe.tex, line 1125
def identite (nom, prenom): print "nom : ", nom, " prénom : ", prenom identite("Xavier", "Dupré") # nom : Xavier prénom : Dupré identite(prenom = "Xavier", nom = "Dupré") # nom : Dupré prénom : Xavier
File: chap3_syntaxe.tex, line 1137
def commander_carte_orange (paiement = "carte", nombre = 1, zone = 2): print "paiement : ", paiement print "nombre : ", nombre print "zone :", zone commander_carte_orange (zone = 5) # seule la valeur par défaut # du paramètre zone sera changée
File: chap3_syntaxe.tex, line 1157
def fonction (a,b): return a + b def fonction (a,b,c): return a + b + c print fonction (5,6) print fonction (5,6,7)
File: chap3_syntaxe.tex, line 1172
Traceback (most recent call last): File "cours4.py", line 7, in ? print fonction (5,6) TypeError: fonction() takes exactly 3 arguments (2 given)
File: chap3_syntaxe.tex, line 1191
>>> help (round)
File: chap3_syntaxe.tex, line 1197
Help on built-in function round: round(...) round(number[, ndigits]) -> floating point number Round a number to a given precision in decimal digits (default 0 digits). This always returns a floating point number. Precision may be negative.
File: chap3_syntaxe.tex, line 1211
>>> help (coordonnees_polaires)
File: chap3_syntaxe.tex, line 1216
Help on function coordonnees_polaires in module __main__: coordonnees_polaires(x, y)
File: chap3_syntaxe.tex, line 1226
import math def coordonnees_polaires (x,y): """convertit des coordonnées cartésiennes en coordonnées polaires (x,y) --> (pho,theta)""" rho = math.sqrt(x*x+y*y) theta = math.atan2 (y,x) return rho, theta help (coordonnees_polaires)
File: chap3_syntaxe.tex, line 1241
Help on function coordonnees_polaires in module __main__: coordonnees_polaires(x, y) convertit des coordonnées cartésiennes en coordonnées polaires (x,y) --> (pho,theta)
File: chap3_syntaxe.tex, line 1268
def somme_n_premier_terme(n,liste): """calcul la somme des n premiers termes d'une liste""" somme = 0 for i in liste: somme += i n -= 1 # modification de n (type immuable) if n <= 0: break liste[0] = 0 # modification de liste (type modifiable) return somme l = [1,2,3,4] nb = 3 print "avant la fonction ",nb,l # affiche avant la fonction 3 [1, 2, 3, 4] s = somme_n_premier_terme (nb,l) print "après la fonction ",nb,l # affiche après la fonction 3 [0, 2, 3, 4] print "somme : ", s # affiche somme : 6
File: chap3_syntaxe.tex, line 1295
def fonction (liste): liste = [] liste = [0,1,2] print liste # affiche [0,1,2] fonction (liste) print liste # affiche [0,1,2]
File: chap3_syntaxe.tex, line 1312
def fonction (liste): del liste liste = [0,1,2] print liste # affiche [0,1,2] fonction (liste) print liste # affiche [0,1,2]
File: chap3_syntaxe.tex, line 1326
def fonction (liste): del liste[0:len(liste)] # on peut aussi écrire : liste[:] = [] liste = [0,1,2] print liste # affiche [0,1,2] fonction (liste) print liste # affiche []
File: chap3_syntaxe.tex, line 1350
def factorielle(n): if n == 0 : return 1 else : return n * factorielle(n-1)
File: chap3_syntaxe.tex, line 1360
Traceback (most recent call last): File "fact.py", line 5, in <module> factorielle(999) File "fact.py", line 3, in factorielle else : return n * factorielle(n-1) File "fact.py", line 3, in factorielle else : return n * factorielle(n-1) ...
File: chap3_syntaxe.tex, line 1375
def factorielle_non_recursive (n) : r = 1 for i in range (2, n+1) : r *= i return r
File: chap3_syntaxe.tex, line 1393
print x # déclenche une erreur
File: chap3_syntaxe.tex, line 1398
Traceback (most recent call last): File "pas_declaree.py", line 1, in <module> print x NameError: name 'x' is not defined
File: chap3_syntaxe.tex, line 1409
def portee_variable(x): var = x print var portee_variable(3) print var # déclenche une erreur car var est déclarée dans # la fonction portee_variable
File: chap3_syntaxe.tex, line 1444
n = 1 # déclaration d'une variable globale def locale_globale(): n = 2 # déclaration d'une variable locale print n # affiche le contenu de la variable locale print n # affiche 1 locale_globale() # affiche 2 print n # affiche 1
File: chap3_syntaxe.tex, line 1460
n = 1 # déclaration d'une variable globale def locale_globale(): global n # cette ligne indique que n désigne la variable globale n = 2 # change le contenu de la variable globale print n # affiche le contenu de la variable globale print n # affiche 1 locale_globale() # affiche 2 print n # affiche 2
File: chap3_syntaxe.tex, line 1488
print type(factorielle) # affiche <type 'function'>
File: chap3_syntaxe.tex, line 1496
def affiche_pair(): def fonction_locale(i): # fonction locale ou imbriquée if i % 2 == 0 : return True else : return False for i in range(0,10): if fonction_locale(i): print i affiche_pair() fonction_locale(5) # l'appel à cette fonction locale # déclenche une erreur d'exécution
File: chap3_syntaxe.tex, line 1525
def fonction (param_1, ..., param_n, *liste, **dictionnaire) :
File: chap3_syntaxe.tex, line 1536
fonction (valeur_1, ..., valeur_n, \ liste_valeur_1, ..., liste_valeur_p, \ nom_1 = v_1, ..., nom_q = v_q)
File: chap3_syntaxe.tex, line 1550
def fonction(p,*l,**d): print "p = ",p print "liste (tuple) l :", l print "dictionnaire d :", d fonction (1,2,3,a=5,b=6) # 1 est associé au paramètre p # 2 et 3 sont insérés dans la liste l # a=5 et b=6 sont insérés dans le dictionnaire d
File: chap3_syntaxe.tex, line 1566
p = 1 liste l : (2, 3) dictionnaire d : {'a': 5, 'b': 6}
File: chap3_syntaxe.tex, line 1578
def fonction(p,*l,**d): print "p = ",p print "liste l :", l print "dictionnaire d :", d def fonction2 (p, *l, **d) : l += (4,) # on ajoute une valeur au tuple d ["c"] = 5 # on ajoute un couple (paramètre,valeur) fonction (p, *l, **d) # ne pas oublier le symbole * fonction2 (1,2,3,a=5,b=6)
File: chap3_syntaxe.tex, line 1596
p = 1 liste l : (2, 3, 4) dictionnaire d : {'a': 5, 'c': 5, 'b': 6}
File: chap3_syntaxe.tex, line 1610
nom_fonction = lambda param_1, ..., param_n : expression
File: chap3_syntaxe.tex, line 1621
min = lambda x,y : (abs (x+y) - abs (x-y))/2 print min (1,2) # affiche 1 print min (5,4) # affiche 4
File: chap3_syntaxe.tex, line 1632
def min(x,y): return (abs (x+y) - abs (x-y))/2 print min (1,2) # affiche 1 print min (5,4) # affiche 4
File: chap3_syntaxe.tex, line 1644
fs = [] for a in range (0,10) : f = lambda x : x + a fs.append (f) for f in fs : print (f(1)) # le programme affiche 10 fois 10 de suite # car la variable a vaut dix à la fin de la boucle
File: chap3_syntaxe.tex, line 1657
fs = [] for a in range (0,10) : f = lambda x,y=a : x + y # ligne changée fs.append (f) for f in fs : print (f(1))
File: chap3_syntaxe.tex, line 1677
def fonction_yield(n): i = 0 while i < n-1: print "yield 1" # affichage : pour voir ce que fait le programme yield i # arrête la fonction qui reprendra i = i+1 # à la ligne suivante lors du prochain appel print "yield 2" # affichage : pour voir ce que fait le programme yield i # arrête la fonction qui ne reprendra pas # lors du prochain appel car le code de la fonction # prend fin ici for a in fonction_yield(2): print a # affiche tous les éléments que retourne la # fonction fonction_yield, elle simule la liste # [0,1] print "-----------------------------------------------" for a in fonction_yield(3): print a # nouvel appel, l'exécution reprend # au début de la fonction, # affiche tous les éléments que retourne la # fonction fonction_yield, elle simule la liste # [0,1,2]
File: chap3_syntaxe.tex, line 1706
yield 1 0 yield 2 1 ----------------------------------------------- yield 1 0 yield 1 1 yield 2 2
File: chap3_syntaxe.tex, line 1733
x = 5 def y () : return None print callable (x) # affiche False car x est une variable print callable (y) # affiche True car y est une fonction
File: chap3_syntaxe.tex, line 1754
x = 3 y = 4 print eval ("x*x+y*y+2*x*y") # affiche 49 print (x+y)**2 # affiche 49
File: chap3_syntaxe.tex, line 1763
x = 3 y = 4 print eval ("x*x+y*y+2*x*y+z")
File: chap3_syntaxe.tex, line 1771
Traceback (most recent call last): File "c:\temp\cours.py", line 3, in -toplevel- print eval ("x*x+y*y+2*x*y+z") File "<string>", line 0, in -toplevel- NameError: name 'z' is not defined
File: chap3_syntaxe.tex, line 1790
import math str = """def coordonnees_polaires (x,y): rho = math.sqrt(x*x+y*y) theta = math.atan2 (y,x) return rho, theta""" # fonction définie par une chaîne de caractères obj = compile(str,"","exec") # fonction compilée exec obj # fonction incorporée au programme print coordonnees_polaires(1,1)# affiche (1.4142135623730951, 0.78539816339744828)
File: chap3_syntaxe.tex, line 1806
import math str = """math.sqrt(x*x+y*y)""" # expression définie par une chaîne de caractères obj = compile(str,"","eval") # expression compilée x = 1 y = 2 print eval (obj) # résultat de l'expression
File: chap3_syntaxe.tex, line 1826
sys:1: DeprecationWarning: Non-ASCII character '\xe9' SyntaxError: Non-ASCII character '\xe9' in file i.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
File: chap3_syntaxe.tex, line 1837
# coding: cp1252
File: chap3_syntaxe.tex, line 1841
# coding: latin-1
File: chap3_syntaxe.tex, line 1872
l = [0,3,4,4,5,6] print [ est_pair (i) for i in l ] # affiche [0, 1, 0, 0, 1, 0] print map (est_pair, l) # affiche [0, 1, 0, 0, 1, 0]
File: chap3_syntaxe.tex, line 1880
def addition (x,y) : return x + y l = [0,3,4,4,5,6] m = [1,3,4,5,6,8] print [ addition (l [i], m [i]) for i in range (0, len (l)) ] print map (addition, l, m) # affiche [1, 6, 8, 9, 11, 14]
File: chap3_syntaxe.tex, line 1890
print map (None, l,m) # affiche [(0, 1), (3, 3), (4, 4), (4, 5), (5, 6), (6, 8)] print zip (l,m) # affiche [(0, 1), (3, 3), (4, 4), (4, 5), (5, 6), (6, 8)]
File: chap3_syntaxe.tex, line 1903
l = [ 4, 5, 3, -6, 7, 9] l.sort () for n in l : print n
File: chap3_syntaxe.tex, line 1912
l = [ 4, 5, 3, -6, 7, 9] for n in sorted (l) : print n
File: chap3_syntaxe.tex, line 1927
l = [ 4, 5, 3, -6, 7, 9] for i in xrange (0, len (l)) : print i, l [i]
File: chap3_syntaxe.tex, line 1935
l = [ 4, 5, 3, -6, 7, 9] for i,v in enumerate (l) : print i, v
File: chap3_syntaxe.tex, line 1997
def recherche (li, c) : for i,v in enumerate (li) : if v == c : return i return -1 li = [ 45, 32, 43, 56 ] print recherche (li, 43) # affiche 2
File: chap3_syntaxe.tex, line 2008
print li.index (43)
File: chap3_syntaxe.tex, line 2014
def recherche (li, c,d) : for i,v in enumerate (li) : if v in [c,d] : return i return -1 li = [ 45, 32, 43, 56 ] print recherche (li, 43, 32) # affiche 1
File: chap3_syntaxe.tex, line 2030
li = [ 0, 434, 43, 6436, 5 ] m = li [0] # initialisation for l in li : # boucle if m < l : m = l # m est le maximum
File: chap3_syntaxe.tex, line 2044
li = [ 0, 434, 43, 6436, 5 ] m = 0 for i in xrange (0, len (li)) : if li [m] < li [i] : m = i
File: chap3_syntaxe.tex, line 2057
k = [ (v,i) for i,v in enumerate (li) ] m = max (k) [1]
File: chap3_syntaxe.tex, line 2065
li = [ (0,0), (434,0), (43,1), (6436,1), (5,0) ] m = -1 # -1 car le premier élément peut ne pas faire partie du sous-ensemble for i in range (0, len (li)) : if li [i][1] == 0 and (m == -1 or li [m][0] < li [i][0]) : m = i
recherche dichotomique
def recherche_dichotomique (li, c) : a,b = 0, len (li)-1 while a <= b : m = (a+b)//2 if c == li [m] : return m elif c < li [m] : b = m-1 # partie supérieure éliminée else : a = m+1 # partie inférieure éliminée return -1 # élément non trouvé li = range (0,100,2) print (recherche_dichotomique (li, 48)) # affiche 24 print (recherche_dichotomique (li, 49)) # affiche -1
File: chap3_syntaxe.tex, line 2089
s = "case11;case12;case13|case21;case22;case23" # décomposition en matrice ligne = s.split ("|") # lignes mat = [ l.split (";") for l in ligne ] # colonnes
File: chap3_syntaxe.tex, line 2096
ligne = [ ";".join (l) for l in mat ] # colonnes s = "|".join (ligne) # lignes
File: chap3_syntaxe.tex, line 2106
li = [ 0, 434, 43, 6456 ] s = 0 # initialisation for l in li : # boucle s += l # addition
File: chap3_syntaxe.tex, line 2115
def fonction (x) : return x*x s = 0 for l in li : s += fonction (l)
File: chap3_syntaxe.tex, line 2128
s = sum ( [fonction (l) for l in li] ) s = sum ( map (fonction, li) )
File: chap3_syntaxe.tex, line 2146
for i in xrange (0, len (li)) : # recherche du minimum entre i et len (li) exclu pos = i for j in xrange (i+1, len (li)) : if li [j] < li [pos] : pos = j # échange ech = li [pos] li [pos] = li [i] li [i] = ech
tri avec positions initiales
tab = ["zéro", "un", "deux"] # tableau à trier pos = [ (tab [i],i) for i in range (0, len (tab)) ] # tableau de couples pos.sort () # tri print pos # affiche [('deux', 2), ('un', 1), ('zéro', 0)]
File: chap3_syntaxe.tex, line 2173
ordre = range (0, len (pos)) for i in xrange (0, len (pos)) : ordre [pos [i][1]] = i
File: chap3_syntaxe.tex, line 2185
li = ["un", "deux", "un", "trois"] d = { } for l in li : if l not in d : d [l] = 1 else : d [l] += 1 print d # affiche {'un': 2, 'trois': 1, 'deux': 1}
File: chap3_syntaxe.tex, line 2198
mat = [ [1,1,1], [2,2,2], [1,1,1]] d = { } for l in mat : k = str (l) # k = tuple (l) lorsque cela est possible if k not in d : d [k] = 1 else : d [k] += 1 print d # affiche {'[1, 1, 1]': 2, '[2, 2, 2]': 1}
File: chap3_syntaxe.tex, line 2212
li = ["un", "deux", "un", "trois"] d = { } for i,v in enumerate (li) : if v not in d : d [v] = [ i ] else : d [v].append (i) print d # affiche {'un': [0, 2], 'trois': [3], 'deux': [1]}
File: chap3_syntaxe.tex, line 2228
mat = [[0,1,2],[3,4,5]] lin = [ i * len (mat [i]) + j \ for i in range (0, len (mat)) \ for j in range (0, len (mat [i])) ]
File: chap3_syntaxe.tex, line 2237
nc = len (mat [0]) mat = [ [ lin [i * nc + j] for j in range (0, len (mat [i])) ] \ for i in range (0, len (mat)) ]
File: chap3_syntaxe.tex, line 2250
def fonction_carre(x) : return x*x def fonction_cube (x) : return x*x*x def calcul_n_valeur (l,f): res = [ f(i) for i in l ] return res l = [0,1,2,3] print l # affiche [0, 1, 2, 3] l1 = calcul_n_valeur (l, fonction_carre) print l1 # affiche [0, 1, 4, 9] l2 = calcul_n_valeur (l, fonction_cube) print l2 # affiche [0, 1, 8, 27]
File: chap4_classe.tex, line 38
class nom_classe : # corps de la classe # ...
File: chap4_classe.tex, line 58
cl = nom_classe ()
File: chap4_classe.tex, line 79
class classe_vide: pass
File: chap4_classe.tex, line 88
class classe_vide: pass cl = classe_vide ()
File: chap4_classe.tex, line 99
print type (cl) # affiche <type 'instance'>
File: chap4_classe.tex, line 107
isinstance (cl,classe_vide) # affiche True
File: chap4_classe.tex, line 126
class nom_classe : def nom_methode (self, param_1, ..., param_n) : # corps de la méthode...
File: chap4_classe.tex, line 140
cl = nom_classe () # variable de type nom_classe t = cl.nom_methode (valeur_1, ..., valeur_n)
File: chap4_classe.tex, line 152
rnd = 42 class exemple_classe: def methode1(self,n): """simule la génération d'un nombre aléatoire compris entre 0 et n-1 inclus""" global rnd rnd = 397204094 * rnd % 2147483647 return int (rnd % n) nb = exemple_classe () l = [ nb.methode1(100) for i in range(0,10) ] print l # affiche [19, 46, 26, 88, 44, 56, 56, 26, 0, 8] nb2 = exemple_classe () l2 = [ nb2.methode1(100) for i in range(0,10) ] print l2 # affiche [46, 42, 89, 66, 48, 12, 61, 84, 71, 41]
File: chap4_classe.tex, line 195
class nom_classe : def nom_methode (self, param_1, ..., param_n) : self.nom_attribut = valeur
File: chap4_classe.tex, line 209
class exemple_classe: def methode1(self,n): """simule la génération d'un nombre aléatoire compris entre 0 et n-1 inclus""" self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () l = [ nb.methode1(100) for i in range(0,10) ] print l
File: chap4_classe.tex, line 226
Traceback (most recent call last): File "cours.py", line 8, in -toplevel- l = [ nb.methode1(100) for i in range(0,10) ] File "cours.py", line 4, in methode1 self.rnd = 397204094 * self.rnd % 2147483647 AttributeError: exemple_classe instance has no attribute 'rnd'
File: chap4_classe.tex, line 240
class exemple_classe: def methode1(self,n): """simule la génération d'un nombre aléatoire compris entre 0 et n-1 inclus""" self.rnd = 42 # déclaration à l'intérieur de la méthode, # doit être précédé du mot-clé self self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () l = [ nb.methode1(100) for i in range(0,10) ] print l # affiche [19, 19, 19, 19, 19, 19, 19, 19, 19, 19]
File: chap4_classe.tex, line 259
class exemple_classe: def methode1(self,n): """simule la génération d'un nombre aléatoire compris entre 0 et n-1 inclus""" self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () nb.rnd = 42 # déclaration à l'extérieur de la classe, # indispensable pour utiliser la méthode methode1 l = [ nb.methode1(100) for i in range(0,10) ] print l # affiche [19, 46, 26, 88, 44, 56, 56, 26, 0, 8]
File: chap4_classe.tex, line 283
class nom_classe : def __init__(self, param_1, ..., param_n): # code du constructeur
File: chap4_classe.tex, line 296
x = nom_classe (valeur_1,...,valeur_n)
File: chap4_classe.tex, line 307
class classe1: def __init__(self): # pas de paramètre supplémentaire print "constructeur de la classe classe1" self.n = 1 # ajout de l'attribut n x = classe1 () # affiche constructeur de la classe classe1 print x.n # affiche 1 class classe2: def __init__(self,a,b): # deux paramètres supplémentaires print "constructeur de la classe classe2" self.n = (a+b)/2 # ajout de l'attribut n x = classe2 (5,9) # affiche constructeur de la classe classe2 print x.n # affiche 7
File: chap4_classe.tex, line 335
class exemple_classe: def __init__ (self) : # constructeur self.rnd = 42 # on crée l'attribut rnd, identique pour chaque instance # --> les suites générées auront toutes le même début def methode1(self,n): self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () l = [ nb.methode1(100) for i in range(0,10) ] print l # affiche [19, 46, 26, 88, 44, 56, 56, 26, 0, 8] nb2 = exemple_classe () l2 = [ nb2.methode1(100) for i in range(0,10) ] print l2 # affiche [19, 46, 26, 88, 44, 56, 56, 26, 0, 8]
File: chap4_classe.tex, line 366
class exemple_classe: def __init__ (self) : self.rnd = 42 def methode1(self,n): self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () print nb.__dict__ # affiche {'rnd': 42}
File: chap4_classe.tex, line 382
class exemple_classe: def methode1(self,n): if "rnd" not in self.__dict__ : # l'attribut existe-t-il ? self.rnd = 42 # création de l'attribut self.__dict__ ["rnd"] = 42 # autre écriture possible self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () l = [ nb.methode1(100) for i in range(0,10) ] print l # affiche [19, 46, 26, 88, 44, 56, 56, 26, 0, 8]
File: chap4_classe.tex, line 455
class classe_vide: pass cl = classe_vide () print cl.__module__ # affiche __main__ print cl.__class__ # affiche __main__.classe_vide () print cl.__dict__ # affiche {} print cl.__doc__ # affiche None (voir paragraphe suivant) print cl.__class__.__doc__ # affiche None print cl.__class__.__dict__ # affiche {'__module__': '__main__', # '__doc__': None} print cl.__class__.__name__ # affiche classe_vide print cl.__class__.__bases__ # affiche ()
File: chap4_classe.tex, line 486
class exemple_classe: """simule une suite de nombres aléatoires""" def __init__ (self) : """constructeur : initialisation de la première valeur""" self.rnd = 42 def methode1(self,n): """simule la génération d'un nombre aléatoire compris entre 0 et n-1 inclus""" self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () help (exemple_classe) # appelle l'aide associée à la classe
File: chap4_classe.tex, line 502
class exemple_classe | simule une suite de nombres aléatoires | | Methods defined here: | | __init__(self) | constructeur : initialisation de la première valeur | | methode1(self, n) | simule la génération d'un nombre aléatoire | compris entre 0 et n-1 inclus
File: chap4_classe.tex, line 520
print exemple_classe.__doc__ # affiche simule une suite de nombres aléatoires print nb.__doc__ # affiche simule une suite de nombres aléatoires print nb.__class__.__doc__ # affiche simule une suite de nombres aléatoires
File: chap4_classe.tex, line 533
class essai_class: def meth(self): x = 6 self.y = 7 a = essai_class() print dir (a) # affiche ['__doc__', '__module__', 'meth'] a.meth () print dir (a) # affiche ['__doc__', '__module__', 'meth', 'y'] print dir (essai_class) # affiche ['__doc__', '__module__', 'meth']
File: chap4_classe.tex, line 559
class ensemble_element : class element : def __init__ (self) : self.x, self.y, self.z = 0,0,0 def __init__ (self) : self.all = [ ensemble_element.element () for i in xrange (0,3) ] def barycentre (self) : b = ensemble_element.element () for el in self.all : b.x += el.x b.y += el.y b.z += el.z b.x /= len (self.all) b.y /= len (self.all) b.z /= len (self.all) return b f = ensemble_element () f.all [0].x, f.all [0].y, f.all [0].z = 4.5,1.5,1.5 b = f.barycentre () print b.x,b.y,b.z # affiche 1.5 0.5 0.5
File: chap4_classe.tex, line 598
class nouvelle_classe: pass x = nouvelle_classe () + nouvelle_classe ()
File: chap4_classe.tex, line 613
class nombre_complexe: def __init__ (self, a = 0, b= 0) : self.a, self.b = a,b def get_module (self) : return math.sqrt (self.a * self.a + self.b * self.b) def ajoute (self,c): return nombre_complexe (self.a + c.a, self.b + c.b) c1 = nombre_complexe (0,1) c2 = nombre_complexe (1,0) c = c1.ajoute (c2) # c = c1 + c2 print c.a, c.b
File: chap4_classe.tex, line 633
class nom_class : def __add__ (self, autre) : # corps de l'opérateur return ... # nom_classe
File: chap4_classe.tex, line 647
class nombre_complexe: def __init__ (self, a = 0, b= 0) : self.a, self.b = a,b def get_module (self) : return math.sqrt (self.a * self.a + self.b * self.b) def __add__(self, c): return nombre_complexe (self.a + c.a, self.b + c.b) c1 = nombre_complexe (0,1) c2 = nombre_complexe (1,0) c = c1 + c2 # cette expression est maintenant syntaxiquement correcte c = c1.__add__ (c2) # même ligne que la précédente mais écrite explicitement print c.a, c.b
File: chap4_classe.tex, line 667
class nom_class : def __iadd__ (self, autre) : # corps de l'opérateur return self
File: chap4_classe.tex, line 682
class nombre_complexe: def __init__ (self, a = 0, b= 0) : self.a, self.b = a,b def get_module (self) : return math.sqrt (self.a * self.a + self.b * self.b) def __add__(self, c) : return nombre_complexe (self.a + c.a, self.b + c.b) def __iadd__(self, c) : self.a += c.a self.b += c.b return self c1 = nombre_complexe (0,1) c2 = nombre_complexe (1,0) c1 += c2 # utilisation de l'opérateur += c1.__iadd__ (c2) # c'est la transcription explicite de la ligne précédente print c1.a, c1.b
File: chap4_classe.tex, line 706
class nom_class : def __str__ (self) : # corps de l'opérateur return...
File: chap4_classe.tex, line 721
class nombre_complexe: def __init__ (self, a = 0, b= 0) : self.a, self.b = a,b def __add__(self, c) : return nombre_complexe (self.a + c.a, self.b + c.b) def __str__ (self) : if self.b == 0 : return "%f" % (self.a) elif self.b > 0 : return "%f + %f i" % (self.a, self.b) else : return "%f - %f i" % (self.a, -self.b) c1 = nombre_complexe (0,1) c2 = nombre_complexe (1,0) c3 = c1 + c2 print c3 # affiche 1.000000 + 1.000000 i
File: chap4_classe.tex, line 745
class point_espace: def __init__ (self, x,y,z): self._x, self._y, self._z = x,y,z def __getitem__(self,i): if i == 0 : return self._x if i == 1 : return self._y if i == 2 : return self._z # pour tous les autres cas --> erreur raise IndexError ("indice impossible, 0,1,2 autorisés") def __setitem__(self,i,x): if i == 0 : self._x = x elif i == 1 : self._y = y elif i == 2 : self._z = z # pour tous les autres cas --> erreur raise IndexError ("indice impossible, 0,1,2 autorisés") def __str__(self): return "(%f,%f,%f)" % (self._x, self._y, self._z) a = point_espace (1,-2,3) print a # affiche (1.000000,-2.000000,3.000000) a [1] = -3 # (__setitem__) affecte -3 à a.y print "abscisse : ", a [0] # (__getitem__) affiche abscisse : 1 print "ordonnée : ", a [1] # (__getitem__) affiche ordonnée : -3 print "altitude : ", a [2] # (__getitem__) affiche altitude : 3
File: chap4_classe.tex, line 779
Traceback (most recent call last): File "point_espace.py", line 31, in ? print a [4] File "point_espace.py", line 13, in __getitem__ raise IndexError, "indice impossible, 0,1,2 autorisés" IndexError: indice impossible, 0,1,2 autorisés
File: chap4_classe.tex, line 923
a = point_espace (1,-2,3) for x in a: print x # affiche successivement 1,-2,3
File: chap4_classe.tex, line 933
a = point_espace (1,-2,3) it = iter (a) while True: try : print it.next () except StopIteration : break
File: chap4_classe.tex, line 944
class point_espace: def __init__ (self, x,y,z): self._x, self._y, self._z = x,y,z def __str__(self): return "(%f,%f,%f)" % (self._x, self._y, self._z) def __getitem__(self,i): if i == 0 : return self._x if i == 1 : return self._y if i == 2 : return self._z # pour tous les autres cas --> erreur raise IndexError ("indice impossible, 0,1,2 autorisés") class class_iter: """cette classe définit un itérateur pour point_espace""" def __init__ (self,ins): """initialisation, self._ins permet de savoir quelle instance de point_espace on explore, self._n mémorise l'indice de l'élément exploré""" self._n = 0 self._ins = ins def __iter__ (self) : # le langage impose cette méthode return self # dans certaines configurations def next (self): """retourne l'élément d'indice self._n et passe à l'élément suivant""" if self._n <= 2: v = self._ins [self._n] self._n += 1 return v else : # si cet élément n'existe pas, lève une exception raise StopIteration def __iter__(self): """opérateur de la classe point_espace, retourne un itérateur permettant de l'explorer""" return point_espace.class_iter (self) a = point_espace (1,-2,3) for x in a: print x # affiche successivement 1,-2,3
File: chap4_classe.tex, line 993
class point_espace: def __init__ (self, x,y,z): self._x, self._y, self._z = x,y,z def __str__(self): return "(%f,%f,%f)" % (self._x, self._y, self._z) def __getitem__(self,i): if i == 0 : return self._x if i == 1 : return self._y if i == 2 : return self._z # pour tous les autres cas --> erreur raise IndexError ("indice impossible, 0,1,2 autorisés") def __iter__(self): """itérateur avec yield (ou générateur)""" _n = 0 while _n <= 2 : yield self.__getitem__ (_n) _n += 1 a = point_espace (1,-2,3) for x in a: print x # affiche successivement 1,-2,3
File: chap4_classe.tex, line 1040
class essai_class: def methode (self): print "méthode non statique" x = essai_class () x.methode ()
File: chap4_classe.tex, line 1053
class nom_class : def nom_methode(params, ...) : # corps de la méthode ... nom_methode = staticmethod (nom_methode)
File: chap4_classe.tex, line 1068
class essai_class: def methode (): print "méthode statique" methode = staticmethod(methode) essai_class.methode ()
File: chap4_classe.tex, line 1080
def methode (): print "méthode statique" class essai_class: pass essai_class.methode = staticmethod(methode) essai_class.methode ()
File: chap4_classe.tex, line 1094
class essai_class: print "création d'une instance de la classe essai_class" methode = staticmethod(methode) cl = classe_vide () # affiche création d'une instance de la classe essai_class ck = classe_vide () # n'affiche rien
File: chap4_classe.tex, line 1106
class Couleur : def __init__ (self, r, v, b) : self.r, self.v, self.b = r, v, b def __str__ (self) : return str ( (self.r,self.v,self.b)) def blanc () : return Couleur (255,255,255) def noir () : return Couleur (0,0,0) blanc = staticmethod (blanc) noir = staticmethod (noir) c = Couleur.blanc () print c # affiche (255, 255, 255) c = Couleur.noir () print c # affiche (0, 0, 0)
File: chap4_classe.tex, line 1135
class nom_class : attribut_statique = valeur def nom_methode (self,params, ...): nom_class.attribut_statique2 = valeur2 def nom_methode_st (params, ...) : nom_class.attribut_statique3 = valeur3 nom_methode_st = staticmethod (nom_methode_st)
File: chap4_classe.tex, line 1153
class essai_class: x = 5 def meth(self): print essai_class.x essai_class.x += 1 y = essai_class () z = essai_class () y.meth() # affiche 5 z.meth() # affiche 6
File: chap4_classe.tex, line 1172
class exemple_classe: rnd = 42 def incremente_rnd (self): self.rnd += 1 return self.rnd cl = exemple_classe() print cl.__dict__ # affiche {} print cl.__class__.__dict__ ["rnd"] # affiche 42 cl.incremente_rnd () print cl.__dict__ # affiche {'rnd': 43} print cl.__class__.__dict__ ["rnd"] # affiche 42
File: chap4_classe.tex, line 1202
def nom_methode (cls) : # code de la fonction} class nom_classe : # code de la classe nom_methode = classmethod (nom_methode) # syntaxe 1 nom_classe.nom_methode = classmethod (nom_methode) # syntaxe 2
File: chap4_classe.tex, line 1222
def meth3 (cls): print "ok meth3", cls.x def meth4 (cls): print "ok meth4", cls.x class essai_classe: x = 5 def meth(self): print "ok meth", self.x def meth2(cls): print "ok meth2", cls.x meth3 = classmethod (meth3) x = essai_classe () x.meth () # affiche ok meth 5 x.meth2 () # affiche ok meth2 5 x.meth3 () # affiche ok meth3 5 essai_classe.meth4 = classmethod (meth4) x.meth4 () # affiche ok meth4 5
File: chap4_classe.tex, line 1252
class nom_classe : # code de la classe nom_propriete = property (fget, fset, fdel, doc)
File: chap4_classe.tex, line 1268
import math class nombre_complexe(object): # voir remarque après l'exemple def __init__ (self, a = 0, b= 0): self.a = a self.b = b def __str__ (self) : if self.b == 0 : return "%f" % (self.a) elif self.b > 0 : return "%f + %f i" % (self.a, self.b) else : return "%f - %f i" % (self.a, -self.b) def get_module (self): return math.sqrt (self.a * self.a + self.b * self.b) def set_module (self,m): r = self.get_module () if r == 0: self.a = m self.b = 0 else : d = m / r self.a *= d self.b *= d def get_argument (self) : r = self.get_module () if r == 0 : return 0 else : return math.atan2 (self.b / r, self.a / r) def set_argument (self,arg) : m = self.get_module () self.a = m * math.cos (arg) self.b = m * math.sin (arg) def get_conjugue (self): return nombre_complexe (self.a,-self.b) module = property (fget = get_module, fset = set_module, doc = "module") arg = property (fget = get_argument, fset = set_argument, doc = "argument") conj = property (fget = get_conjugue, doc = "conjugué") c = nombre_complexe (0.5,math.sqrt (3)/2) print "c = ", c # affiche c = 0.500000 + 0.866025 i print "module = ", c.module # affiche module = 1.0 print "argument = ", c.arg # affiche argument = 1.0471975512 c = nombre_complexe () c.module = 1 c.arg = math.pi * 2 / 3 print "c = ", c # affiche c = -0.500000 + 0.866025 i print "module = ", c.module # affiche module = 1.0 print "argument = ", c.arg # affiche argument = 2.09439510239 print "conjugué = ", c.conj # affiche conjugué = -0.500000 - 0.866025 i
File: chap4_classe.tex, line 1329
Traceback (most recent call last): File "cour2.py", line 53, in ? c.conj = nombre_complexe (0,0) AttributeError: can't set attribute
File: chap4_classe.tex, line 1356
class exemple_classe: def __init__ (self) : self.rnd = 42 def methode1(self,n): self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () nb2 = nb print nb.rnd # affiche 42 print nb2.rnd # affiche 42 nb2.rnd = 0 print nb2.rnd # affiche 0, comme prévu print nb.rnd # affiche 0, si nb et nb2 étaient des objets différents, # cette ligne devrait afficher 42
File: chap4_classe.tex, line 1379
import copy nom_copy = copy.copy (nom_instance)
File: chap4_classe.tex, line 1392
class exemple_classe: def __init__ (self) : self.rnd = 42 def methode1(self,n): self.rnd = 397204094 * self.rnd % 2147483647 return int (self.rnd % n) nb = exemple_classe () import copy # pour utiliser le module copy nb2 = copy.copy (nb) # copie explicite print nb.rnd # affiche 42 print nb2.rnd # affiche 42 nb2.rnd = 0 print nb2.rnd # affiche 0 print nb.rnd # affiche 42
File: chap4_classe.tex, line 1420
m = [ 0, 1 ] m2 = m del m2 # supprime l'identificateur mais pas la liste print m # affiche [0, 1]
référencement d'objets
class CreationDestruction (object) : def __init__ (self) : print "constructeur" def __new__ (self) : print "__new__" return object.__new__ (self) def __del__ (self) : print "__del__" print "a" m = CreationDestruction () print "b" m2 = m print "c" del m print "d" del m2 print "e"
File: chap4_classe.tex, line 1436
a __new__ constructeur b c d __del__ e
File: chap4_classe.tex, line 1457
class classe_incluse: def __init__ (self) : self.attr = 3 class exemple_classe: def __init__ (self) : self.inclus = classe_incluse () self.rnd = 42 nb = exemple_classe () import copy # pour utiliser le module copy nb2 = copy.copy (nb) # copie explicite print nb.inclus.attr # affiche 3 print nb2.inclus.attr # affiche 3 nb2.inclus.attr = 0 print nb.inclus.attr # affiche 0 (on voudrait 3 ici) print nb2.inclus.attr # affiche 0
File: chap4_classe.tex, line 1485
class nom_classe : def __copy__ () : copie = nom_classe (...) # ... return copie
File: chap4_classe.tex, line 1503
import copy class classe_incluse: def __init__ (self) : self.attr = 3 class exemple_classe: def __init__ (self) : self.inclus = classe_incluse () self.rnd = 42 def __copy__ (self): copie = exemple_classe () copie.rnd = self.rnd copie.inclus = copy.copy (self.inclus) return copie nb = exemple_classe () nb2 = copy.copy (nb) # copie explicite, # utilise l'opérateur __copy__, # cette ligne est équivalente à # nb2 = nb.__copy__() print nb.rnd # affiche 42 print nb2.rnd # affiche 42 print nb.inclus.attr # affiche 3 print nb2.inclus.attr # affiche 3 nb.inclus.attr = 0 nb.rnd = 1 print nb.rnd # affiche 1 print nb2.rnd # affiche 42 print nb.inclus.attr # affiche 0 print nb2.inclus.attr # affiche 3 (c'est le résultat souhaité)
File: chap4_classe.tex, line 1546
def fonction_liste (): return range (4,7) # retourne la liste [4,5,6] l = fonction_liste () # la liste [4,5,6] n'est pas recopiée, # l'identificateur l lui est affecté
File: chap4_classe.tex, line 1558
def fonction_liste (): return range (4,7) fonction_liste () # la liste [4,5,6] n'est pas recopiée, # elle n'est pas non plus attribuée à une variable, # elle est alors détruite automatiquement par le langage Python
File: chap4_classe.tex, line 1575
l = [4,5,6] l2 = l print l # affiche [4, 5, 6] print l2 # affiche [4, 5, 6] l2 [1] = 10 print l # affiche [4, 10, 6] print l2 # affiche [4, 10, 6]
File: chap4_classe.tex, line 1589
l = [4,5,6] import copy l2 = copy.copy (l) print l # affiche [4, 5, 6] print l2 # affiche [4, 5, 6] l2 [1] = 10 print l # affiche [4, 5, 6] print l2 # affiche [4, 10, 6]
File: chap4_classe.tex, line 1604
import copy l = [ [i] for i in range(0,3)] ll = copy.copy (l) print l, " - ", ll # affiche [[0], [1], [2]] - [[0], [1], [2]] ll [0][0] = 6 print l, " - ", ll # affiche [[6], [1], [2]] - [[6], [1], [2]]
File: chap4_classe.tex, line 1619
import copy l = [ [i] for i in range(0,3)] ll = copy.deepcopy (l) print l, " - ", ll # affiche [[0], [1], [2]] - [[0], [1], [2]] ll [0][0] = 6 print l, " - ", ll # affiche [[0], [1], [2]] - [[6], [1], [2]]
File: chap4_classe.tex, line 1635
import copy memo = { } nom_copy = copy.deepcopy (nom_instance [,memo])
File: chap4_classe.tex, line 1648
class nom_classe : def __deepcopy__ (self,memo) : copie = copy.copy (self) # ... return copie
File: chap4_classe.tex, line 1665
import copy class classe_incluse: def __init__ (self) : self.attr = 3 class exemple_classe: def __init__ (self) : self.inclus = classe_incluse () self.rnd = 42 def __copy__ (self): copie = exemple_classe () copie.rnd = self.rnd return copie def __deepcopy__ (self,memo): if self in memo : return memo [self] copie = copy.copy (self) memo [self] = copie # mémorise la copie de self qui est copie copie.inclus = copy.deepcopy (self.inclus,memo) return copie nb = exemple_classe () nb2 = copy.deepcopy (nb) # copie explicite à tous niveaux, # utilise l'opérateur __copy__, # cette ligne est équivalente à # nb2 = nb.__deepcopy__() print nb.rnd # affiche 42 print nb2.rnd # affiche 42 print nb.inclus.attr # affiche 3 print nb2.inclus.attr # affiche 3 nb.inclus.attr = 0 nb.rnd = 1 print nb.rnd # affiche 1 print nb2.rnd # affiche 42 print nb.inclus.attr # affiche 0 print nb2.inclus.attr # affiche 3 # résultat souhaité
File: chap4_classe.tex, line 1711
import copy class Objet1 : def __init__ (self, i) : self.i = i def __str__ (self) : return "o1 " + str (self.i) + " : " + str (self.o2.i) class Objet2 : def __init__ (self, i, o) : self.i = i self.o1 = o o.o2 = self def __str__ (self) : return "o2 " + str (self.i) + " : " + str (self.o1.i) def __deepcopy__ (self,memo) : return Objet2 (self.i, self.o1) o1 = Objet1 (1) o2 = Objet2 (2, o1) print o1 # affiche o1 1 : 2 print o2 # affiche o2 2 : 1 o3 = copy.deepcopy (o2) o3.i = 4 print o1 # affiche o1 1 : 4 --> on voudrait 2 print o2 # affiche o2 2 : 1 print o3 # affiche o2 4 : 1
File: chap4_classe.tex, line 1745
import copy class Objet1 : def __init__ (self, i) : self.i = i def __str__ (self) : return "o1 " + str (self.i) + " : " + str (self.o2.i) def __deepcopy__ (self,memo={}) : if self in memo : return memo [self] r = Objet1 (self.i) memo [self] = r r.o2 = copy.deepcopy (self.o2, memo) return r class Objet2 : def __init__ (self, i, o) : self.i = i self.o1 = o o.o2 = self def __str__ (self) : return "o2 " + str (self.i) + " : " + str (self.o1.i) def __deepcopy__ (self,memo = {}) : if self in memo : return memo [self] r = Objet2 (self.i, self.o1) memo [self] = r r.o1 = copy.deepcopy (self.o1, memo) return r o1 = Objet1 (1) o2 = Objet2 (2, o1) print o1 # affiche o1 1 : 2 print o2 # affiche o2 2 : 1 o3 = copy.deepcopy (o2) o3.i = 4 print o1 # affiche o1 1 : 2 --> on a 2 cette fois-ci print o2 # affiche o2 2 : 1 print o3 # affiche o2 4 : 1
File: chap4_classe.tex, line 1796
class nom_classe (object) : __slots__ = "attribut_1", ..., "attribut_n"
File: chap4_classe.tex, line 1807
class point_espace(object): __slots__ = "_x", "_y", "_z" def __init__ (self, x,y,z): self._x, self._y, self._z = x,y,z def __str__(self): return "(%f,%f,%f)" % (self._x, self._y, self._z) a = point_espace (1,-2,3) print a
File: chap4_classe.tex, line 1822
Traceback (most recent call last): File "cours4.py", line 15, in ? a.j = 6 AttributeError: 'point_espace' object has no attribute 'j'
File: chap4_classe.tex, line 1849
import random # extension interne incluant des fonctions # simulant des nombres aléatoires, # random.randint (a,b) --> retourne un nombre entier entre a et b # cette ligne doit être ajoutée à tous les exemples suivant # même si elle n'y figure plus def cent_tirages () : s = 0 for i in range (0,100) : s += random.randint (0,1) return s print cent_tirages ()
File: chap4_classe.tex, line 1869
def cent_tirages () : s = 0 for i in range (0,100) : t = random.randint (0,10) if t >= 3 : s += 1 return s print cent_tirages ()
File: chap4_classe.tex, line 1884
def piece_normale () : return random.randint (0,1) def piece_truquee () : t = random.randint (0,10) if t >= 3 : return 1 else : return 0 def cent_tirages (piece) : s = 0 for i in range (0,100) : s += piece () return s print cent_tirages (piece_normale) print cent_tirages (piece_truquee)
File: chap4_classe.tex, line 1915
class piece_normale : def tirage (self) : return random.randint (0,1) def cent_tirages (self) : s = 0 for i in range (0,100) : s += self.tirage () return s p = piece_normale () print p.cent_tirages ()
File: chap4_classe.tex, line 1933
class piece_normale : def tirage (self) : return random.randint (0,1) def cent_tirages (self) : s = 0 for i in range (0,100) : s += self.tirage () return s class piece_truquee : def tirage (self) : t = random.randint (0,10) if t >= 3 : return 1 else : return 0 def cent_tirages (self) : s = 0 for i in range (0,100) : s += self.tirage () return s p = piece_normale () print p.cent_tirages () p2 = piece_truquee () print p2.cent_tirages ()
File: chap4_classe.tex, line 1967
class piece_normale : def tirage (self) : return random.randint (0,1) def cent_tirages (self) : s = 0 for i in range (0,100) : s += self.tirage () return s class piece_truquee (piece_normale) : def tirage (self) : t = random.randint (0,10) if t >= 3 : return 1 else : return 0 p = piece_normale () print p.cent_tirages () p2 = piece_truquee () print p2.cent_tirages ()
File: chap4_classe.tex, line 1994
class piece_normale : def tirage (self) : return random.randint (0,1) def cent_tirages (self) : s = 0 for i in range (0,100) : s += self.tirage () return s class piece_truquee (piece_normale) : def tirage (self) : t = random.randint (0,10) if t >= 3 : return 1 else : return 0 class piece_tres_truquee (piece_truquee) : def __init__(self) : # création de l'attribut avant self.avant = 0 def tirage (self) : if self.avant == 0 : # appel de la méthode tirage de la classe piece_truquee self.avant = piece_truquee.tirage (self) else : # appel de la méthode tirage de la classe piece_normale self.avant = piece_normale.tirage (self) return self.avant p = piece_normale () print "normale ", p.cent_tirages () p2 = piece_truquee () print "truquee ", p2.cent_tirages () p3 = piece_tres_truquee () print "tres truquee ", p3.cent_tirages ()
File: chap4_classe.tex, line 2063
class nom_classe (nom_ancetre) : # corps de la classe # ...
File: chap4_classe.tex, line 2078
help (piece_tres_truquee)
File: chap4_classe.tex, line 2086
Help on class piece_tres_truquee in module __main__: class piece_tres_truquee(piece_truquee) | Method resolution order: | piece_tres_truquee | piece_truquee | piece_normale | | Methods defined here: | | __init__(self) | | tirage(self) | | ---------------------------------------------------------------------- | Methods inherited from piece_normale: | | cent_tirages(self)
File: chap4_classe.tex, line 2116
for l in piece_tres_truquee.__bases__ : print l # affiche __main__.piece_truquee print piece_normale in piece_tres_truquee.__bases__ # affiche False print piece_truquee in piece_tres_truquee.__bases__ # affiche True
File: chap4_classe.tex, line 2126
print issubclass (piece_tres_truquee, piece_normale) # affiche True print issubclass (piece_truquee, piece_normale) # affiche True
File: chap4_classe.tex, line 2140
class nom_classe (nom_ancetre) : def nom_autre_methode (self, ...) : # ... def nom_methode (self, ...) : nom_ancetre.nom_methode (self, ...) # appel de la méthode définie chez l'ancêtre nom_ancetre.nom_autre_methode (self, ...) # appel d'une autre méthode définie chez l'ancêtre self.nom_autre_methode (...) # appel d'une méthode surchargée
File: chap4_classe.tex, line 2159
class A : def __init__ (self) : self.x = 0 class B (A) : def __init__ (self) : A.__init__ (self) self.y = 0
File: chap4_classe.tex, line 2175
class ancetre : def __init__(self) : self.a = 5 def __str__ (self) : return "a = " + str (self.a) class fille (ancetre) : def __init__(self) : ancetre.__init__(self) # cette ligne est importante # car sans elle, l'attribut a n'existe pas self.a += 1 def __str__ (self) : s = "a = " + str (self.a) return s x = ancetre () print x # affiche a = 5 y = fille () print y # affiche a = 6
File: chap4_classe.tex, line 2209
class rectangle : def __init__(self,a,b) : self.a,self.b = a,b def __str__ (self) : return "rectangle " + str (self.a) + " x " + str (self.b) class carre (rectangle) : def __init__( self, a) : rectangle.__init__ (self, a,a) r = rectangle (3,4) print r # affiche rectangle 3 x 4 c = carre (5) print c # affiche rectangle 5 x 5
File: chap4_classe.tex, line 2230
class carre : def __init__( self, a) : self.a = a def __str__ (self) : return "carre " + str (self.a) class rectangle (carre): def __init__(self,a,b) : carre.__init__(self, a) self.b = b def __str__ (self) : return "rectangle " + str (self.a) + " x " + str (self.b) r = rectangle (3,4) print r # affiche rectangle 3 x 4 c = carre (5) print c # affiche carre 5
File: chap4_classe.tex, line 2275
class A : def __init__ (self) : self.a = 5 def carre (self) : return self.a ** 2 class B : def __init__ (self) : self.a = 6 def cube (self) : return self.a ** 3 class C (A,B) : def __init__ (self): A.__init__ (self) x = C () print x.carre () # affiche 25 print x.cube () # affiche 125
File: chap4_classe.tex, line 2297
class A : def __init__ (self) : self.a = 5 def calcul (self) : return self.a ** 2 class B : def __init__ (self) : self.a = 6 def calcul (self) : return self.a ** 3 class C (A,B) : def __init__ (self): A.__init__ (self) x = C () print x.calcul () # affiche 25
File: chap4_classe.tex, line 2317
class C(A, B) | Method resolution order: | C | A | B | | Methods defined here: | | __init__(self) | | calcul(self)
File: chap4_classe.tex, line 2335
class A : def __init__ (self) : self.a = 5 def calcul (self) : return self.a ** 2 class B : def __init__ (self) : self.a = 6 def calcul (self) : return self.a ** 3 class C (A,B) : def __init__ (self): A.__init__ (self) def calcul (self) : return B.calcul (self) x = C () print x.calcul () # affiche 125
File: chap4_classe.tex, line 2359
class C (A,B) : def __init__ (self): A.__init__ (self) B.__init__ (self)
File: chap4_classe.tex, line 2374
issubclass (B,A)
File: chap4_classe.tex, line 2385
class A (object) : pass class B (A) : pass class C (B) : pass print issubclass (A, B) # affiche False print issubclass (B, A) # affiche True print issubclass (A, C) # affiche False print issubclass (C, A) # affiche True
File: chap4_classe.tex, line 2398
a = A () b = B () print issubclass (a.__class__, B) # affiche False print issubclass (b.__class__, A) # affiche True print issubclass (a.__class__, A) # affiche True
File: chap4_classe.tex, line 2409
a = A () b = B () print isinstance (a, B) # affiche False print isinstance (b, A) # affiche True print isinstance (a, A) # affiche True
fonction \codesindex{isinstance
def fonction_somme_list (ens) : r = "list " for e in ens : r += e return r def fonction_somme_dict (ens) : r = "dict " for k,v in ens.items () : r += v return r def fonction_somme (ens) : if isinstance (ens, dict) : return fonction_somme_dict (ens) elif isinstance (ens, list) : return fonction_somme_list (ens) else : return "erreur" li = ["un", "deux", "trois"] di = {1:"un", 2:"deux", 3:"trois"} tu = ("un", "deux", "trois") print fonction_somme (li) # affiche list undeuxtrois print fonction_somme (di) # affiche dict undeuxtrois print fonction_somme (tu) # affiche erreur
File: chap4_classe.tex, line 2434
s = """class carre : def __init__( self, a) : self.a = a def __str__ (self) : return "carre " + str (self.a) class rectangle (carre): def __init__(self,a,b) : carre.__init__(self, a) self.b = b def __str__ (self) : return "rectangle " + str (self.a) + " x " + str (self.b)""" obj = compile(s,"","exec") # code à compiler exec (obj) # classes incorporées au programme r = rectangle (3,4) print r # affiche rectangle 3 x 4 c = carre (5) print c # affiche carre 5
File: chap4_classe.tex, line 2459
# coding: latin-1 """erreur de compilation incluses dans le code inséré dans la chaîne de caractère s""" s = """class carre : def __init__( self, a) : seilf.a = a # erreur de compilation def __str__ (self) : return "carre " + str (self.a) """ obj = compile(s,"variable s","exec") # code à compiler exec (obj) # classes incorporées au programme c = carre (5) print c # affiche carre 5
File: chap4_classe.tex, line 2480
Traceback (most recent call last): File "C:\temp\cours.py", line 14, in -toplevel- c = carre (5) File "variable s", line 3, in __init__ NameError: global name 'seilf' is not defined
exemple de classe
# coding: latin-1 # la première ligne autorise les accents class fromage : def __init__ (self, p,c,o) : self.poids = p self.couleur = c self.odeur = o def decouper (self,nb) : l = [] for i in range (0,nb) : f = fromage (self.poids/nb, \ self.couleur, self.odeur) l.append (f) return l def __str__ (self) : s = "poids : " + str (self.poids) s += " couleur : " + str (self.couleur) s += " odeur : " + str (self.odeur) return s def __add__ (self,f) : print "ajout fromage" poids = self.poids + f.poids couleur = [0,0,0] for i in range (0,3) : couleur [i] = (self.couleur [i] * self.poids \ + f.couleur [i] * f.poids) / poids odeur = (self.odeur * self.poids + \ f.odeur * f.poids) / poids couleur = ( couleur [0], couleur [1], couleur [2]) return fromage (poids, couleur, odeur) class gruyere (fromage) : def __init__ (self,p) : fromage.__init__ (self, p, c = (150,150,0), o = 0.1) def __str__ (self) : s = fromage.__str__(self) s = "gruyère, " + s return s def __add__ (self,f) : print "ajout gruyère" if not isinstance (f, gruyere) : return fromage.__add__ (self, f) else : r = gruyere (self.poids + f.poids) return r #-------------------------------------------- fr = fromage (5.0, (255,0,0), 0.5) fr2 = fromage (10.0, (0,255,0), 1) fr3 = fr + fr2 print fr print fr2 print fr3 print "----------------------" g = gruyere (3.0) g2 = gruyere (7.0) g3 = g + g2 print g print g2 print g3 print "----------------------" print fr2 + g
héritage
class Fonction : def calcul (self, x) : pass def calcul_n_valeur (self, l) : res = [ self.calcul (i) for i in l ] return res class Carre (Fonction) : def calcul (self, x) : return x*x class Cube (Fonction) : def calcul (self, x) : return x*x*x l = [0,1,2,3] print l # affiche [0, 1, 2, 3] l1 = Carre ().calcul_n_valeur (l) # l1 vaut [0, 1, 4, 9] l2 = Cube () .calcul_n_valeur (l) # l2 vaut [0, 1, 8, 27]
méthode paramètre d'une fonction
class Fonction : def calcul (self, x) : pass class Carre (Fonction) : def calcul (self, x) : return x*x class Cube (Fonction) : def calcul (self, x) : return x*x*x def calcul_n_valeur (l,f): res = [ f(i) for i in l ] return res l = [0,1,2,3] l1 = calcul_n_valeur (l, Carre ().calcul) # l1 vaut [0, 1, 4, 9] l2 = calcul_n_valeur (l, Cube ().calcul) # l2 vaut [0, 1, 8, 27]
File: chap4_classe.tex, line 2523
class Matrice : def __init__ (self,lin,col,coef): self.lin, self.col = lin, col # interface d'échange def get_lin () : return self.lin def get_col () : return self.col def __getitem__(self,i,j): pass def __setitem__(self,i,j,v): pass def get_submat(self, i1,j1,i2,j2): pass def set_submat(self, i1,j1,mat): pass # fin de l'interface d'échange def trace (self) : t = 0 for i in xrange (0, self.lin): t += self (i,i) return t class MatriceList (Matrice) : def __init__ (self,lin,col,coef): Matrice.__init__ (self, \ lin, col, coef) #... def __getitem__ (self, i,j) : #... def __setitem__ (self, i,j, v) : #... def get_submat(self, i1,j1,i2,j2): #... def set_submat(self, i1,j1,mat): #... class MatriceDict (Matrice) : def __init__ (self,lin,col,coef): Matrice.__init__ (self, \ lin, col, coef) #... def __getitem__ (self, i,j) : #... def __setitem__ (self, i,j, v) : #... def get_submat(self, i1,j1,i2,j2): #... def set_submat(self, i1,j1,mat): #...
File: chap4_classe.tex, line 2568
class Produit : def calcul (self, mat1, mat2): pass class ProduitClassique (Produit) : def calcul (self, mat1, mat2): #... return class ProduitStrassen (Produit) : def calcul (self, mat1,mat2): #... return
File: chap5_exception.tex, line 19
x = 0 y = 1.0 / x
File: chap5_exception.tex, line 28
Traceback (most recent call last): File "cours.py", line 2, in ? y = 1.0 / x ZeroDivisionError: float division
File: chap5_exception.tex, line 51
def inverse (x): y = 1.0 / x return y a = inverse (2) print a b = inverse (0) print b
File: chap5_exception.tex, line 66
Traceback (most recent call last): File "cours.py", line 8, in ? b = inverse (0) File "cours.py", line 3, in inverse y = 1.0 / x ZeroDivisionError: float division
File: chap5_exception.tex, line 80
def inverse (x): y = 1.0 / x return y try : a = inverse (2) print a b = inverse (0) # déclenche une exception print b except : print "le programme a déclenché une erreur"
File: chap5_exception.tex, line 98
0.5 le programme a déclenché une erreur
File: chap5_exception.tex, line 108
def inverse (x): y = 1.0 / x return y try : print inverse (2) # pas d'erreur print inverse (1) # pas d'erreur non plus except : print "le programme a déclenché une erreur" else : print "tout s'est bien passé"
File: chap5_exception.tex, line 125
0.5 1.0 tout s'est bien passé
File: chap5_exception.tex, line 135
try : # ... instructions à protéger except : # ... que faire en cas d'erreur else : # ... que faire lorsque aucune erreur n'est apparue
File: chap5_exception.tex, line 152
def inverse (x): y = 1.0 / x return y try : print (-2.1) ** 3.1 # première erreur print inverse (2) print inverse (0) # seconde erreur except : print "le programme a déclenché une erreur"
File: chap5_exception.tex, line 174
def inverse (x): y = 1.0 / x return y try : print inverse (2) print inverse (0) except Exception, exc: print "exception de type ", exc.__class__ # affiche exception de type exceptions.ZeroDivisionError print "message ", exc # affiche le message associé à l'exception
File: chap5_exception.tex, line 194
def inverse (x): y = 1.0 / x return y try : print (-2.1) ** 3.1 # première erreur print inverse (2) print inverse (0) # seconde erreur except Exception, exc: if isinstance (exc, ZeroDivisionError) : print "division par zéro" else : print "erreur insoupçonnée : ", exc.__class__ print "message ", exc
File: chap5_exception.tex, line 215
erreur insoupçonnée : exceptions.ValueError
File: chap5_exception.tex, line 223
def inverse (x): y = 1.0 / x return y try : print (-2.1) ** 3.1 print inverse (2) print inverse (0) except ZeroDivisionError: print "division par zéro" except Exception, exc: print "erreur insoupçonnée : ", exc.__class__ print "message ", exc
File: chap5_exception.tex, line 243
try : # ... instructions à protéger except type_exception_1 : # ... que faire en cas d'erreur de type type_exception_1 except type_exception_i : # ... que faire en cas d'erreur de type type_exception_i except type_exception_n : # ... que faire en cas d'erreur de type type_exception_n except : # ... que faire en cas d'erreur d'un type différent de tous # les précédents types else : # ... que faire lorsque une erreur aucune erreur n'est apparue
File: chap5_exception.tex, line 381
def inverse (x): if x == 0 : raise ValueError y = 1.0 / x return y try : print inverse (0) # erreur except ValueError: print "erreur"
File: chap5_exception.tex, line 399
def inverse (x): if x == 0 : raise ValueError ("valeur nulle interdite, fonction inverse") y = 1.0 / x return y try : print inverse (0) # erreur except ValueError, exc: print "erreur, message : ", exc
File: chap5_exception.tex, line 417
raise exception_type (message) :
File: chap5_exception.tex, line 437
class ZeroDivisionError(ArithmeticError) | Second argument to a division or modulo operation was zero. | | Method resolution order: | ZeroDivisionError | ArithmeticError | StandardError | Exception
File: chap5_exception.tex, line 473
def inverse (x): y = 1.0 / x return y try : try : print inverses (0) # fonction inexistante --> exception NameError print inverse (0) # division par zéro --> ZeroDivisionError except NameError: print "appel à une fonction non définie" except ZeroDivisionError, exc: print "erreur ", exc
File: chap5_exception.tex, line 492
def inverse (x): y = 1.0 / x return y try : try : print inverse (0) # division par zéro --> ZeroDivisionError print inverses (0) # fonction inexistante --> exception NameError except NameError: print "appel à une fonction non définie" except ZeroDivisionError, exc: print "erreur ", exc
File: chap5_exception.tex, line 511
def inverse (x): try : y = 1.0 / x except ZeroDivisionError, exc: print "erreur ", exc if x > 0 : return 1000000000 else : return -1000000000 return y try : print inverse (0) # division par zéro --> la fonction inverse sait gérer print inverses (0) # fonction inexistante --> exception NameError except NameError: print "appel à une fonction non définie"
File: chap5_exception.tex, line 541
class AucunChiffre (Exception) : """chaîne de caractères contenant aussi autre chose que des chiffres""" def conversion (s) : """conversion d'une chaîne de caractères en entier""" if not s.isdigit () : raise AucunChiffre (s) return int (s) try : s = "123a" print s, " = ", conversion (s) except AucunChiffre, exc : # on affiche ici le commentaire associé à la classe d'exception # et le message associé print AucunChiffre.__doc__, " : ", exc
File: chap5_exception.tex, line 564
class AucunChiffre (Exception) : """chaîne de caractères contenant aussi autre chose que des chiffres""" def __str__ (self) : return self.__doc__ + " " + Exception.__str__ (self)
File: chap5_exception.tex, line 585
class AucunChiffre (Exception) : """chaîne de caractères contenant aussi autre chose que des chiffres""" def __init__(self, s, f = "") : Exception.__init__(self, s) self.s = s self.f = f def __str__(self) : return """exception AucunChiffre, depuis la fonction """ + self.f + \ " avec le paramètre " + self.s def conversion (s) : """conversion d'une chaîne de caractères en entier""" if not s.isdigit () : raise AucunChiffre (s, "conversion") return int (s) try : s = "123a" i = conversion (s) print s, " = ", i except AucunChiffre, exc : print exc print "fonction : ", exc.f
File: chap5_exception.tex, line 615
exception AucunChiffre, depuis la fonction conversion avec le paramètre 123a fonction : conversion
File: chap5_exception.tex, line 631
class point_espace: #... class class_iter: def __init__ (self,ins): self._n = 0 self._ins = ins def __iter__ (self) : return self def next (self): if self._n <= 2: v = self._ins [self._n] self._n += 1 return v else : raise StopIteration def __iter__(self): return point_espace.class_iter (self) # ...
File: chap5_exception.tex, line 664
def racine_carree(x) : if x < 0 : return False, 0 else : return True, x ** 0.5 print racine_carree (-1) # (False, 0) print racine_carree (1) # (True, 1.0)
File: chap5_exception.tex, line 676
def racine_carree(x) : if x < 0 : raise ValueError ("valeur négative") return x ** 0.5 print racine_carree (-1) # déclenche une exception print racine_carree (1)
fichier ouvert et exception
# coding: latin-1 def ajoute_resultat_division (nom, x, y) : """ajoute le résultat de la division x/y au fichier nom""" f = open (nom, "a") f.write (str (x) + "/" + str (y) + "= ") f.write ( str ((float (x)/y)) + "\n" ) # exception si y == 0 f.close () for i in range (0, 5) : try : print str (i-1) + "/" + str (i-2) ajoute_resultat_division ("essai.txt", i-1,i-2) except Exception, e : print "erreur avec i = ", i, ",", e
File: chap5_exception.tex, line 698
-1/-2 0/-1 1/0 erreur avec i = 2 , float division 2/1 3/2
File: chap5_exception.tex, line 709
-1/-2= 0.5 0/-1= 0.0 2/1= 2.0 3/2= 1.5 1/0=
# coding: latin-1 """exemple de module, aide associée""" exemple_variable = 3 def exemple_fonction () : """exemple de fonction""" return 0 class exemple_classe : """exemple de classe""" def __str__ (self) : return "exemple_classe"
(1)
import module_exemple c = module_exemple.exemple_classe () print c print module_exemple.exemple_fonction() help (module_exemple)
File: chap6_module.tex, line 58
import module_exemple module_exemple.exemple_variable = 10 reload (module_exemple) print module_exemple.exemple_variable # affiche 3
(2)
import module_exemple as alias c = alias.exemple_classe () print c print alias.exemple_fonction () help (alias)
(3)
from module_exemple import * c = exemple_classe () print c print exemple_fonction ()
(4)
alias = __import__ ("module_exemple") c = alias.exemple_classe () print c print alias.exemple_fonction () help (alias)
File: chap6_module.tex, line 99
if __name__ == "__main__" : print "ce fichier est le programme principal"
File: chap6_module.tex, line 113
import sys sys.path.append (sys.path [0] + "/../common") ################ sys.path [0] = répertoire de ce programme import nom_module
import dynamique de module
# coding: latin-1 def import_fichier (module) : import os.path import sys if os.path.exists (module) : # on teste l'existence du fichier folder,name = os.path.split (module) # on obtient le répertoire du module if folder not in sys.path : sys.path.append (folder) # on ajoute le répertoire dans la liste # des répertoires autorisés name = name.replace (".py", "") # on enlève l'extension module = __import__ (name) # on importe le module return module else : # si le fichier n'existe pas --> on lève une exception raise ImportError ("impossible d'importer le module " + module) # on importe un module mod = import_fichier (r"D:\Dupre\informatique\programme\corde.py") # on affiche l'aide associée help (mod)
File: chap6_module.tex, line 137
import sys for m in sys.modules : print m, " " * (14 - len(str(m))), sys.modules [m]
File: chap6_module.tex, line 144
os <module 'os' from 'c:\python26\lib\os.pyc'> os.path <module 'ntpath' from 'c:\python26\lib\ntpath.pyc'> re <module 're' from 'c:\python26\lib\re.pyc'> site <module 'site' from 'c:\python26\lib\site.pyc'> sys <module 'sys' (built-in)> types <module 'types' from 'c:\python26\lib\types.pyc'> ...
File: chap6_module.tex, line 158
module_exemple <module 'module_exemple' from 'D:\python_cours\module_exemple.py'>
File: chap6_module.tex, line 167
if "module_exemple" in sys.modules : m = sys.modules ["module_exemple"] m.exemple_fonction ()
File: chap6_module.tex, line 191
import os print os.__name__, os.__doc__ if __name__ == "__main__" : print "ce fichier est le point d'entrée" else : print "ce fichier est importé"
File: chap6_module.tex, line 211
import mesmodules.extension import mesmodules.part1.niveaudeux import mesmodules.part2.niveaudeuxbis
estimation du nombre $\pi$
# coding: latin-1 import random import math somme = 0 nb = 1000000 for i in range (0,nb) : x = random.random () # nombre aléatoire entre [0,1] y = random.random () r = math.sqrt (x*x + y*y) # racine carrée if r <= 1 : somme += 1 print "estimation ", 4 * float (somme) / nb print "PI = ", math.pi
intégrale de Monte Carlo
import random # import du module random : simulation du hasard import math # import du module math : fonctions mathématiques def integrale_monte_carlo (a,b,f,n) : somme = 0.0 for i in range (0,n) : x = random.random () * (b-a) + a y = f(x) somme += f(x) return somme / n def racine (x) : return math.sqrt (x) print integrale (0,1,racine,100000)
File: chap6_module.tex, line 284
def get_page_html (url): import urllib d = urllib.urlopen(url) res = d.read () d.close () return res url = "http://www.lemonde.fr" print get_page_html (url)
File: chap6_module.tex, line 304
c:\python26\python c:\python26\lib\pydoc.py -w nom_de_fichier
génération automatique de l'aide avec \codesindex{pydoc
# coding: latin-1 """aide associée à ce module, exemple d'utiliation de pydoc""" import os.path import os def pydoc_present () : """teste la présence du fichier pydoc.py""" p = "c:\\python26\\lib\\pydoc.py""" return os.path.exists (p) def pydoc_generation (file) : """génère la documentation associée au fichier file""" if not pydoc_present () : raise Exception ("pydoc n'est pas installé") os.system ("c:\\python26\\python c:\\python26\\lib\\pydoc.py -w " + file) class ExempleClass (object) : """exemple de classe avec de la documentation la classe contient comme attribut : - li : liste quelconque """ def __init__ (self) : object.__init__ (self) self.li = ["un", "deux"] def __str__ (self) : """permet d'afficher la classe sous forme de chaînes de caractères""" return "li = " + str (self.li) if __name__ == "__main__" : e = ExempleClass () print e # affiche li = ['un', 'deux'] pydoc_generation ("exemple_pydoc")
File: chap6_module.tex, line 342
c:\python26\python setup.py install
File: chap6_module.tex, line 349
python setup.py install
un module en C++
#include <Python.h> #include <stdio.h> /** Une fois importe, le module definit deux fonctions : - exemple qui prend une chaine en argument et retourne 0 - exemple2 qui leve une exception creee pour l'occasion */ static PyObject* ExempleErreur; static PyObject* exemple (PyObject* self, PyObject* args) { const char* chaine; if (!PyArg_ParseTuple (args, "s", &chaine)) return NULL; return Py_BuildValue("i", 2); } static PyObject* exemple2(PyObject* self, PyObject* args) { //const char* chaine ; PyErr_SetString (ExempleErreur, "Exemple de levée d'erreur") ; return NULL; } //////////////////////////////////////////////////// //////////// export des fonctions ////////////////// //////////////////////////////////////////////////// const char * module_name = "sample_module" ; char buffer [100] ; static PyMethodDef fonctions [] = { {"exemple", exemple, METH_VARARGS, "Un commentaire"}, {"exemple2", exemple2, METH_VARARGS, "Une methode levant une exception"}, {NULL, NULL, 0, NULL} } ; PyMODINIT_FUNC initsample_module(void) { PyObject* m ; m = Py_InitModule (module_name, fonctions) ; sprintf (buffer, "%s.Exception", module_name) ; ExempleErreur = PyErr_NewException(buffer, NULL, NULL) ; Py_INCREF (ExempleErreur) ; PyModule_AddObject (m, "Exception", ExempleErreur) ; }
importer un module en C++
# coding: latin-1 """ import d'un module C (un fichier), inclut la recompilation si le module a évolué depuis sa dernière compilation """ import os, sys, re def _find_compiled_file (path, name) : """cherche un fichier compilé""" ver = sys.version_info st = "%d.%d" % ver [:2] name = os.path.splitext (name) [0] exp = re.compile (name + "[.]o$") file, rep = [], [] for r, d, f in os.walk (path) : if st not in r : continue for a in f : if exp.search (a) : return r,a return None,None def import_c_module (name, mingw = r"c:\MinGW\bin", cpp = True, remove = False, path = None) : """ @ingroup SQLAppModels import d'un module C @param name nom du module C (nom du fichier sans extension, sans chemin non plus) @param mingw emplacement du compilateur mingw @param cpp c++ file? @param remove remove the file first before compiling @param path if the file is not found, try to look into this folder @return objet module @warning remove = True must be used when the module is compiled for the first time. Otherwise, the module is already loaded and impossible to remove until Python is closed. """ if os.path.splitext (name) [1] == "" : if cpp : name += ".cpp" ext = "cpp" else : name += ".c" ext = "c" else : ext = os.path.splitext (name) [1] [1:] mfile = name mod = os.path.splitext (mfile) [0] if path != None : mypath = os.path.normpath (os.path.realpath (path)) allpath = [mypath, "."] else : allpath = ["."] for p in sys.path : if p not in allpath : allpath.append (p) for path in allpath : whole = os.path.join (path, name) if os.path.exists (whole) : break else : path_tried = u"\n".join (allpath) raise ImportError ("unable to find file %s in any import path:\n%s" \ % (name, path_tried)) if sys.platform == "win32" : fsec = mod + ".pyd" else : fsec = mod + ".so" if path not in sys.path : sys.path.append (path) comp = os.path.join (path, fsec) if not os.path.exists (comp) : cond = True resa = "not found" else : if remove : os.remove (comp) cond = True resa = "remove" else : r,f = _find_compiled_file (path, mfile) if f != None : wholeo = os.path.join (r,f) datec = os.path.getmtime (whole) date = os.path.getmtime (wholeo) cond = datec > date resa = "date" else : cond = True resa = "f == None" if cond : mfile = mod file = (""" # coding: latin-1 from distutils.core import setup from distutils.core import Extension setup(name = '%s', version = '0.1', ext_modules = [Extension('%s', ['%s.%s']), ], url = '', author = '', author_email = '...', ) """ % (mfile,mfile,mfile,ext)).replace (" ", "") wr = os.path.join (path, "setup.py") f = open (wr, "w") f.write (file) f.close () env = os.getenv ("PATH") if mingw not in env : os.putenv ("PATH", env + ";" + mingw) cwd = os.getcwd () os.chdir (path) py = sys.executable.replace ("pythonw.exe", "python.exe") if sys.platform == "win32" : cmd = "%s setup.py build_ext --inplace -c mingw32" % (py) else : cmd = "%s setup.py build_ext --inplace" % (py) child_stdin, stdout, child_stderr = os.popen3 (cmd) res = stdout.read () err = child_stderr.read () stdout.close () os.chdir (cwd) if len (err) > 0 : message = "\nOUTPUT:\n" + res + "\n\n" message += "ERR:\n" + err if "error" in err : message += "unable to compile %s (resa %s)\n%s" % (name, resa, message) print (message) raise ImportError (message) else : print (message) mod = __import__ (mfile) return mod else : mfile = mod mod = __import__ (mfile) return mod if __name__ == "__main__" : sample_module = import_c_module ("sample_module", cpp = True) print sample_module print sample_module.exemple("e") print sample_module.exemple2()
File: chap6_module.tex, line 467
BOOST_PYTHON_MODULE(PythonSample) { // étapes d'initialisation } ;
File: chap6_module.tex, line 479
int fonction (int r, const char * s, double x = 4) ; BOOST_PYTHON_MODULE(PythonSample) { boost::python::def ("fonction", fonction, (boost::python::arg ("r"), boost::python::arg ("s"), boost::python::arg ("x") = 4), "aide associée à la fonction") ; } ;
File: chap6_module.tex, line 504
import PythonSample print PythonSample.fonction (4, "second") print PythonSample.fonction (4, "second", 5)
File: chap6_module.tex, line 520
boost::python::class_<PythonClassSample> obj ( "ClassSample", "help on PythonClassSample") ) ;
File: chap6_module.tex, line 538
boost::python::class_<PythonClassSample> obj ( "ClassSample", "help on PythonClassSample", boost::python::init<int,const char*> ( // ajout (boost::python::arg ("a"), // ajout boost::python::arg ("s") = "default value for s"), // ajout "help on PythonClassSample constructor" ) // ajout ) ;
File: chap6_module.tex, line 551
boost::python::class_<PythonClassSample, boost::python::bases<ClassBase> > obj ( "ClassSample", "help on PythonClassSample") ;
File: chap6_module.tex, line 560
boost::python::class_<PythonClassSample, boost::python::bases<ClassBase> > obj ( // ...
File: chap6_module.tex, line 575
obj.def ( "Random", &PythonClassSample::Random, (boost::python::arg ("pos")), "help on the method") ;
File: chap6_module.tex, line 584
boost::python::class_<MyVector> obj ("Vector", "help on vector", boost::python::init<int> ( (PY_ARG ("n")), "crée un vecteur de dimension n")) ; // ajout d'un constructeur sans paramètre obj.def (boost::python::init<MyVector> ()) ;
File: chap6_module.tex, line 595
v = PythonSample.Vector () v2 = PythonSample.Vector (10)
File: chap6_module.tex, line 604
obj.def_readwrite ("a", &PythonClassSample::_a, "retourne un accès à a") ;
File: chap6_module.tex, line 643
#ifndef LIB_MAFONCTION_H #define LIB_MAFONCTION_H #include <vector> void somme_vecteur ( const std::vector<double> &v1, const std::vector<double> &v2, std::vector<double> &res) ; #endif
File: chap6_module.tex, line 668
#include "mafonction.h" void somme_vecteur ( const std::vector<double> &v1, const std::vector<double> &v2, std::vector<double> &res) { if (v1.size () != v2.size ()) throw std::runtime_error ( "dimensions différentes") ; res.resize (v1.size ()) ; std::vector<double>:: const_iterator it1,it2 ; std::vector<double>::iterator it3 ; for (it1 = v1.begin (), it2 = v2.begin (), it3 = res.begin () ; it1 != v1.end () ; ++it1, ++it2, ++it3) *it3 = *it1 + *it2 ; }
File: chap6_module.tex, line 695
#ifndef PYTHON_MAFONCTION_H #define PYTHON_MAFONCTION_H #include "python/definition.h" boost::python::list python_somme_vecteur ( boost::python::list v1, boost::python::list v2) ; #endif
File: chap6_module.tex, line 719
#include "python/definition.h" #include "mafonction.h" #include "../libsample/mafonction.h" #include "python/conversion.h" #include "python/conversion.hpp" boost::python::list python_somme_vecteur ( boost::python::list v1, boost::python::list v2) { std::vector<double> cv1,cv2,cres ; PythonConvert (v1, cv1) ; PythonConvert (v2, cv2) ; somme_vecteur (cv1, cv2, cres) ; boost::python::list res ; PythonConvert (cres, res) ; return res ; }
File: chap6_module.tex, line 744
// ... #include "../mafonction.h" BOOST_PYTHON_MODULE(PythonSample) { // ... def ("somme_vecteur", &python_somme_vecteur, (boost::python::arg ("v1"), boost::python::arg ("v2")), "retourne la somme de deux vecteurs"); // ... } ;
File: chap6_module.tex, line 762
import PythonSample as PS v1 = [1.0, 2.0] v2 = [6.5, 7.8] v3 = PS.somme_vecteur (v1, v2)
File: chap6_module.tex, line 799
class PythonClassSample { ... PythonClassSample & __iadd__ (const PythonClassSample &a) ; ... } ;
File: chap6_module.tex, line 810
x.def ("__iadd__", &PythonClassSample::__iadd__, boost::python::return_internal_reference<>(), "addition") ;
import d'une DLL
import sys if "PythonSample" not in sys.modules : PythonSample = imp.load_dynamic ('PythonSample', PythonSample.dll) sys.modules ["PythonSample"] = PythonSample
File: chap6_module.tex, line 844
import PythonSampled as PythonSample # au lieu de import PythonSample
File: chap6_module.tex, line 851
import sys if "PythonSampled" in sys.modules : PythonSample = sys.modules ["PythonSampled"] else : import PythonSample
File: chap6_module.tex, line 872
if (<condition>) throw std::runtime_error ("message d'erreur") ;
File: chap7_fichiers.tex, line 47
f = open ("nom-fichier", "w") # ouverture f.write ( s ) # écriture de la chaîne de caractères s f.write ( s2 ) # écriture de la chaîne de caractères s2 ... f.close () # fermeture
File: chap7_fichiers.tex, line 75
mat = ... # matrice de type liste de listes f = open ("mat.txt", "w") for i in range (0,len (mat)) : # la fonction join est aussi for j in range (0, len (mat [i])) : # fréquemment utilisée f.write ( str (mat [i][j]) + "\t") # pour assembler les chaînes f.write ("\n") # un une seule et réduire le f.close () # nombre d'appels à f.write
File: chap7_fichiers.tex, line 94
mat = ... # matrice de type liste de listes f = open ("mat.txt", "w") for i in range (0,len (mat)) : for j in range (0, len (mat [i])) : print >> f, str (mat [i][j]), "\t", # ligne changée print >> f # ligne changée f.close ()
File: chap7_fichiers.tex, line 117
f = open ("nom-fichier", "a") # ouverture en mode ajout, mode "a" ...
File: chap7_fichiers.tex, line 129
f = open ("essai.txt", "w") f.write (" premiere fois ") f.close () f = open ("essai.txt", "w") f.write (" seconde fois ") f.close () # essai.txt : seconde fois
File: chap7_fichiers.tex, line 142
f = open ("essai.txt", "w") f.write (" premiere fois ") f.close () f = open ("essai.txt", "a") ### f.write (" seconde fois ") f.close () # essai.txt : premiere fois seconde fois
File: chap7_fichiers.tex, line 180
f = open ("essai.txt", "r") # ouverture du fichier en mode lecture for ligne in f : # pour toutes les lignes du fichier print ligne # on affiche la ligne (*) f.close () # on ferme le fichier
File: chap7_fichiers.tex, line 192
f = open ("essai.txt", "r") # ouverture du fichier en mode lecture l = f.readlines () # lecture de toutes les lignes, placées dans une liste f.close () # fermeture du fichier for s in l : print s # on affiche les lignes à l'écran (*)
File: chap7_fichiers.tex, line 208
f = open ("essai.txt", "r") # ouverture du fichier en mode lecture l = f.readlines () # lecture de toutes les lignes, placées dans une liste f.close () # fermeture du fichier # contiendra la liste des lignes nettoyées l_net = [ s.strip ("\n\r") for s in l ]
File: chap7_fichiers.tex, line 225
nom ; prénom ; livre Hugo ; Victor ; Les misérables Kessel ; Joseph ; Le lion Woolf ; Virginia ; Mrs Dalloway Calvino ; Italo ; Le baron perché
File: chap7_fichiers.tex, line 237
mat = [] # création d'une liste vide, f = open ("essai.txt", "r") # ouverture du fichier en mode lecture for li in f : # pour toutes les lignes du fichier s = li.strip ("\n\r") # on enlève les caractères de fin de ligne l = s.split (";") # on découpe en colonnes mat.append (l) # on ajoute la ligne à la matrice f.close () # fermeture du fichier
File: chap7_fichiers.tex, line 267
import zipfile file = zipfile.ZipFile ("exemplezip.zip", "r") for info in file.infolist () : print info.filename, info.date_time, info.file_size file.close ()
File: chap7_fichiers.tex, line 279
import zipfile file = zipfile.ZipFile ("exemplezip.zip", "r") data = file.read ("informatique/testzip.py") file.close () print data
File: chap7_fichiers.tex, line 296
import zipfile file = zipfile.ZipFile ("test.zip", "w") file.write ("fichier.txt", "nom_fichier_dans_zip.txt", zipfile.ZIP_DEFLATED) file.close ()
envoi d'un mail automatiquement
import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email.Utils import formatdate from email import Encoders import os def envoyer_mail (aqui, sujet, contenu, files = []): de = "email de l'auteur" msg = MIMEMultipart() msg ['From'] = de msg ['To'] = aqui msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = sujet msg.attach( MIMEText (contenu) ) for file in files: part = MIMEBase('application', 'octet-stream') part.set_payload ( open(file,'rb').read () ) Encoders.encode_base64 (part) part.add_header ('Content-Disposition', \ 'attachment; filename="%s"' % os.path.basename (file)) msg.attach (part) smtp = smtplib.SMTP ("smtp.gmail.com", 587) smtp.ehlo () smtp.starttls () smtp.ehlo () smtp.login ("login", "mot_de_passe") smtp.sendmail (de, aqui, msg.as_string () ) smtp.close() envoyer_mail ( "destinataire", "sujet","contenu", ["mail.py"] )
(1)
# coding: latin-1 import glob import os.path def liste_fichier_repertoire (folder, filter) : # résultats file,fold = [], [] # recherche des fichiers obéissant au filtre res = glob.glob (folder + "\\" + filter) # on inclut les sous-répertoires qui n'auraient pas été # sélectionnés par le filtre rep = glob.glob (folder + "\\*") for r in rep : if r not in res and os.path.isdir (r) : res.append (r) # on ajoute fichiers et répertoires aux résultats for r in res : path = r if os.path.isfile (path) : # un fichier, rien à faire à part l'ajouter file.append (path) else : # sous-répertoire : on appelle à nouveau la fonction # pour retourner la liste des fichiers inclus fold.append (path) fi,fo = liste_fichier_repertoire (path, filter) file.extend (fi) # on étend la liste des fichiers fold.extend (fo) # on étend la liste des répertoires # fin return file,fold folder = r"D:\Dupre\_data\informatique" filter = "*.tex" file,fold = liste_fichier_repertoire (folder, filter) for f in file : print "fichier ", f for f in fold : print "répertoire ", f
(2)
# coding: latin-1 import os def liste_fichier_repertoire (folder) : file, rep = [], [] for r, d, f in os.walk (folder) : for a in d : rep.append (r + "/" + a) for a in f : file.append (r + "/" + a) return file, rep folder = r"D:\Dupre\_data\informatique" file,fold = liste_fichier_repertoire (folder) for f in file : print "fichier ", f for f in fold : print "répertoire ", f
(1)
# coding: latin-1 import struct # on enregistre un entier, un réel et 4 caractères i = 10 x = 3.1415692 s = "ABCD" # écriture file = open ("info.bin", "wb") file.write ( struct.pack ("i" , i) ) file.write ( struct.pack ("d" , x) ) file.write ( struct.pack ("cccc" , *s) ) file.close () # lecture file = open ("info.bin", "rb") i = struct.unpack ("i", file.read (4)) x = struct.unpack ("d", file.read (8)) s = struct.unpack ("cccc", file.read (4)) file.close () # affichage pour vérifier que les données ont été bien lues print i # affiche (10,) print x # affiche (3.1415692000000002,) print s # affiche ('A', 'B', 'C', 'D')
(2)
# coding: latin-1 import struct # on enregistre un entier, un réel et n caractères i = 10 x = 3.1415692 s = "ABCDEDF" # écriture file = open ("info.bin", "wb") file.write ( struct.pack ("i" , i) ) file.write ( struct.pack ("d" , x) ) file.write ( struct.pack ("i" , len(s)) ) # on sauve la dimension de s file.write ( struct.pack ("c" * len(s) , *s) ) file.close () # lecture file = open ("info.bin", "rb") i = struct.unpack ("i", file.read (4)) x = struct.unpack ("d", file.read (8)) l = struct.unpack ("i", file.read (4)) # on récupère la dimension de s l = l [0] # l est un tuple, on s'intéresse à son unique élément s = struct.unpack ("c" * l, file.read (l)) file.close () # affichage pour contrôler print i # affiche (10,) print x # affiche (3.1415692000000002,) print s # affiche ('A', 'B', 'C', 'D', 'E', 'D', 'F')
File: chap7_fichiers.tex, line 470
import pickle dico = {'a': [1, 2.0, 3, "e"], 'b': ('string', 2), 'c': None} lis = [1, 2, 3] f = open ('data.bin', 'wb') pickle.dump (dico, f) pickle.dump (lis, f) f.close()
File: chap7_fichiers.tex, line 487
f = open ('data.bin', 'rb') dico = pickle.load (f) lis = pickle.load (f) f.close()
(1)
import pickle import copy class Test : def __init__ (self) : self.chaine = "a" self.entier = 5 self.tuple = { "h":1, 5:"j" } t = Test () f = open('data.bin', 'wb') # lecture pickle.dump (t, f) f.close() f = open('data.bin', 'rb') # écriture t = pickle.load (f) f.close()
(2)
import pickle import copy class Test : def __init__ (self) : self.x = 5 self.y = 3 self.calcule_norme () # attribut calculé def calcule_norme (self) : self.n = (self.x ** 2 + self.y ** 2) ** 0.5 def __getstate__ (self) : """conversion de Test en un dictionnaire""" d = copy.copy (self.__dict__) del d ["n"] # attribut calculé, on le sauve pas return d def __setstate__ (self,dic) : """conversion d'un dictionnaire dic en Test""" self.__dict__.update (dic) self.calcule_norme () # attribut calculé t = Test () f = open('data.bin', 'wb') # lecture pickle.dump (t, f) f.close() f = open('data.bin', 'rb') # écriture t = pickle.load (f) f.close()
File: chap7_fichiers.tex, line 516
# coding: latin-1 import glob import shutil def copie_repertoire (rep1, rep2) : """copie tous les fichiers d'un répertoire rep1 vers un autre rep2""" li = glob.glob (rep1 + "/*.*") # récupère dans une liste fichiers et # répertoires qui respectent le filtre for l in li : to = l.replace (rep1, rep2) # nom du fichier copié # (on remplace rep1 par rep2) shutil.copy (l, to) copie_repertoire ("c:/original", "c:/backup")
File: chap7_fichiers.tex, line 535
c:\python26\python.exe synchro.py c:/original c:/backup
File: chap7_fichiers.tex, line 552
interpréteur_python programme_python argument1 argument2 ...
lancer un programme \pythons en ligne de commande
# coding: latin-1 import glob import shutil def copie_repertoire (rep1, rep2) : """copie tous les fichiers d'un répertoire rep1 vers un autre rep2""" li = glob.glob (rep1 + "/*.*") for l in li : to = l.replace (rep1, rep2) # nom du fichier copié # (on remplace rep1 par rep2) shutil.copy (l, to) import sys # sys.argv [0] --> nom du programme (ici, synchro.py) rep1 = sys.argv [1] # récupération du premier paramètre rep2 = sys.argv [2] # récupération du second paramètre copie_repertoire (rep1, rep2)
File: chap7_fichiers.tex, line 578
c:\python26\python.exe c:\batch\synchro.py "c:\Program Files\source" "c:\Program Files\backup"
File: chap7_fichiers.tex, line 588
import os os.system ("c:\python26\python.exe c:\batch\synchro.py " \ "\"c:\Program Files\source\" \"c:\Program Files\backup\"")
lancer un navigateur en ligne de commande
mat = ["Victor Hugo 6".split (), "Marcel Proust 3".split () ] f = open ("tableau.html", "w") f.write ("<body><html>\n") f.write ("<table border=\"1\">\n") for m in mat : f.write ("<tr>") for c in m : f.write ("<td>" + c + "</td>") f.write ("</tr>\n") f.write ("</table>") f.close () import os os.system ("\"C:\\Program Files\\Mozilla Firefox\\firefox.exe\" tableau.html") os.system ("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"" \ " d:\\temp\\tableau.html")
File: chap7_fichiers.tex, line 611
s = """date 0 : 14/9/2000 date 1 : 20/04/1971 date 2 : 14/09/1913 date 3 : 2/3/1978 date 4 : 1/7/1986 date 5 : 7/3/47 date 6 : 15/10/1914 date 7 : 08/03/1941 date 8 : 8/1/1980 date 9 : 30/6/1976"""
File: chap7_fichiers.tex, line 621
[0-3]?[0-9]/[0-1]?[0-9]/([0-2][0-9])?[0-9][0-9]
File: chap7_fichiers.tex, line 630
import re # première étape : construction expression = re.compile ("([0-3]?[0-9]/[0-1]?[0-9]/([0-2][0-9])?[0-9][0-9])") # seconde étape : recherche res = expression.findall (s) print res
File: chap7_fichiers.tex, line 641
[('14/9/2000', '20'), ('20/04/1971', '19'), ('14/09/1913', '19'), ('2/3/1978', '19'), ('1/7/1986', '19'), ('7/3/47', ''), ('15/10/1914', '19'), ('08/03/1941', '19'), ('8/1/1980', '19'), ('30/6/1976', '19')]
File: chap7_fichiers.tex, line 679
s = r"D:\Dupre\_data\informatique\support\vba\image/vbatd1_4.png" print re.compile ( "[\\\\/]image[\\\\/].*[.]png").search(s) # résultat positif print re.compile (r"[\\/]image[\\/].*[.]png").search(s) # même résultat
File: chap7_fichiers.tex, line 701
import re s = "<h1>mot</h1>" print re.compile ("(<.*>)") .match (s).groups () # ('<h1>mot</h1>',) print re.compile ("(<.*?>)").match (s).groups () # ('<h1>',)
File: chap7_fichiers.tex, line 750
expression = re.compile ("([0-3]?[0-9]/[0-1]?[0-9]/([0-2][0-9])?[0-9][0-9])[^\d]") print expression.search (s).group(1,2) # affiche ('14/9/2000', '20') c = expression.search (s).span(1) # affiche (9, 18) print s [c[0]:c[1]] # affiche 14/9/2000
(1)
# coding: latin-1 import mutagen.mp3, mutagen.easyid3, os, re def infoMP3 (file, tags) : """retourne des informations sur un fichier MP3 sous forme de dictionnaire (durée, titre, artiste, ...)""" a = mutagen.mp3.MP3(file) b = mutagen.easyid3.EasyID3(file) info = { "minutes":a.info.length/60, "nom":file } for k in tags : try : info [k] = str (b [k][0]) except : continue return info def all_files (repertoire, tags, ext = re.compile (".mp3$")) : """retourne les informations pour chaque fichier d'un répertoire""" all = [] for r, d, f in os.walk (repertoire) : for a in f : if not ext.search (a) : continue t = infoMP3 (r + "/" + a, tags) if len (t) > 0 : all.append (t) return all def heart_notitle_mots (all, avoid,sep,heart) : """retourne trois résultats - les chansons dont le titre valide l'expression régulière heart - les chansons dont le titre valide l'expression régulière avoid - le nombre moyen de mots dans le titre d'une chanson""" liheart, notitle = [], [] nbmot,nbsong = 0,0 for a in all : if "title" not in a : notitle.append (a) continue ti = a ["title"].lower () if avoid.match (ti) : notitle.append (a) continue if heart.search (ti) : liheart.append (a) nbsong += 1 nbmot += len ([ m for m in sep.split (ti) if len (m) > 0 ]) return liheart, notitle, float (nbmot)/nbsong tags = "title album artist genre tracknumber".split () all = all_files (r"D:\musique", tags) avoid = re.compile ("^(((audio)?track( )?( - )?[0-9]{1,2})|(piste [0-9]{1,2}))$") sep = re.compile ("[- ,;!'.?&:]") heart = re.compile ("((heart)(?!((ache)|(land))))") liheart, notitle, moymot = heart_notitle_mots (all, avoid, sep, heart) print "nombre de mots moyen par titre ", moymot print "somme des durée contenant heart ", sum ( [ s ["minutes"] for s in liheart] ) print "chanson sans titre ", len (notitle) print "liste des titres " for s in liheart : print " ",s ["title"]
File: chap7_fichiers.tex, line 787
import re date = "05/22/2010" exp = "([0-9]{1,2})/([0-9]{1,2})/(((19)|(20))[0-9]{2})" com = re.compile (exp) print com.search (date).groups () # ('05', '22', '2010', '20', None, '20')
File: chap7_fichiers.tex, line 795
exp = "(?P<jj>[0-9]{1,2})/(?P<mm>[0-9]{1,2})/(?P<aa>((19)|(20))[0-9]{2})" com = re.compile (exp) print com.search (date).groupdict () # {'mm': '22', 'aa': '2010', 'jj': '05'}
(2)
# coding: latin-1 """ce programme détermine toutes les fonctions définies dans un programme et jamais appelées""" import glob, os, re def trouve_toute_fonction (s, exp, gr, expm = "^$") : """ à partir d'une chaîne de caractères correspondant à un programme Python, cette fonction retourne une liste de 3-uples, chacun contient : - le nom de la fonction - (debut,fin) de l'expression dans la chaîne - la ligne où elle a été trouvée Paramètres: - s : chaîne de caractères - exp : chaîne de caractères correspond à l'expression - gr : numéro de groupe correspondant au nom de la fonction - expm : expression négative """ exp = re.compile (exp) res = [] pos = 0 r = exp.search (s, pos) # première recherche while r != None : temp = (r.groups () [gr], r.span (gr), r.group (gr)) x = re.compile ( expm.replace ("function", temp [0]) ) if not x.match (temp [2]) : # l'expression négative n'est pas trouvé, on peut ajouter ce résultat res.append (temp) r = exp.search (s, r.end (gr) ) # recherche suivante return res def get_function_list_definition (s) : """trouve toutes les définitions de fonctions""" return trouve_toute_fonction (s, \ "\ndef[ ]+([a-zA-Z_][a-zA-Z_0-9]*)[ ]*[(].*[)][ ]*[:]", 0) def get_function_list_call (s) : """trouve tous les appels de fonctions""" return trouve_toute_fonction (s, \ "\n.*[=(,[{ .]([a-zA-Z_][a-zA-Z_0-9]*)(?![ ]?:)[ ]*[(].*[)]?", 0, \ "^\\n[ ]*(class|def)[ ]+function.*$") def detection_fonction_pas_appelee (file) : """retourne les couples de fonctions jamais appelées suivies du numéro de la ligne où elles sont définies""" f = open (file, "r") li = f.readlines () f.close () sfile = "".join (li) funcdef = get_function_list_definition (sfile) funccal = get_function_list_call (sfile) f2 = [ p [0] for p in funccal ] res = [] for f in funcdef : if f [0] not in f2 : ligne = sfile [:f [1][0]].count ("\n") res.append ( (f [0], ligne+2)) return res def fonction_inutile () : # ligne 63 pass if __name__ == "__main__" : file = "fonction.py" print detection_fonction_pas_appelee (file) # affiche [('fonction_inutile', 63)]
File: chap7_fichiers.tex, line 823
import datetime naissance = datetime.datetime (1975,11,8,10,0,0) jour = naissance.now () # obtient l'heure et la date actuelle print jour # affiche 2010-05-22 11:24:36.312000 age = jour - naissance # calcule une différence print age # affiche 12614 days, 1:25:10.712000
File: chap7_fichiers.tex, line 838
import calendar c = calendar.Calendar () for d in c.itermonthdays2 (1975,8) : print d
File: chap7_fichiers.tex, line 862
# coding: latin-1 st = "eé" su = u"eé" # raccourci pour su = unicode ("eé", "latin-1") # ou encore su = unicode ("eé".decode ("latin-1")) print type (st) # affiche <type 'str'> print type (su) # affiche <type 'unicode'> print len (st), ";", st # affiche 2 ; eé print len (repr (st)), ";", repr (st) # affiche 7 ; 'e\xe9' print len (su), ";", su.encode ("latin-1") # affiche 2 ; eé print len (repr (su)), ";", repr (su) # affiche 8 ; u'e\xe9'
File: chap7_fichiers.tex, line 879
import codecs f = codecs.open ("essai.txt", "r", "cp1252") # jeu Windows s = "".join (f.readlines ()) f.close () print type (s) # affiche <type 'unicode'> print s.encode ("cp1252") # pour l'afficher, # il faut convertir l'unicode en "cp1252"
File: chap7_fichiers.tex, line 923
import sys import locale # retourne le jeu de caractères par défaut print sys.getdefaultencoding () # affiche ascii # retourne le jeu de caractères du système d'exploitation print locale.getdefaultlocale() # affiche ('fr_FR', 'cp1252')
File: chap8_interface.tex, line 59
zone_texte = Tkinter.Label (text = "zone de texte")
File: chap8_interface.tex, line 63
import Tkinter # import de Tkinter root = Tkinter.Tk () # création de la fenêtre principale # ... obj = Tkinter.Label (text = "zone de texte") # ... obj.pack () # on ajoute l'objet à la fenêtre principale root.mainloop () # on affiche enfin la fenêtre principal et on attend # les événements (souris, clic, clavier)
File: chap8_interface.tex, line 79
zone_texte = Tkinter.Label (text = "zone de texte")
File: chap8_interface.tex, line 83
zone_texte = Tkinter.Label (text = "premier texte") # ... # pour changer de texte zone_texte.config (text = "second texte")
File: chap8_interface.tex, line 104
zone_texte.config (state = Tkinter.DISABLED)
File: chap8_interface.tex, line 108
zone_texte.config (state = Tkinter.NORMAL)
File: chap8_interface.tex, line 127
bouton = Tkinter.Button (text = "zone de texte")
File: chap8_interface.tex, line 131
bouton = Tkinter.Button (text = "premier texte") # ... # pour changer de texte bouton.config (text = "second texte")
File: chap8_interface.tex, line 153
bouton.config (state = Tkinter.DISABLED)
File: chap8_interface.tex, line 157
bouton.config (state = Tkinter.NORMAL)
File: chap8_interface.tex, line 167
b = Tkinter Button () im = Tkinter.PhotoImage (file = "chameau.gif") b.config (image = im)
File: chap8_interface.tex, line 192
saisie = Tkinter.Entry ()
File: chap8_interface.tex, line 196
# le premier paramètre est la position # où insérer le texte (second paramètre) saisie.insert (pos, "contenu")
File: chap8_interface.tex, line 202
contenu = saisie.get ()
File: chap8_interface.tex, line 206
# supprime le texte entre les positions pos1, pos2 saisie.delete (pos1, pos2)
File: chap8_interface.tex, line 211
saisie.delete (0, len (saisie.get ()))
File: chap8_interface.tex, line 234
saisie = Tkinter.Text ()
File: chap8_interface.tex, line 238
# le premier paramètre est la position # où insérer le texte (second paramètre) pos = "0.0" saisie.insert (pos, "première ligne\nseconde ligne")
File: chap8_interface.tex, line 245
# retourne le texte entre deux positions pos1 = "0.0" pos2 = "end" # ou Tkinter.END contenu = saisie.get (pos1, pos2)
File: chap8_interface.tex, line 252
# supprime le texte entre les positions pos1, pos2 saisie.delete (pos1, pos2)
File: chap8_interface.tex, line 257
saisie.delete ("0.0", "end") # on peut aussi utiliser # saisie.delete ("0.0", Tkinter.END)
File: chap8_interface.tex, line 267
# modifie les dimensions de la zone # width <--> largeur # height <--> hauteur en lignes saisie.config (width = 10, height = 5)
File: chap8_interface.tex, line 306
# crée un objet entier pour récupérer la valeur de la case à cocher, # 0 pour non cochée, 1 pour cochée v = Tkinter.IntVar () case = Tkinter.Checkbutton (variable = v)
File: chap8_interface.tex, line 315
v.get () # égal à 1 si la case est cochée, 0 sinon
File: chap8_interface.tex, line 321
case.select () # pour cocher case.deselect () # pour décocher
File: chap8_interface.tex, line 327
case.config (text = "case à cocher")
File: chap8_interface.tex, line 362
# crée un objet entier partagé pour récupérer le numéro du bouton radio activé v = Tkinter.IntVar () case1 = Tkinter.Radiobutton (variable = v, value = 10) case2 = Tkinter.Radiobutton (variable = v, value = 20) case3 = Tkinter.Radiobutton (variable = v, value = 30)
File: chap8_interface.tex, line 370
v.get () # retourne le numéro du bouton radio coché (ici, 10, 20 ou 30)
File: chap8_interface.tex, line 374
v.set (numero) # numéro du bouton radio à cocher # pour cet exemple, 10, 20 ou 30
File: chap8_interface.tex, line 379
case1.config (text = "premier bouton") case2.config (text = "second bouton") case3.config (text = "troisième bouton")
File: chap8_interface.tex, line 417
li = Tkinter.Listbox ()
File: chap8_interface.tex, line 423
# modifie les dimensions de la liste # width <--> largeur # height <--> hauteur en lignes li.config (width = 10, height = 5)
File: chap8_interface.tex, line 432
pos = 0 # un entier, "end" ou Tkinter.END pour insérer ce mot à la fin li.insert (pos, "première ligne")
File: chap8_interface.tex, line 439
pos1 = 0 # un entier pos2 = None # un entier, "end" ou Tkinter.END pour supprimer tous les éléments # de pos1 jusqu'au dernier li.delete (pos1, pos2 = None)
File: chap8_interface.tex, line 448
pos1 = 0 li.select_set (pos1, pos2 = None) # sélectionne tous les éléments entre les indices pos1 et # pos2 inclus ou seulement celui d'indice pos1 si pos2 == None
File: chap8_interface.tex, line 457
pos1 = 0 li.select_clear (pos1, pos2 = None) # retire la sélection de tous les éléments entre les indices # pos1 et pos2 inclus ou seulement celui d'indice pos1 si pos2 == None
File: chap8_interface.tex, line 466
sel = li.curselection ()
File: chap8_interface.tex, line 472
for i in range (0,li.size ()) : print li.get (i)
File: chap8_interface.tex, line 492
frame = Tkinter.Frame (parent) scrollbar = Tkinter.Scrollbar (frame) li = Tkinter.Listbox (frame, width = 88, height = 6, \ yscrollcommand = scrollbar.set) scrollbar.config (command = li.yview) li.pack (side = Tkinter.LEFT) scrollbar.pack (side = Tkinter.RIGHT, fill = Tkinter.Y)
File: chap8_interface.tex, line 508
li = Tkinter.Listbox (frame, width = 88, height = 6, exportselection=0)
liste avec barre de défilement
# coding: latin-1 import tkinter as Tk root = Tk.Tk () o = Tk.ScrolledListBox (root) for k in range (0,100) : o.listbox.insert (Tk.END, "ligne " + str (k)) o.pack () def print_file () : # voir chapitre sur les événements print (o.listbox.selection_get ()) # idem b = Tk.Button (root, text = "print") b.config (command = print_file) # idem b.pack () root.mainloop () # idem
liste \codesindex{ComboBox
# coding: latin-1 import tkinter as Tk root = Tk.Tk () o = Tk.ComboBox (root, label = "label") o.insert (Tk.END, "ligne 1") o.insert (Tk.END, "ligne 2") o.insert (Tk.END, "ligne 3") o.insert (Tk.END, "ligne 4") o.pack () def print_file () : # voir le chapitre sur les événéments print (o.cget ("value")) # idem b = Tk.Button (root, text = "print") b.config (command = print_file) # idem b.pack () root.mainloop () # idem
File: chap8_interface.tex, line 552
ca = Tkinter.Canvas ()
File: chap8_interface.tex, line 556
# modifie les dimensions du canevas # width <--> largeur en pixels # height <--> hauteur en pixels ca.config (width = 10, height = 5)
File: chap8_interface.tex, line 563
# dessine deux lignes du point 10,10 au point 40,100 et au point 200,60 # de couleur bleue, d'épaisseur 2 ca.create_line (10,10,40,100, 200,60, fill = "blue", width = 2) # dessine une courbe du point 10,10 au point 200,60 # de couleur rouge, d'épaisseur 2, c'est une courbe de Bézier # pour laquelle le point 40,100 sert d'assise ca.create_line (10,10, 40,100, 200,60, smooth=1, fill = "red", width = 2) # dessine un rectangle plein de couleur jaune, de bord noir et d'épaisseur 2 ca.create_rectangle (300,100,60,120, fill = "gray", width = 2) # écrit du texte de couleur noire au point 80,80 et avec la police arial ca.create_text (80,80, text = "écrire", fill = "black", font = "arial")
File: chap8_interface.tex, line 592
widget.config (state = Tkinter.DISABLED) # grisé widget.config (state = Tkinter.NORMAL) # aspect normal
File: chap8_interface.tex, line 598
l = Tkinter.Label (text = "légende")
File: chap8_interface.tex, line 604
l = Tkinter.Label () l.config (text = "légende")
File: chap8_interface.tex, line 611
Help on method configure in module Tkinter: configure(self, cnf=None, **kw) unbound Tkinter.Label method Configure resources of a widget. The values for resources are specified as keyword arguments. To get an overview about the allowed keyword arguments call the method keys.
File: chap8_interface.tex, line 624
__init__(self, master=None, cnf={}, **kw) unbound Tkinter.Label method Construct a label widget with the parent MASTER. STANDARD OPTIONS activebackground, activeforeground, anchor, background, bitmap, borderwidth, cursor, disabledforeground, font, foreground, highlightbackground, highlightcolor, highlightthickness, image, justify, padx, pady, relief, takefocus, text, textvariable, underline, wraplength WIDGET-SPECIFIC OPTIONS height, state, width
File: chap8_interface.tex, line 664
l = Tkinter.Label (text = "première ligne") l.pack () s = Tkinter.Entry () s.pack () e = Tkinter.Label (text = "seconde ligne") e.pack ()
File: chap8_interface.tex, line 686
l = Tkinter.Label (text = "première ligne") l.pack (side = Tkinter.RIGHT) s = Tkinter.Entry () s.pack (side = Tkinter.RIGHT) e = Tkinter.Label (text = "seconde ligne") e.pack (side = Tkinter.RIGHT)
File: chap8_interface.tex, line 711
s.pack_forget () # disparition s.pack () # insertion à un autre endroit
File: chap8_interface.tex, line 723
l = Tkinter.Label (text = "première ligne") l.grid (column = 0, row = 0) s = Tkinter.Entry () s.grid (column = 0, row = 1) e = Tkinter.Label (text = "seconde ligne") e.grid (column = 1, row = 0)
File: chap8_interface.tex, line 757
s.grid_forget () # disparition
File: chap8_interface.tex, line 769
l = Tkinter.Label (text = "première ligne") l.place (x=10,y=50)
File: chap8_interface.tex, line 784
f = Tkinter.Frame ()
File: chap8_interface.tex, line 790
l = Tkinter.Label (f, text = "première ligne")
File: chap8_interface.tex, line 796
f = Tkinter.Frame () l = Tkinter.Label (f, text = "première ligne") l.pack () # positionne l à l'intérieur de f s = Tkinter.Entry (f) s.pack () # positionne s à l'intérieur de f f.pack (side = Tkinter.LEFT) # positionne f à l'intérieur # de la fenêtre principale e = Tkinter.Label (text = "seconde ligne") e.pack_forget () e.pack (side = Tkinter.RIGHT) # positionne e à l'intérieur # de la fenêtre principale
File: chap8_interface.tex, line 832
root = Tkinter.Tk () # ici, on trouve le code qui définit les objets # et leur positionnement root.mainloop ()
File: chap8_interface.tex, line 856
e = Tkinter.Entry () e.pack () e.focus_set ()
Tkinter, bouton
# coding: latin-1 # la première ligne autorise les accents import Tkinter root = Tkinter.Tk () b = Tkinter.Button (text = "fonction change_legende") b.pack () def change_legende () : global b b.config (text = "nouvelle légende") b.config (command = change_legende) root.mainloop ()
File: chap8_interface.tex, line 951
w.bind (ev, fonction)
Tkinter, fonction \codesindex{bind
import Tkinter root = Tkinter.Tk () b = Tkinter.Button (text = "appuyer sur une touche") b.pack () def affiche_touche_pressee (evt) : print "--------------------------- touche pressee" print "evt.char = ", evt.char print "evt.keysym = ", evt.keysym print "evt.num = ", evt.num print "evt.x,evt.y = ", evt.x, ",", evt.y print "evt.x_root,evt.y_root = ", evt.x_root, ",", evt.y_root print "evt.widget = ", evt.widget b.bind ("<Key>", affiche_touche_pressee) b.bind ("<Button-1>", affiche_touche_pressee) b.bind ("<Motion>", affiche_touche_pressee) b.focus_set () root.mainloop ()
File: chap8_interface.tex, line 1020
evt.char = ?? evt.keysym = ?? evt.num = 1 evt.x,evt.y = 105 , 13 evt.x_root,evt.y_root = 292 , 239 evt.widget = .9261224
File: chap8_interface.tex, line 1032
evt.char = evt.keysym = Return evt.num = ?? evt.x,evt.y = 105 , 13 evt.x_root,evt.y_root = 292 , 239 evt.widget = .9261224
File: chap8_interface.tex, line 1061
b.bind ("<button-1>", affiche_touche_pressee)
File: chap8_interface.tex, line 1067
Traceback (most recent call last): File "exemple_bind.py", line 17, in ? b.bind ("<button-1>", affiche_touche_pressee) File "c:\python26\lib\lib-tk\Tkinter.py", line 933, in bind return self._bind(('bind', self._w), sequence, func, add) File "c:\python26\lib\lib-tk\Tkinter.py", line 888, in _bind self.tk.call(what + (sequence, cmd)) _tkinter.TclError: bad event type or keysym "button"
File: chap8_interface.tex, line 1083
b.bind_all ("<Button-1>", affiche_touche_pressee)
File: chap8_interface.tex, line 1097
w.unbind (ev) w.unbind_all (ev)
File: chap8_interface.tex, line 1132
m = Tkinter.Menu ()
File: chap8_interface.tex, line 1136
root.config (menu = m)
File: chap8_interface.tex, line 1140
mainmenu = Tkinter.Menu () msousmenu = Tkinter.Menu () mainmenu.add_cascade (label = "sous-menu 1", menu = msousmenu)
File: chap8_interface.tex, line 1146
def fonction1 () : .... m = Tkinter.Menu () mainmenu.add_command (label = "fonction 1", command = fonction1)
Tkinter, menu
import tkinter as Tkinter root = Tkinter.Tk () e = Tkinter.Text (width = 50, height = 10) e.pack () m = Tkinter.Menu () sm1 = Tkinter.Menu () sm2 = Tkinter.Menu () m.add_cascade (label = "sous-menu 1", menu = sm1) m.add_cascade (label = "sous-menu 2", menu = sm2) nb = 0 def affiche () : print ("fonction affiche") def calcul () : print ("fonction calcul ", 3 * 4) def ajoute_bouton () : global nb nb += 1 b = Tkinter.Button (text = "bouton " + str (nb)) b.pack () sm1.add_command (label = "affiche", command = affiche) sm1.add_command (label = "calcul", command = calcul) sm2.add_command (label = "ajoute_bouton", command = ajoute_bouton) sm2.add_command (label = "fin", command = root.destroy) root.config (menu = m, width = 200) root.title ("essai de menu") #help (Tkinter.Tk) root.mainloop ()
File: chap8_interface.tex, line 1169
m = Tkinter.Menu () m.add_command (...) m.delete (1, 2) # supprime le second intitulé # supprime les intitulés compris entre 1 et 2 exclu
File: chap8_interface.tex, line 1180
import Tkinter root = Tkinter.Tk () Tkinter.Button (text = "fin", command = root.destroy).pack () root.mainloop ()
File: chap8_interface.tex, line 1213
import Tkinter win = Tkinter.Toplevel () win.mainloop ()
File: chap8_interface.tex, line 1221
# zone_texte appartient à la fenêtre principale zone_texte = Tkinter.Label (text = "premier texte")
File: chap8_interface.tex, line 1226
# zone_texte appartient à la fenêtre top top = Tkinter.Toplevel () zone_texte = Tkinter.Label (top, text = "premier texte")
plusieurs fenêtre \codesindex{Toplevel
# coding: latin-1 import Tkinter class nouvelle_fenetre : resultat = [] def top (self) : sec = Tkinter.Toplevel () Tkinter.Label (sec, text="entrer quelque chose").pack () saisie = Tkinter.Entry (sec) saisie.pack() Tkinter.Button (sec, text = "valider", command = sec.quit).pack () sec.mainloop () nouvelle_fenetre.resultat.append ( saisie.get () ) sec.destroy () root = Tkinter.Tk() #fenetre principale a = Tkinter.Button (text = "fenêtre Toplevel", command = nouvelle_fenetre ().top) a.pack() root.mainloop() for a in nouvelle_fenetre.resultat : print "contenu ", a
sélection d'un fichier
import Tix as Tk root = Tk.Tk () def command_print () : print box.cget("value") box = Tk.FileSelectBox (root) box.config (directory="c:\\") box.pack () Tk.Button (root, text = "print", command = command_print).pack () root.mainloop ()
Tkinter, compte à rebours
import Tkinter root = Tkinter.Tk () l = Tkinter.Label (text = "0 secondes") l.pack () sec = 0 id = None def change_legende() : global l global sec global id sec += 1 l.config (text = "%d secondes" % sec) id = l.after (1000, change_legende) l.after (1000, change_legende) root.mainloop ()
File: chap8_interface.tex, line 1294
l.after_cancel (id)
\codesindex{Listbox
# coding: latin-1 import Tkinter class MaListbox (Tkinter.Listbox) : def __init__ (self, master = None, cnf={}, **kw) : Tkinter.Listbox.__init__ (self, master, cnf, **kw) self.bind ("<Motion>", self.mouvement) self.pos = None # mémoire l'ancienne position du curseur def mouvement (self, ev) : pos = self.nearest (ev.y) # nouvelle position du curseur if pos < 0 or pos >= self.size () : return if self.pos != pos : if self.pos != None : self.itemconfigure(self.pos, bg='') self.itemconfigure (pos, bg='gray') self.pos = pos root = Tkinter.Tk () b = MaListbox () b.insert ("end", "ligne 1") b.insert ("end", "ligne 2") b.insert ("end", "ligne 3") b.pack () b.focus_set () root.mainloop ()
Tkinter avec des classes
# coding: latin-1 import Tkinter as Tk class MaFenetre : def __init__ (self, win) : self.win = win self.creation () def creation (self) : b1 = Tk.Button (self.win, text="bouton 1", command=self.commande_bouton1) b2 = Tk.Button (self.win, text="bouton 2", command=self.commande_bouton2) b3 = Tk.Button (self.win, text="disparition", command=self.disparition) b1.grid (row=0, column=0) b2.grid (row=0, column=1) b3.grid (row=0, column=2) self.lab = Tk.Label (self.win, text = "-") def commande_bouton1 (self) : # on déplace l'objet lab de type Label self.lab.configure (text = "bouton 1 appuyé") self.lab.grid (row = 1, column = 0) def commande_bouton2 (self) : # on déplace l'objet lab de type Label self.lab.configure (text = "bouton 2 appuyé") self.lab.grid (row = 1, column = 1) def disparition (self) : # on fait disparaître l'objet lab de type Label self.lab.grid_forget () if __name__ == "__main__" : root = Tk.Tk () f = MaFenetre (root) root.mainloop ()
File: chap8_interface.tex, line 1332
root = Tk.Tk () f = Tk.Frame () f.pack () MaFenetre (f) # première instance g = Tk.Frame () g.pack () MaFenetre (g) # seconde instance root.mainloop ()
Tkinter, séquence d'événements
# coding: latin-1 import Tkinter as Tk class MaFenetreSeq : def __init__ (self, win) : self.win = win self.creation () self.sequence = [] def creation (self) : b1 = Tk.Button (self.win, text="bouton 1", command=self.commande_bouton1) b2 = Tk.Button (self.win, text="bouton 2", command=self.commande_bouton2) b3 = Tk.Button (self.win, text="remise à zéro", command=self.zero) b1.grid (row=0, column=0) b2.grid (row=0, column=1) b3.grid (row=0, column=2) self.lab = Tk.Label (self.win, text = "-") def commande_bouton1 (self) : # ajoute 1 à la liste self.sequence self.sequence.append (1) self.controle () def commande_bouton2 (self) : # ajoute 2 à la liste self.sequence self.sequence.append (2) self.controle () def zero (self) : # on vide la liste self.sequence self.sequence = [] self.lab.grid_forget () def controle (self) : # on compare la liste sequence à [1,2,1] et [2,2,1,1] # dans ce cas, on fait apparaître l'objet lab l = len (self.sequence) if l >= 3 and self.sequence [l-3:] == [1,2,1] : self.lab.configure (text = "séquence 1 2 1") self.lab.grid (row = 1, column = 0) elif l >= 4 and self.sequence [l-4:] == [2,2,1,1] : self.lab.configure (text = "séquence 2 2 1 1") self.lab.grid (row = 1, column = 1) if __name__ == "__main__" : root = Tk.Tk () f = MaFenetreSeq (root) root.mainloop ()
utilisation de messages personnalisés
# coding: latin-1 import Tkinter def affiche_touche_pressee () : root.event_generate ("<<perso>>", rooty = -5) def perso (evt) : print "perso", evt.y_root root = Tkinter.Tk () b = Tkinter.Button (text = "clic", \ command = affiche_touche_pressee) b.pack () root.bind ("<<perso>>", perso) # on intercepte un événement personnalisé root.mainloop ()
premier thread
# coding: cp1252 import threading, time class MonThread (threading.Thread) : def __init__ (self, jusqua) : # jusqua = donnée supplémentaire threading.Thread.__init__(self)# ne pas oublier cette ligne # (appel au constructeur de la classe mère) self.jusqua = jusqua # donnée supplémentaire ajoutée à la classe def run (self) : for i in range (0, self.jusqua) : print "thread ", i time.sleep (0.1) # attend 100 millisecondes sans rien faire # facilite la lecture de l'affichage m = MonThread (1000) # crée le thread m.start () # démarre le thread, # l'instruction est exécutée en quelques millisecondes # quelque soit la durée du thread for i in range (0,1000) : print "programme ", i time.sleep (0.1) # attend 100 millisecondes sans rien faire # facilite la lecture de l'affichage
File: chap9_thread.tex, line 59
programme 0 thread 0 thread 1 programme 1 thread 2 programme 2 programme 3 thread 3 programme 4 thread 4 ...
deux threads secondaires
# coding: cp1252 import threading, time class MonThread (threading.Thread) : def __init__ (self, jusqua, s) : threading.Thread.__init__ (self) self.jusqua = jusqua self.s = s def run (self) : for i in range (0, self.jusqua) : print "thread ", self.s, " : ", i time.sleep (0.1) m = MonThread (1000, "A") m.start () m2 = MonThread (1000, "B") # crée un second thread m2.start () # démarre le thread, for i in range (0,1000) : print "programme ", i time.sleep (0.1)
File: chap9_thread.tex, line 82
thread A : 0 programme 0 thread B : 0 thread A : 1 thread B : 1 programme 1 thread B : 2 thread A : 2 ...
(1)
# coding: latin-1 import threading, time class MonThread (threading.Thread) : def __init__ (self, jusqua) : threading.Thread.__init__ (self) self.jusqua = jusqua self.etat = False # l'état du thread est soit False (à l'arrêt) # soit True (en marche) def run (self) : self.etat = True # on passe en mode marche for i in range (0, self.jusqua) : print "thread itération ", i time.sleep (0.1) self.etat = False # on revient en mode arrêt m = MonThread (10) # crée un thread m.start () # démarre le thread, print "début" while m.etat == False : # on attend que le thread démarre time.sleep (0.1) # voir remarque ci-dessous while m.etat == True : # on attend que le thread s'arrête # il faut introduire l'instruction time.sleep pour temporiser, il n'est pas # nécessaire de vérifier sans cesse que le thread est toujours en marche # il suffit de le vérifier tous les 100 millisecondes # dans le cas contraire, la machine passe son temps à vérifier au lieu # de se consacrer à l'exécution du thread time.sleep (0.1) print "fin"
(2)
# coding: latin-1 import threading, time class MonThread (threading.Thread) : def __init__ (self, jusqua, event) : # event = objet Event threading.Thread.__init__ (self) # = donnée supplémentaire self.jusqua = jusqua self.event = event # on garde un accès à l'objet Event def run (self) : for i in range (0, self.jusqua) : print "thread itération ", i time.sleep (0.1) self.event.set () # on indique qu'on a fini : # on active l'object self.event print "début" event = threading.Event () # on crée un objet de type Event event.clear () # on désactive l'ojet Event m = MonThread (10, event) # crée un thread m.start () # démarre le thread, event.wait () # on attend jusqu'à ce que l'objet soit activé # event.wait (0.1) : n'attend qu'un print "fin" # seulement 1 dizième de seconde
File: chap9_thread.tex, line 136
m.start () while not event.isSet (): print "j'attends" event.wait (0.1) print "fin"
partager des données
# coding: latin-1 import threading, time message = "" verrou = threading.Lock () def ajoute (c) : global message # message et verrou sont des variables gloables global verrou # pour ne pas qu'elle disparaisse dès la fin de la fonction verrou.acquire () # on protège ce qui suit (*) s = message + c # instructions jamais exécutée simultanément par 2 threads time.sleep (0.001) # time.sleep : pour exagérer le défaut de synchronisation message = s # si verrou n'est pas utilisé verrou.release () # on quitte la section protégée (*) class MonThread (threading.Thread) : def __init__ (self, jusqua, event, s) : threading.Thread.__init__ (self) self.jusqua = jusqua self.s = s self.event = event def run (self) : for i in range (0, self.jusqua) : ajoute (self.s) time.sleep (0.003) self.event.set () print "début" # synchronisation attente e1 = threading.Event () e2 = threading.Event () e1.clear () e2.clear () m1 = MonThread (10, e1, "1") # crée un thread m1.start () # démarre le thread, m2 = MonThread (10, e2, "2") # crée un second thread m2.start () # démarre le second thread, e1.wait () e2.wait () print "longueur ", len(message) # affiche 20 print "message = ", message # affiche quelque chose comme 12212112211212121221
thread et interface graphique
# coding: latin-1 import threading, time, random, copy # définition du thread class MonThread (threading.Thread) : def __init__ (self, win, res) : threading.Thread.__init__ (self) self.win = win # on mémorise une référence sur la fenêtre self.res = res def run (self) : for i in range (0, 10) : print "thread ", i time.sleep (0.1) # afin que le thread retourne un résultat # self.res désigne thread_resultat qui reçoit un nombre de plus h = random.randint (0,100) self.res.append (h) # on lance un événement <<thread_fini>> à la fenêtre principale # pour lui dire que le thread est fini, l'événement est ensuite # géré par la boucle principale de messages # on peut transmettre également le résultat lors de l'envoi du message # en utilisant un attribut de la classe Event pour son propre compte self.win.event_generate ("<<thread_fini>>", x = h) thread_resultat = [] def lance_thread () : global thread_resultat # fonction appelée lors de la pression du bouton # on change la légnde de la zone de texte text .config (text = "thread démarré") text2.config (text = "thread démarré") # on désactive le bouton pour éviter de lancer deux threads en même temps bouton.config (state = TK.DISABLED) # on lance le thread m = MonThread (root, thread_resultat) m.start () def thread_fini_fonction (e) : global thread_resultat # fonction appelée lorsque le thread est fini print "la fenêtre sait que le thread est fini" # on change la légende de la zone de texte text .config (text = "thread fini + résultat " + str (thread_resultat)) text2.config (text = "thread fini + résultat (e.x) " + str (e.x)) # on réactive le bouton de façon à pouvoir lancer un autre thread bouton.config (state = TK.NORMAL) import Tkinter as TK # on crée la fenêtre root = TK.Tk () bouton = TK.Button (root, text = "thread départ", command = lance_thread) text = TK.Label (root, text = "rien") text2 = TK.Label (root, text = "rien") bouton.pack () text.pack () text2.pack () # on associe une fonction à un événement <<thread_fini>> propre au programme root.bind ("<<thread_fini>>", thread_fini_fonction) # on active la boucle principale de message root.mainloop ()
joueurs asynchrones
# coding: latin-1 import threading, time, Queue, random class Joueur (threading.Thread) : # initialisation def __init__ (self, nom, e, nb = 1000, temps = 0.1) : threading.Thread.__init__(self) self.nb = nb self.queue = Queue.Queue () self.nom = nom self.event = e self.temps = temps # temps de réflexion def Joueur (self, autre_joueur) : self.autre = autre_joueur # méthodes : l'adversaire m'envoie un message def Joue (self, nombre) : self.queue.put_nowait ( ("essai", nombre) ) def Dessus (self, nombre) : self.queue.put_nowait ( ("dessus", nombre) ) def Dessous (self, nombre) : self.queue.put_nowait ( ("dessous", nombre) ) def Gagne (self, nombre) : while not self.queue.empty () : try :self.queue.get () except : pass self.queue.put ( ("gagne", nombre) ) # je joue def run (self) : x = random.randint (0,self.nb) print self.nom, " : je joue (", x, ")" i = 0 a = 0 b = self.nb while True : time.sleep (self.temps) try : m,n = self.queue.get_nowait () # désynchronisé #m,n = self.queue.get (timeout = 0.5)# l'un après l'autre except Queue.Empty : m,n = None,None # traitement du message --> réponse à l'adversaire if m == "essai" : if n == x : self.autre.Gagne (n) print self.nom, " : j'ai perdu après ", i, " essais" break elif n < x : self.autre.Dessus (n) else : self.autre.Dessous (n) elif m == "dessus" : a = max (a, n+1) continue # assure l'équité en mode l'un après l'autre elif m == "dessous" : b = min (b, n-1) continue # assure l'équité en mode l'un après l'autre elif m == "gagne" : print self.nom, " : j'ai gagné en ", i, " essais, solution ", n break # on fait une tentative if a == b : n = a else : n = random.randint (a,b) self.autre.Joue (n) i += 1 print self.nom, " : je tente ", n, " écart ", b-a, \ " à traiter ", self.queue.qsize () # fini print self.nom, " : j'arrête" self.event.set () # on crée des verrous pour attendre la fin de la partie e1 = threading.Event () e2 = threading.Event () e1.clear () e2.clear () # création des joueurs A = Joueur ("A", e1, 1000, temps = 0.1) B = Joueur ("B", e2, 1000, temps = 0.3) # chaque joueur sait qui est l'autre A.Joueur (B) B.Joueur (A) # le jeu commence A.start () B.start () # on attend la fin de la partie e1.wait () e2.wait ()
File: chap9_thread.tex, line 274
A : je joue ( 8 ) B : je joue ( 569 ) A : je tente 42 écart 1000 à traiter 0 A : je tente 791 écart 1000 à traiter 0 ... A : je tente 528 écart 62 à traiter 0 B : je tente 20 écart 43 à traiter 57 A : je tente 508 écart 62 à traiter 0 A : je tente 548 écart 62 à traiter 0 B : je tente 8 écart 43 à traiter 59 A : j'ai perdu après 67 essais A : j'arrête B : j'ai gagné en 23 essais, solution 8 B : j'arrête
File: montant_num.tex, line 35
import string s = "dix-neuf" l = s.replace ("-", " ") l = string.replace ("-", " ")
File: montant_num_cor.tex, line 10
# coding: latin-1 def lire_separation(s): """divise un nombre littéral en mots""" s = s.replace ("-", " ") # on remplace les tirets par des espaces # pour découper en mots même # les mots composés return s.split ()
File: montant_num_cor.tex, line 24
import re def lire_separation(s): """divise un nombre littéral en mots avec les expressions régulières""" return re.compile ("[- ]").split (s)
File: montant_num_cor.tex, line 35
def valeur_mot (s) : """convertit numériquement les nombres inclus entre 0 et 16 inclus, 20, 30, 40, 50, 60, s est une chaîne de caractères, le résultat est entier""" if s == "zéro" : return 0 elif s == "un" : return 1 elif s == "deux" : return 2 elif s == "trois" : return 3 elif s == "quatre" : return 4 elif s == "cinq" : return 5 elif s == "six" : return 6 elif s == "sept" : return 7 elif s == "huit" : return 8 elif s == "neuf" : return 9 elif s == "dix" : return 10 elif s == "onze" : return 11 elif s == "douze" : return 12 elif s == "treize" : return 13 elif s == "quatorze" : return 14 elif s == "quinze" : return 15 elif s == "seize" : return 16 elif s == "vingt" : return 20 elif s == "trente" : return 30 elif s == "quarante" : return 40 elif s == "cinquante" : return 50 elif s == "soixante" : return 60 else : return 0 # ce cas ne doit normalement pas # se produire
File: montant_num_cor.tex, line 69
def valeur_mot (s) : dico = {'cinquante': 50, 'quarante': 40, 'onze': 11, 'huit': 8, 'six': 6, \ 'quinze': 15, 'trente': 30, 'douze': 12, 'cinq': 5, 'deux': 2, \ 'quatorze': 14, 'neuf': 9, 'soixante': 60, 'quatre': 4, \ 'zéro': 0, 'treize': 13, 'trois': 3, 'seize': 16, \ 'vingt': 20, 'un': 1, 'dix': 10, 'sept': 7} if s not in dico : return 0 # cas imprévu, on peut résumer ces deux lignes else : return dico [s] # par return dico.get (s, 0)
File: montant_num_cor.tex, line 85
def lire_dizaine_liste(s): """convertit une liste de chaînes de caractères dont juxtaposition forme un nombre littéral compris entre 0 et 99""" r = 0 # contient le résultat final dizaine = False # a-t-on terminé le traitement des dizaines ? for mot in s: n = lire_unite (mot) if n == 20 : if not dizaine and r > 0 and r != 60 : r *= n # cas 80 dizaine = True else : r += n else : r += n return r
File: montant_num_cor.tex, line 106
def lire_dizaine(s): li = lire_separation (s) return lire_dizaine_liste (li)
File: montant_num_cor.tex, line 116
def ecrit_unite (x): """convertit un nombre compris inclus entre 0 et 16 inclus, 20, 30, 40, 50, 60 en une chaîne de caractères""" if x == 0: return "zéro" elif x == 1: return "un" elif x == 2: return "deux" elif x == 3: return "trois" elif x == 4: return "quatre" elif x == 5: return "cinq" elif x == 6: return "six" elif x == 7: return "sept" elif x == 8: return "huit" elif x == 9: return "neuf" elif x == 10: return "dix" elif x == 11: return "onze" elif x == 12: return "douze" elif x == 13: return "treize" elif x == 14: return "quatorze" elif x == 15: return "quinze" elif x == 16: return "seize" elif x == 20: return "vingt" elif x == 30: return "trente" elif x == 40: return "quarante" elif x == 50: return "cinquante" elif x == 60: return "soixante" elif x == 70: return "soixante-dix" elif x == 80: return "quatre-vingt" elif x == 90: return "quatre-vingt-dix" else : return "zéro"
File: montant_num_cor.tex, line 150
def mot_valeur (x): """convertit un nombre compris inclus entre 0 et 16 inclus, 20, 30, 40, 50, 60 en une chaîne de caractères""" dico = {'cinquante': 50, 'quarante': 40, 'onze': 11, 'huit': 8, 'six': 6, \ 'quinze': 15, 'trente': 30, 'douze': 12, 'cinq': 5, 'deux': 2, \ 'quatorze': 14, 'neuf': 9, 'soixante': 60, 'quatre': 4, \ 'zéro': 0, 'treize': 13, 'trois': 3, 'seize': 16, \ 'vingt': 20, 'un': 1, 'dix': 10, 'sept': 7} inv = {} for k,v in dico.iteritems () : inv [v] = k inv [70] = "soixante-dix" inv [80] = "quatre-vingt" inv [90] = "quatre-vingt-dix" return inv [x]
File: montant_num_cor.tex, line 171
def ecrit_dizaine(x): """convertit un nombre entre 0 et 99 sous sa forme littérale""" if x <= 16 : return ecrit_unite(x) s = "" dizaine = x / 10 unite = x % 10 s = mot_valeur (dizaine*10) s += " " s += mot_valeur (unite) return s
File: montant_num_cor.tex, line 190
for i in xrange(0,100): s = ecrit_dizaine (i) j = lire_dizaine (s) if i != j : print "erreur ", i, " != ", j, " : ", s
conversion de montant littéral en numérique
# coding: cp1252 import string def lire_separation(s): """divise un nombre littéral en mots""" s = string.replace (s, "-", " ") return string.split (s) def lire_separation(s): """divise un nombre littéral en mots""" return re.compile ("[- ]").split (s) def valeur_mot (s) : """convertit numériquement les nombres inclus entre 0 et 16 inclus, 20, 30, 40, 50, 60, s est une chaîne de caractères, le résultat est entier""" if s == "zéro" : return 0 elif s == "un" : return 1 elif s == "deux" : return 2 elif s == "trois" : return 3 elif s == "quatre" : return 4 elif s == "cinq" : return 5 elif s == "six" : return 6 elif s == "sept" : return 7 elif s == "huit" : return 8 elif s == "neuf" : return 9 elif s == "dix" : return 10 elif s == "onze" : return 11 elif s == "douze" : return 12 elif s == "treize" : return 13 elif s == "quatorze" : return 14 elif s == "quinze" : return 15 elif s == "seize" : return 16 elif s == "vingt" : return 20 elif s == "trente" : return 30 elif s == "quarante" : return 40 elif s == "cinquante" : return 50 elif s == "soixante" : return 60 else : return 0 def valeur_mot (s) : """convertit numériquement les nombres inclus entre 0 et 16 inclus, 20, 30, 40, 50, 60, s est une chaîne de caractères, le résultat est entier""" dico = {'cinquante': 50, 'quarante': 40, 'onze': 11, 'huit': 8, 'six': 6, \ 'quinze': 15, 'trente': 30, 'douze': 12, 'cinq': 5, 'deux': 2, \ 'quatorze': 14, 'neuf': 9, 'soixante': 60, 'quatre': 4, \ 'zéro': 0, 'treize': 13, 'trois': 3, 'seize': 16, \ 'vingt': 20, 'un': 1, 'dix': 10, 'sept': 7} if s not in dico : return 0 else : return dico [s] def lire_dizaine_liste(s): """convertit une liste de chaîne de caractères dont juxtaposition forme un nombre littéral compris entre 0 et 99""" r = 0 # contient le résultat final dizaine = False # a-t-on terminé le traitement des dizaines ? for mot in s: n = valeur_mot (mot) if n == 20 : if not dizaine and r > 0 and r != 60: r *= n # cas 80 dizaine = True else : r += n else : r += n return r def lire_dizaine(s): s2 = s.replace ("-", " ") li = string.split (s2) return lire_dizaine_liste (li) def mot_valeur (x): """convertit un nombre compris inclus entre 0 et 16 inclus, 20, 30, 40, 50, 60 en une chaîne de caractères""" if x == 0: return "zéro" elif x == 1: return "un" elif x == 2: return "deux" elif x == 3: return "trois" elif x == 4: return "quatre" elif x == 5: return "cinq" elif x == 6: return "six" elif x == 7: return "sept" elif x == 8: return "huit" elif x == 9: return "neuf" elif x == 10: return "dix" elif x == 11: return "onze" elif x == 12: return "douze" elif x == 13: return "treize" elif x == 14: return "quatorze" elif x == 15: return "quinze" elif x == 16: return "seize" elif x == 20: return "vingt" elif x == 30: return "trente" elif x == 40: return "quarante" elif x == 50: return "cinquante" elif x == 60: return "soixante" elif x == 70: return "soixante-dix" elif x == 80: return "quatre-vingt" elif x == 90: return "quatre-vingt-dix" else : return "zéro" def mot_valeur (x): """convertit un nombre compris inclus entre 0 et 16 inclus, 20, 30, 40, 50, 60 en une chaîne de caractères""" dico = {'cinquante': 50, 'quarante': 40, 'onze': 11, 'huit': 8, 'six': 6, \ 'quinze': 15, 'trente': 30, 'douze': 12, 'cinq': 5, 'deux': 2, \ 'quatorze': 14, 'neuf': 9, 'soixante': 60, 'quatre': 4, \ 'zéro': 0, 'treize': 13, 'trois': 3, 'seize': 16, \ 'vingt': 20, 'un': 1, 'dix': 10, 'sept': 7} inv = {} for k,v in dico.iteritems () : inv [v] = k inv [70] = "soixante-dix" inv [80] = "quatre-vingt" inv [90] = "quatre-vingt-dix" return inv [x] def ecrit_dizaine(x): """convertit un nombre entre 0 et 99 sous sa forme littérale""" if x <= 16: return mot_valeur (x) s = "" dizaine = x / 10 unite = x % 10 s = mot_valeur (dizaine*10) s += " " s += mot_valeur (unite) return s for i in xrange(0,100): s = ecrit_dizaine (i) j = lire_dizaine (s) if i != j : print "erreur ", i, " != ", j, " : ", s
(1)
def pion_prendre(i,j,damier): c = damier [i][j] if c == 0: return False # case vide, impossible de prendre c = 3 - c # couleur de l'adversaire if damier [i-1][j-1] == c : # s'il y a un pion adverse en haut à gauche if damier [i-2][j-2] == 0 : # si la case d'après en diagonale est vide return True # on peut prendre # on répète ce test pour les trois autres cases if damier [i-1][j+1] == c and damier [i-2][j+2] == 0: return True if damier [i+1][j-1] == c and damier [i+2][j-2] == 0: return True if damier [i+1][j+1] == c and damier [i+2][j+2] == 0: return True # si tous les tests ont échoué, on ne peut pas prendre return False
(2)
def pion_prendre(i,j,damier): c = damier [(i,j)] # ou encore damier [i,j] if c == 0: return False # case vide, impossible de prendre c = 3 - c # couleur de l'adversaire # test pour une prise du pion dans les quatre cases voisines if damier [i-1,j-1] == c and damier [i-2,j-2] == 0: return True if damier [i-1,j+1] == c and damier [i-2,j+2] == 0: return True if damier [i+1,j-1] == c and damier [i+2,j-2] == 0: return True if damier [i+1,j+1] == c and damier [i+2,j+2] == 0: return True # si tous les tests ont échoué, on ne peut pas prendre return False
(3)
def pion_prendre(i,j,damier): c = damier [10*i+j] if c == 0: return False # case vide, impossible de prendre c = 3 - c # couleur de l'adversaire # test pour une prise du pion dans les quatre cases voisines if damier [10*(i-1)+j-1] == c and damier [10*(i-2)+j-2] == 0: return True if damier [10*(i-1)+j+1] == c and damier [10*(i-2)+j+2] == 0: return True if damier [10*(i+1)+j-1] == c and damier [10*(i+2)+j-2] == 0: return True if damier [10*(i+1)+j+1] == c and damier [10*(i+2)+j+2] == 0: return True return False
(4)
def pion_prendre(i,j,damier): c = damier [i][j] if c == 0: return False # case vide, impossible de prendre c = 3 - c # couleur de l'adversaire # on répète ce test pour les trois autres cases if i >= 2 and j >= 2 and \ damier [i-1][j-1] == c and damier [i-2][j-2] == 0: return True if i >= 2 and j < len (damier)-2 and \ damier [i-1][j+1] == c and damier [i-2][j+2] == 0: return True if i < len (damier)-2 and j >= 2 and \ damier [i+1][j-1] == c and damier [i+2][j-2] == 0: return True if i < len (damier)-2 and j < len (damier)-2 and \ damier [i+1][j+1] == c and damier [i+2][j+2] == 0: return True return False
File: partie_dames.tex, line 98
if c <= 0 : return False # au lieu de if c == 0 : return False
File: partie_dames.tex, line 109
damier [(i-1,j-1)] # est équivalent à damier [ i-1,j-1 ] # cette ligne
File: langue_fa_cor.tex, line 12
def lit_fichier (nom) : f = open (nom, "r") # ouverture du fichier l = f.read () # on récupère le contenu f.close () # on ferme le fichier return l # on retourne le contenu
File: langue_fa_cor.tex, line 22
import urllib # import du module urllib def lit_url (nom) : f = urllib.urlopen (nom) # on ouvre l'url res = f.read () # on lit son contenu f.close () # on termine la lecture return res # on retourne le résultat
File: langue_fa_cor.tex, line 32
def lit (texte) : if texte.startswith ("http") : s = lit_url (texte) # Internet else : s = lit_fichier (texte) # fichier texte return s s = lit ("hugo.txt")
File: langue_fa_cor.tex, line 43
def lit (texte) : try : s = lit_fichier (texte) # fichier texte return s except : # si cela ne marche pas, s = lit_url (texte) # on suppose que texte return s # est une adresse Internet s = lit ("hugo.txt")
File: langue_fa_cor.tex, line 57
def compte_lettre_count (texte) : texte = texte.upper () # pour éviter les accents res = { } # résultat, vide pour le moment for c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" : # pour tout l'alphabet res [c] = texte.count (c) # on compte les occurrences de c return res
File: langue_fa_cor.tex, line 68
def compte_lettre (texte) : texte = texte.upper () # pour éviter les accents res = { } # résultat, vide pour le moment for c in texte : # pour tous les caractères du texte if not("A" <= c <= "Z") : continue # si ce n'est pas une lettre, on passe if c not in res : res [c] = 1 # si elle n'est pas là, on lui affecte 1 else : res [c] += 1 # sinon, on augmente son nombre d'apparitions return res
File: langue_fa_cor.tex, line 83
def comparaison () : s = lit_fichier ("hugo.txt") compte_lettre_count (s) # on ne mémorise pas les résultats compte_lettre (s) # car on souhaite mesurer le temps passé import profile # import du module profile profile.run ("comparaison()") # mesure du temps passé dans la fonction # comparaison et les fonctions qu'elle appelle
File: langue_fa_cor.tex, line 96
ncalls tottime percall cumtime percall filename:lineno(function) 1 0.160 0.160 0.174 0.174 langue.py:19(compte_lettre) 1 0.000 0.000 0.017 0.017 langue.py:31(compte_lettre_count) 1 0.000 0.000 0.190 0.190 langue.py:43(comparaison)
File: langue_fa_cor.tex, line 117
ncalls tottime percall cumtime percall filename:lineno(function) 1 0.120 0.120 0.133 0.133 langue.py:19(compte_lettre) 1 0.002 0.002 0.082 0.082 langue.py:32(compte_lettre_count)
File: langue_fa_cor.tex, line 143
def compte_lettre (texte) : # ... s = sum (res.values ()) for k in res : res [k] = float (res [k]) / s return res
File: langue_fa_cor.tex, line 169
# le dernier jour d'un condamné c1 = compte_lettre (lit_url ("http://www.gutenberg.org/dirs/etext04/8ldrj10.txt")) # the man who laughs c2 = compte_lettre (lit_url ("http://www.gutenberg.org/files/12587/12587-8.txt")) car = c1.keys () car.sort () for k in car : print k, " : ", "% 2.2f" % (c1 [k] * 100), "%", " % 2.2f" % (c2 [k] * 100), "%"
File: langue_fa_cor.tex, line 184
def langue_lettre (texte) : if "http" in texte : s = lit_url (texte) # cas URL else : s = lit_fichier (texte) # cas fichier c = compte_lettre (s) # on compte les lettres return c ["W"], c ["H"] # on retourne deux fréquences
File: langue_fa_cor.tex, line 194
def langue_lettre (texte) : ... # lignes inchangées return c.get ("W", 0.0), c.get ("H", 0.0) # on retourne deux fréquences
File: langue_fa_cor.tex, line 202
def curve (li) : cx,cy = [], [] for l in li : # pour tous les textes de la liste x,y = langue_lettre (l) # coordonnées d'un texte, fréquence W et H cx.append (x) # on ajoute x à la liste des abscisses cy.append (y) # on ajoute y à la liste des ordonnées return cx,cy
File: langue_fa_cor.tex, line 215
frcx,frcy = curve (fr) # on récupère les coordonnées des textes français encx,ency = curve (en) # on récupère les coordonnées des textes anglais import pylab # import du module matplotlib pylab.plot (frcx, frcy, "rx",ms=10,\ mew=2.5) # on trace la courbe des textes français pylab.plot (encx, ency, "bv") # on trace la courbe des textes anglais pylab.legend (("francais", "anglais"), loc=2) # légende (sans accent) pylab.title ("langue") # titre pylab.xlabel ("frequence de W") # légende de l'axe des abscisses pylab.ylabel ("frequence de H") # légende de l'axe des ordonnées pylab.savefig ("graphe.png") # enregistrement sous forme d'image pylab.show () # on fait apparaître le graphique
File: langue_fa_cor.tex, line 244
def est_anglais (texte) : w,h = langue_lettre (texte) return w > 0.01
File: langue_fa_cor.tex, line 281
<a href="http://...."> texte qui apparaît à l'écran </a>
File: langue_fa_cor.tex, line 289
import urllib # pour accéder une adresse internet import re # pour traiter les expressions régulières def list_url (site, root, nbpage = 100) : # expression régulières # tous les liens commençant par root et entre guillemets # exemple : "http://www.lemonde.fr/index,0.26.html" # on place entre parenthèses la partie intéressante : # c'est-à-dire tout ce qu'il y a entre les guillemets s = "\"(" + root + "[-_~a-zA-Z0-9/.?,]*?)\"" exp = re.compile (s, re.IGNORECASE) res = [ ] # résultat pile = [ site ] # page à explorer while len (pile) > 0 and len (res) < nbpage : # on bascule toutes les pages de pile vers res for u in pile : if u not in res : res.append (u) u = pile.pop () # on s'intéresse à la prochaine page try : f = urllib.urlopen (u) # accès à l'url text = f.read () # on lit son contenu f.close () # fin de l'accès liens = exp.findall (text) # recherche de tous les liens for u in liens : if u in pile or u in res : # on passe au suivant si continue # déjà vu # on enlève les images et autres fichiers indésirables if ".gif" in u or ".png" in u or ".jpg" in u : continue if ".cs" in u or ".css" in u or ".js" in u : continue # on ajoute le liens à la liste des liens à explorer pile.append (u) except IOError, exc: print "problème avec url ", u continue return res
File: langue_fa_cor.tex, line 340
url = "http://www.lemonde.fr/" # un journal français res = list_url (url, url) for r in res : print r url = "http://www.nytimes.com/" # un journal américain res = list_url (url, url) for r in res : print r
File: langue_fa_cor.tex, line 374
import mdp,copy,numpy nbfr,nben = len (fr), len (en) all = numpy.array (fr + en) # construction du nuage de points node = mdp.nodes.PCANode() # ACP node.train (all) # construction de l'ACP y = node (all) # on peut aussi écrire y = mdp.pca (all) # obtention des coordonnées des points dans le plan de projection frcx = [ y [i,0] for i in range (0, nbfr) ] frcy = [ y [i,1] for i in range (0, nbfr) ] encx = [ y [i,0] for i in range (nbfr, nbfr + nben) ] ency = [ y [i,1] for i in range (nbfr, nbfr + nben) ] # dessin des points dans le plan de projection # c'est le même code que précédemment # ...
File: langue_fa_cor.tex, line 405
# même début que le programme précédent allfr = numpy.array (fr) # points français allen = numpy.array (en) # points anglais node = mdp.nodes.FDANode () node.train (allfr, "fr") node.train (allen, "en") node.stop_training () node.train (allfr, "fr") node.train (allen, "en") y = node (all)
détection automatique de la langue d'un texte
# coding: latin-1 def lit_fichier (nom) : """lit un fichier texte et retourne une chaine de caracteres incluant tout son contenu""" f = open (nom, "r") l = f.readlines () f.close () l = [ i.strip (" \n\r") for i in l ] return "".join (l) def lit_url (nom) : import urllib f = urllib.urlopen (nom) res = f.read () f.close () return res.replace ("\n", "").replace ("\r", "") def compte_lettre1 (texte) : texte = texte.upper () res = { } for c in texte : if not ("A" <= c <= "Z") : continue if c not in res : res [c] = 1 else : res [c] += 1 s = sum (res.values ()) if s > 0 : for k in res : res [k] = float (res [k]) / float (s) return res def compte_lettre2 (texte) : texte = texte.upper () res = { } for c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" : #for i in xrange (32,256) : # c = chr (i) res [c] = texte.count (c) s = sum (res.values ()) if s > 0 : for k in res : res [k] = float (res [k]) / float (s) return res def compte_lettre (texte) : res = compte_lettre1 (texte) res = compte_lettre2 (texte) return res if False : texte = lit_url ("http://www.gutenberg.org/dirs/etext04/8ldrj10.txt") def compteprofile () : for i in range (0,100) : compte_lettre (texte) import profile profile.run ('compteprofile ()') import sys sys.exit (0) def langue_lettre (texte) : if "http" in texte : s = lit_url (texte) else : s = lit_fichier (texte) s = s.replace ("www", "") s = s.replace ("http", "").replace (".htm", "") s = s.replace ("href", "") c = compte_lettre (s) return c.get ("W", 0.0), c.get ("H", 0.0) def langue_lettre4 (texte) : if "http" in texte : s = lit_url (texte) else : s = lit_fichier (texte) s = s.replace ("www", "") s = s.replace ("http", "").replace (".htm", "") s = s.replace ("href", "") c = compte_lettre (s) return c.get ("H", 0.0), c.get ("U", 0.0), c.get ("W", 0.0), c.get ("Y", 0.0) def curve (li) : cx,cy = [], [] for l in li : #print "processing ", l x,y = langue_lettre (l) print len (cx), "-", x,y,l cx.append (x) cy.append (y) print cx, cy return cx,cy def curve4 (li) : all = [] for l in li : #print "processing ", l x,y,z,t = langue_lettre4 (l) all.append ( [x,y,z,t] ) print len (all), "-", l return all if False : #s2 = lit_fichier ("hugo_the_man_who_laugh.txt") #c2 = compte_lettre (s2) #s3 = lit_fichier ("hugo_legend_siecle_francais.txt") #c3 = compte_lettre (s3) # le dernier jour d'un condamné s1 = lit_url ("http://www.gutenberg.org/dirs/etext04/8ldrj10.txt") c1 = compte_lettre (s1) # the man who laughs s2 = lit_url ("http://www.gutenberg.org/files/12587/12587-8.txt") c2 = compte_lettre (s2) car = c1.keys () car.sort () for k in car : print k, " : ", "% 2.2f" % (c1 [k] * 100), "%", print " % 2.2f" % (c2 [k] * 100), "%" if False : fr = [] en = [] fr.append ("http://www.gutenberg.org/dirs/etext04/8ldrj10.txt") en.append ("http://www.gutenberg.org/files/12587/12587-8.txt") fr.append ("http://www.gutenberg.org/files/17489/17489-8.txt") en.append ("http://www.gutenberg.org/dirs/etext98/2ws2610.txt") fr.append ("http://www.gutenberg.org/files/2998/2998-8.txt") fr.append ("http://www.gutenberg.org/dirs/etext03/zadig10.txt") en.append ("http://www.gutenberg.org/files/4300/4300-8.txt") en.append ("http://www.gutenberg.org/files/174/174.txt") if True : f = open ("lemonde.txt", "r") fr = f.readlines () f.close () fr = [ l.strip (" \n\t") for l in fr ] #fr = fr [:100] f = open ("nytimes.txt", "r") en = f.readlines () f.close () en = [ l.strip (" \n\t") for l in en ] #en = en [:100] allfr = curve4 (fr) allen = curve4 (en) import pickle f = open ("data.bin", "wb") pickle.dump (allfr, f) pickle.dump (allen, f) f.close () stop frcx,frcy = curve (fr) encx,ency = curve (en) print len (frcx), len (frcy) print len (encx), len (ency) f = open ("curve.txt", "w") f.write (str (frcx) + "\n") f.write (str (frcy) + "\n") f.write (str (encx) + "\n") f.write (str (ency) + "\n") f.close () import pylab pylab.plot (frcx, frcy, "rx",ms=5) pylab.plot (encx, ency, "bo") pylab.legend ((r"francais", "anglais"), loc=2) pylab.title ("langue") pylab.xlabel ("frequence de W") pylab.ylabel ("frequence de H") pylab.show ()
File: carre_magique.tex, line 23
class CarreMagique : def __init__ (self, nb) : self.nb = nb m = [ [9, 3, 3], [ 4,5,6] , [3,8,2] ]
File: carre_magique.tex, line 41
def __str__ (self) : s = "" s += str (self.nb [0][0]) return s
File: carre_magique.tex, line 68
a = calcul1 (3) b = calcul2 (a) c = calcul3 (b) # c résultat souhaité et affiché
File: carre_magique_cor.tex, line 9
cm = CarreMagique (m)
File: carre_magique_cor.tex, line 16
<__main__.CarreMagique instance at 0x01A254E0>
(1)
# coding: latin-1 class CarreMagique : def __init__ (self, nb) : """on place la matrice nb (liste de listes) dans la classe accessible par le mot-clé self""" self.nb = nb # réponse à la question 2 def __str__ (self) : """méthode appelée lorsque on cherche à afficher un carré magique avec l'instruction print""" s = "" for i in range (0, len (self.nb)) : for j in range (0, len (self.nb)) : s += str ( self.nb [i][j]) + " " s += "\n" # pour passer à la ligne # réponse à la question 4 s += "somme " + str (self.somme_ligne (0)) return s # réponse à la question 3 def somme_ligne (self, i) : s = 0 for j in range (0, len (self.nb)) : s += self.nb [i][j] return s # réponse à la question 5 def somme_colonne (self, j) : s = 0 for i in range (0, len (self.nb)) : s += self.nb [i][j] return s # réponse à la question 6 def est_magique (self) : # on stocke toutes les sommes l = [] for i in range (0, len (self.nb)) : l.append ( self.somme_ligne (i) ) for j in range (0, len (self.nb)) : l.append ( self.somme_colonne (j) ) # réponse à la question 7 l.append ( self.somme_diagonale (0)) l.append ( self.somme_diagonale (1)) # on trie la liste l.sort () # on compare le plus petit et le plus grand, s'il sont égaux, # le carré est magique return l [0] == l [ len(l)-1 ] # réponse à la question 7 def somme_diagonale (self, d) : """d vaut 0 ou 1, première ou seconde diagonale""" s = 0 if d == 0 : for i in range (0, len (self.nb)) : s += self.nb [i][i] else : for i in range (0, len (self.nb)) : s += self.nb [i][len(self.nb)-i-1] return s # réponse à la question 8 def nombre_differents (self) : """retourne True si tous les nombres sont différents, on place les nombres un par un dans un dictionnaire, dès que l'un d'eux s'y trouve déjà, on sait que deux nombres sont identiques, le résultat est False""" k = { } for i in range (0, len (self.nb)) : for j in range (0, len (self.nb)) : c = self.nb [i][j] if c in k : return False # pas besoin d'aller plus loin # il y a deux nombres identiques else : k [c] = 0 return True m = [ [9, 3, 7], [ 4,5,6] , [1,8,2] ] cm = CarreMagique (m) # réponse à la question 1 print cm # affiche 15 print cm.est_magique () # affiche False print cm.nombre_differents () # affiche True m = [ [9, 9, 9], [9, 9, 9], [9, 9, 9] ] cm = CarreMagique (m) print cm # affiche 15 print cm.est_magique () # affiche True print cm.nombre_differents () # affiche False
(2)
from carre_magique import CarreMagique res = [] for a in range (1,10) : for b in range (1,10) : for c in range (1,10) : for d in range (1,10) : for e in range (1,10) : for f in range (1,10) : for g in range (1,10) : for h in range (1,10) : for i in range (1,10) : l = [ [a,b,c], [d,e,f], [g,h,i] ] cm = CarreMagique (l) if cm.nombre_differents () and \ cm.est_magique () : res.append (cm) print len (res) for r in res : print r
(3)
# coding: latin-1 from carre_magique import CarreMagique dim = 3 nb = dim*dim res = [] # contiendra la liste des carrés magiques # le compteur : neuf nombres 1 ind = [1 for i in range (0,nb) ] while ind [0] <= nb : # transformation d'une liste en une liste de listes # [1,2,3,4,5,6,7,8,9] --> [[1,2,3],[4,5,6],[7,8,9]] l = [] for i in range (0, dim) : l.append ( ind [i*dim:(i+1)*dim] ) # on vérifie que le carré est magique et # a des nombres tous différents cm = CarreMagique (l) if cm.nombre_differents () and cm.est_magique () : res.append (cm) # on passe au carré suivant : i = nb-1 # dernier indice (9 ici) ind [i] += 1 # addition de 1 au dernier indice while i > 0 and ind [i] > nb : ind [i-1] += 1 # un des indices est supérieur à nb (9 ici) ind [i] = 1 # on le remet à 1 i -= 1 # et on propage l'information à l'indice inférieur # résultat final print len (res) for r in res : print r
(4)
# coding: latin-1 from carre_magique import CarreMagique dim = 3 nb = dim*dim M = 9 ** nb # on va tester 9^9 carrés possibles res = [] # contiendra la liste des carrés magiques for n in xrange (0,M) : # on décompose n en liste ind = [] k = n for t in range (0,nb) : dec = k % nb k = k / nb ind.append (dec+1) # transformation d'une liste en une liste de listes # [1,2,3,4,5,6,7,8,9] --> [[1,2,3],[4,5,6],[7,8,9]] l = [] for i in range (0, dim) : l.append ( ind [i*dim:(i+1)*dim] ) # on vérifie que le carré est magique et # a des nombres tous différents cm = CarreMagique (l) if cm.nombre_differents () and cm.est_magique () : res.append (cm) # résultat final print len (res) for r in res : print r
File: carre_magique_cor.tex, line 47
Traceback (most recent call last): File "carre_magique_tous5.py", line 9, in <module> for n in range (0,M) : MemoryError
(5)
# coding: latin-1 from carre_magique import CarreMagique def echange (p, i, pos) : # échange de deux éléments d'indice i et pos du tableau p if i != pos : e = p [i] p [i] = p [pos] p [pos] = e def permutation (res, dim, pos = 0, p = None) : # parcours des permutations par récurrence # pour le premier appel à la fonction permutation if p == None : p = range (1, dim*dim+1) if pos < len (p) : # on organise les permutations de l'élément p [pos], p [pos+1], ... for i in range (pos, len (p)) : echange (p, i, pos) permutation (res, dim, pos+1, p) echange (p, i, pos) else : # pos correspond au dernier élément : il n'y a plus de permutation # possible avec les éléments qui suivent # on teste donc le nouveau carré l = [] for i in range (0, len (p)/dim) : l.append ( p [i*dim:(i+1)*dim] ) cm = CarreMagique (l) if cm.est_magique () : res.append (cm) # permutations res = [] permutation ( res, 3 ) # résultats print "nombre de carrés ", len (res) for r in res : print r
File: quicksort.tex, line 46
racine = NoeudTri ("un") racine.insere ("unite") racine.insere ("deux") print racine
File: quicksort.tex, line 60
c:\python26\python setup.py install
File: quicksort.tex, line 70
digraph GA { 2 [label="deux",style=filled,shape=record] 3 [label="abc" ,style=filled,shape=record] 2 -> 3 [label="<"] }
File: quicksort.tex, line 97
g = open ("graph.txt", "w") # g.write (graph) # partie écriture dans un fichier g.close () # dot = pydot.graph_from_dot_file ("graph.txt") # partie graphe dot.write_png ("graph.png", prog="dot") # avec pydot
File: quicksort_cor.tex, line 10
class NoeudTri (object): def __init__(self,s): self.mot = s
File: quicksort_cor.tex, line 19
class NoeudTri (object): def __init__(self,s): self.mot = s def __str__(self) : return self.mot + "\n" # \n : passage à la ligne
File: quicksort_cor.tex, line 28
class NoeudTri (object): def __init__(self,s): self.mot = s def __str__(self) : return self.mot + "\n" def insere (self,s): c = cmp (s, self.mot) if c == -1 : self.avant = NoeudTri (s) # ajout d'un successeur elif c == 1 : self.apres = NoeudTri (s) # ajout d'un successeur
File: quicksort_cor.tex, line 43
class NoeudTri (object): def __init__(self,s): self.mot = s def __str__(self): s = "" if "avant" in self.__dict__: s += self.avant.__str__ () s += self.mot + "\n" if "apres" in self.__dict__: s += self.apres.__str__() return s def insere (self,s): c = cmp (s, self.mot) if c == -1 : self.avant = NoeudTri (s) elif c == 1 : self.apres = NoeudTri (s)
File: quicksort_cor.tex, line 64
deux un unite
(1)
# coding: latin-1 import string class SecondeInserstion (AttributeError): "insertion d'un mot déjà inséré" class NoeudTri : def __init__(self,s): self.mot = s # la création d'un nouveau noeud a été placée dans une méthode def nouveau_noeud (self, s) : return self.__class__ (s) #return NoeudTri (s) def __str__(self): s = "" if "avant" in self.__dict__: s += self.avant.__str__ () s += self.mot + "\n" if "apres" in self.__dict__: s += self.apres.__str__() return s def insere (self,s): c = cmp (s, self.mot) if c == -1: if "avant" in self.__dict__ : self.avant.insere (s) # délégation else : self.avant = self.nouveau_noeud (s) # création elif c == 1: if "apres" in self.__dict__ : self.apres.insere (s) # délégation else: self.apres = self.nouveau_noeud (s) # création else: raise SecondeInsertion, "mot : " + s l = ["un", "deux", "unite", "dizaine", "exception", "dire", \ "programme", "abc", "xyz", "opera", "quel"] racine = None for mot in l : if racine == None : # premier cas : aucun mot --> on crée le premier noeud racine = NoeudTri (mot) else : # second cas : il y a déjà un mot, on ajoute le mot suivant # à l'arbre racine.insere (mot) print racine
(2)
# coding: latin-1 import string import pydot import quicksort class NoeudTri2 (quicksort.NoeudTri): def chaine_graphe (self): # le principe est le même que pour la méthode __str__ # excepté que le format est différent g = str (id (self)) + ' [label="' + self.mot \ + '",style=filled,shape=record,fontsize=60]\n' if "avant" in self.__dict__: h = self.avant.chaine_graphe () g += h + str (id (self)) + " -> " + str (id (self.avant)) \ + ' [label="<",fontsize=60]' + '\n' if "apres" in self.__dict__: h = self.apres.chaine_graphe () g += h + str (id (self)) + " -> " + str (id (self.apres)) \ + ' [label=">",fontsize=60]' + "\n" return g #def nouveau_noeud (self, s) : return NoeudTri2 (s) def image (self, file, im) : # on crée un graphe : on récupère le code du graphe graph = self.chaine_graphe () # auquel on ajoute un début et une fin graph = "digraph GA {\n" + graph + "}\n" # puis on l'écrit dans le fichier file g = open (file, "w") g.write (graph) g.close () # enfin, on convertit ce fichier en image dot = pydot.graph_from_dot_file (file) dot.write_png (im, prog="dot") def construit_arbre () : # même code que dans le programme précédent # mais inclus dans une fonction l = ["un", "deux", "unite", "dizaine", "exception", "dire", \ "programme", "abc", "xyz", "opera", "quel"] racine = None for mot in l : if racine == None : racine = NoeudTri2 (mot) else : racine.insere (mot) return racine racine = construit_arbre () print racine racine.image ("graph.txt", "graph.png")
File: quicksort_cor.tex, line 99
Traceback (most recent call last): File "quicksort2.py", line 53, in <module> racine.image ("graph.txt", "graph.png") File "quicksort2.py", line 27, in image graph = self.chaine_graphe () File "quicksort2.py", line 14, in chaine_graphe h = self.avant.chaine_graphe () AttributeError: NoeudTri instance has no attribute 'chaine_graphe'
File: quicksort_cor.tex, line 112
def nouveau_noeud (self, s) : return self.__class__ (s)
File: quicksort_cor.tex, line 120
digraph GA { 18853120 [label="un",style=filled,shape=record] 28505472 [label="deux",style=filled,shape=record] 28505712 [label="abc",style=filled,shape=record] 28505472 -> 28505712 [label="<"] 28505552 [label="dizaine",style=filled,shape=record] 28505592 [label="dire",style=filled,shape=record] 28505552 -> 28505592 [label="<"] 28505632 [label="exception",style=filled,shape=record] 28505672 [label="programme",style=filled,shape=record] 28505792 [label="opera",style=filled,shape=record] 28505672 -> 28505792 [label="<"] 28505832 [label="quel",style=filled,shape=record] 28505672 -> 28505832 [label=">"] 28505632 -> 28505672 [label=">"] 28505552 -> 28505632 [label=">"] 28505472 -> 28505552 [label=">"] 18853120 -> 28505472 [label="<"] 28505512 [label="unite",style=filled,shape=record] 28505752 [label="xyz",style=filled,shape=record] 28505512 -> 28505752 [label=">"] 18853120 -> 28505512 [label=">"] }
sortie HTML
# coding: latin-1 import quicksort2 # construction de l'arbre racine = quicksort2.construit_arbre () # construction de l'image du graphe racine.image ("graph.txt", "graph.png") # création d'un fichier HTML f = open ("page.html", "w") f.write ("<body><html>\n") # début f.write ("<H1> liste triée </H1>\n") # titre pour la liste triée s = str (racine) # on récupère la liste triée s = s.replace ("\n", "<BR>\n") # <BR> permet de passer à la ligne f.write (s) f.write ("<H1> graphe </H1>\n") # titre pour l'image f.write ('<img src="graph.png" width=400/>\n') # image f.write ("<H1> code du graphe </H1>\n") # titre pour le code du graphe s = racine.chaine_graphe () # on récupère le code du graphe f.write ("<pre>\n") # on l'affiche tel quel f.write (s) f.write ("</pre>\n") f.write ("</html></body>\n") # fin f.close () # on lance le navigateur automatiquement pour afficher la page import os os.system (r'"C:\Program Files\Mozilla Firefox\firefox" page.html')
File: quicksort_cor.tex, line 158
<body><html> <H1> liste triée </H1> abc<BR> deux<BR> ... unite<BR> xyz<BR> <H1> graphe </H1> <img src="graph.png" width=400/> <H1> code du graphe </H1> <pre> 13697312 [label="un",style=filled,shape=record,fontsize=60] 13697192 [label="deux",style=filled,shape=record,fontsize=60] 34692472 [label="abc",style=filled,shape=record,fontsize=60] ... 13697232 -> 34692592 [label=">",fontsize=60] 13697312 -> 13697232 [label=">",fontsize=60] </pre> </html></body>
sortie PDF
# coding: latin-1 import quicksort2 # construction de l'arbre racine = quicksort2.construit_arbre () # construction de l'image du graphe racine.image ("graph.txt", "graph.png") # construction du début du fichier tex package = """a4 amsmath amssymb subfigure float latexsym amsfonts epic eepic makeidx multido varindex moreverb alltt fancyvrb fancyhdr color eurosym tabularx placeins url shorttoc""".split () header = """\\documentclass[french,11pt]{article}\n\\usepackage[french]{babel} \\usepackage[usenames]{color}\\usepackage{""" + \ "}\n\\usepackage{".join (package) + \ """}\\usepackage[small,normal]{caption2}\\urlstyle{sf} \\usepackage[pdftex]{graphicx}\usepackage[T1]{fontenc} \DefineVerbatimEnvironment{verbatimx}{Verbatim}{frame=single, framerule=.1pt, framesep=1.5mm, fontsize=\\footnotesize,xleftmargin=0pt} \\begin{document}\n""" # création d'un fichier tex f = open ("page.tex", "w") f.write (header) f.write ("\\title{Tri quicksort}\n") # définit le titre f.write ("\\maketitle\n") # écrit le titre f.write ("\\tableofcontents\n") # table des matières f.write ("\\section{liste triée}\n") # titre pour la liste triée s = str (racine) # on récupère la liste triée s = s.replace ("\n", "\\\\ \n") # \\ passe à la ligne f.write ("\\begin{tabular}{|l|}\n") f.write (s) f.write ("\\end{tabular}\n") f.write ("\\section{graphe}\n") # titre pour l'image f.write ('\\includegraphics[height=5cm]{graph.png}\n') # image f.write ("\\section{code du graphe}\n") # titre pour le code du graphe s = racine.chaine_graphe () # on récupère le code du graphe f.write ("\\begin{verbatimx}\n") # on l'affiche tel quel f.write (s) f.write ("\\end{verbatimx}\n") f.write ("\\end{document}\n") # fin f.close () # on compile deux fois le fichier pour que la table des matières # soit bien prise en compte import os os.system (r'"C:\Program Files\MiKTeX 2.7\miktex\bin\pdflatex" page.tex') os.system (r'"C:\Program Files\MiKTeX 2.7\miktex\bin\pdflatex" page.tex') # on affiche le résultat avec Adobe Reader os.system (r'"C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe" page.pdf')
File: cluster.tex, line 28
import random n = random.gauss (0,1) # loi normale de moyenne 0, de variance 1 u = random.random () # loi uniforme [0,1] import math x,y = math.cos (t), math.sin(t) # cosinus, sinus
File: cluster.tex, line 40
import matplotlib.pyplot as plt x = [ ... ] y = [ ... ] fig = plt.figure() ax = fig.add_subplot(111) ax.plot (x,y, 'o') plt.savefig ("im1.png") # ou plt.show () pour afficher le graphe
File: cluster.tex, line 62
import numpy as np mat = np.matrix ( [[1,2],[3,4]] ) # crée une matrice 2*2 s = mat.shape # égale à (nombre de lignes, nombre de colonnes) l = mat [0,:] # retourne la première ligne c = mat [:,0] # retourne la première colonne mat [:,0] = mat [:,1] # la première ligne est égale à la seconde o = np.ones ( (10,10) ) # crée un matrice de 1 10x10 d = np.diag (d) # extrait la diagonale d'une matrice dd = np.matrix (d) # transforme d en matrice t = mat.transpose () # obtient la transposée e = mat [0,0] # obtient de première élément k = mat * mat # produit matriciel m = mat * 4 # multiplie la matrice par 4 mx = np.max (mat [0,:]) # obtient le maximum de la première ligne s = np.sum (mat [0,:]) # somme de la première ligne l = mat.tolist () # transformer une matrice en list
File: cluster.tex, line 82
mat = np.diagflat ( np.ones ( (1,4) ) ) print mat # matrice diagonale t = mat == 0 print t # matrice de booléens mat [ mat == 0 ] = 4 print mat # ...
File: cluster.tex, line 93
def sqrt (x) : return x**0.5 if x >= 0 else 0 func = np.vectorize (sqrt, otypes=[float]) mat = func (dist) # dist est une matrice
File: cluster.tex, line 134
import matplotlib.pyplot as plt x1 = [ ... ] y1 = [ ... ] x2 = [ ... ] y2 = [ ... ] fig = plt.figure() ax = fig.add_subplot(111) ax.plot (x1,y1, 'o') ax.plot (x2,y2, 'x') plt.savefig ("im2.png")
File: cluster.tex, line 198
def download_quotes (code, d1, d2) : root = "http://ichart.yahoo.com/table.csv?s=%s&a=%02d&b=%d&c=%d" \ "&d=%02d&e=%d&f=%d&g=d&ignore=.csv" % \ (code, d1.month-1, d1.day, d1.year, d2.month-1, d2.day, d2.year) f = urllib.urlopen (root) qu = f.read () f.close () lines = qu.split ("\n") lines = [ l .strip (" \n\r") for l in lines ] head = lines [0] lines = lines [1:] lines = [ l.split (",") for l in lines if "," in l ] lines = [ (get_date (l[0]), l) for l in lines ] lines = [ l [1] for l in lines if d1 <= l [0] <= d2 ] lines = [ "\t".join (l) for l in lines ] return "\n".join ([head ] + lines)
File: cluster.tex, line 220
import datetime import os.path def telecharge_et_ecrit_dans_un_fichier (code) : year = datetime.datetime (2009,1,1) - datetime.datetime (2008,1,1) today = datetime.datetime (2009,1,1).now () lyear = today - year file = code + ".txt" if os.path.exists (file) : return # si le fichier existe déjà, ne le fait pas res = download_quotes (a, lyear, today) f = open (file, "w") f.write (res) f.close ()
File: cluster_cor.tex, line 9
def random_set (nb = 100) : res = [] for i in range (0, nb) : x,y = random.gauss (0,1),random.gauss (0,1) res.append ([x,y]) for i in range (0, nb*2) : x,y = random.gauss (0,1),random.gauss (0,1) n = (x**2 + y**2) ** 0.5 if n == 0 : n == 1.0 x *= 5.0 / n y *= 5.0 / n x += random.gauss (0,0.5) y += random.gauss (0,0.5) res.append ([x,y]) return res
classification non supervisée
# coding: latin-1 import sys,random,copy,math import matplotlib.pyplot as plt import numpy as np def random_set (nb = 100) : """construit un échantillon aléatoire avec deux cercles concentriques, nb pour le premier, nb*2 pour le second""" res = [] for i in range (0, nb) : x,y = random.gauss (0,1),random.gauss (0,1) res.append ([x,y]) for i in range (0, nb*2) : x,y = random.gauss (0,1),random.gauss (0,1) n = (x**2 + y**2) ** 0.5 if n == 0 : n == 1.0 x *= 5.0 / n y *= 5.0 / n x += random.gauss (0,0.5) y += random.gauss (0,0.5) res.append ([x,y]) res.sort () return res def draw (points, clas = None) : """dessine un nuage de points, si clas est une liste, elle contient un indice de clas""" if clas == None : fig = plt.figure() ax = fig.add_subplot(111) x = [ p [0] for p in points ] y = [ p [1] for p in points ] ax.plot (x,y, 'o') plt.savefig ("im1.png") else : fig = plt.figure() ax = fig.add_subplot(111) x = [ p [0] for p,c in zip (points, clas) if c == 0 ] y = [ p [1] for p,c in zip (points, clas) if c == 0 ] ax.plot (x,y, 'o') x = [ p [0] for p,c in zip (points, clas) if c == 1 ] y = [ p [1] for p,c in zip (points, clas) if c == 1 ] ax.plot (x,y, 'x') plt.savefig ("im2.png") def distance_ligne (mat) : """retourne une matrice dont chaque case correspond aux distances entre lignes""" prod = mat * mat.T dist = copy.deepcopy (prod) lin = dist.shape [0] di = np.diag (prod) di = np.matrix (di) one = np.ones ((1,lin)) ii = one.transpose () * di jj = di.transpose () * one dist = prod * (-2) + ii + jj def sqrt (x) : return x**0.5 if x >= 0 else 0.0 func_sqrt = np.vectorize (sqrt, otypes=[float]) dist = func_sqrt (dist) # autre essai #def m (x) : return x**0.6 if x >= 0 else 0.0 #func_m = np.vectorize (m, otypes=[float]) #dist = func_m (dist) #code dont la logique est plus explicite mais il est beaucoup plus lent #for i in xrange (0, lin) : # for j in xrange (0, lin) : # x = (prod [i,i] + prod [j,j] - 2*prod [i,j]) # # if x <= 0 : dist [i,j]= 0 #problème d'arrondi numérique # else : dist [i,j]= x**0.5 return dist def iteration (dist) : """itération de l'algorithme""" dist = distance_ligne (dist) lin = dist.shape [0] for i in xrange (0, lin) : x = np.max (dist [i,:]) y = dist [i,:] * (1.0 / x )#* lin) dist [i,:] = y return dist def algorithme_cluster (points) : """algorithme""" mat = np.matrix (points) lin,col = mat.shape dist = distance_ligne (mat) for i in range (0,50) : print "itération i", i, np.min (dist [0,1:]), \ np.max (dist), np.sum (dist [0,:]) dist = iteration (dist) M = np.max (dist [0,:])/2 res = dist [0,:] good = res > M bad = res <= M res [good]= 1 res [bad] = 0 li = res.tolist () [0] return li if __name__ == "__main__" : # construction of the random set (two circles, a line) rnd = random_set () #draw (rnd) clas = algorithme_cluster (rnd) draw (rnd, clas) plt.show ()
classification non supervisée d'actions
# coding: latin-1 import sys import random import matplotlib.pyplot as plt import numpy as np import copy import math import os from cluster import * import urllib import datetime import sys def get_cac40_quotes () : """récupère les cotes du CAC40 depuis un fichier texte format : quote \t nom """ file = "cac40_quote.txt" quote = open (file, "r").readlines () quote = [ q.strip (" \n\r") for q in quote ] quote = [ q.split ("\t") for q in quote if len (q) > 0 ] assert 38 <= len (quote) <= 40 return quote def get_date (s) : """convertit une date depuis une chaîne de caractères vers un format Python""" y,m,d = s.split ("-") y,m,d = int(y),int(m),int(d) d = datetime.datetime (y,m,d) return d def download_quotes (code, d1, d2) : """ télécharge la cotation d'une action entre deux dates - code: cote - d1: première date (format python) - d2: seconde date (format python) """ root = "http://ichart.yahoo.com/table.csv?s=%s&a=%02d&b=%d&c=%d" \ "&d=%02d&e=%d&f=%d&g=d&ignore=.csv" % \ (code, d1.month-1, d1.day, d1.year, d2.month-1, d2.day, d2.year) f = urllib.urlopen (root) qu = f.read () f.close () lines = qu.split ("\n") lines = [ l .strip (" \n\r") for l in lines ] head = lines [0] lines = lines [1:] lines = [ l.split (",") for l in lines if "," in l ] lines = [ (get_date (l[0]), l) for l in lines ] lines = [ l [1] for l in lines if d1 <= l [0] <= d2 ] lines = [ "\t".join (l) for l in lines ] return "\n".join ([head ] + lines) def get_quotes_internet (all) : """télécharge toutes les cotations pour les cotes dans all pour les 6 derniers mois - all: dictionnaire { cote: nom complet } - enregistre le résultat dans un fichier pour éviter de télécharger les cours à chaque exécution """ year2 = datetime.datetime (2009,1,1) - datetime.datetime (2008,6,1) today = datetime.datetime (2009,1,1).now () lyear = today - year2 path = "quotes/" for a,nom in all : file = path + a + ".txt" if os.path.exists (file) : continue res = download_quotes (a, lyear, today) f = open (file, "w") f.write (res) f.close () print "loading ", a, " from ", lyear , " to ", today, \ " lines ", len (res.split ("\n")) def get_close_ret (code) : """retourne la série des rendements depuis un fichier de cotations créé par la fonction get_quotes_internet""" file = "quotes/" + code + ".txt" lines = open (file, "r").readlines () lines = lines [1:] lines = [ l for l in lines if "\t" in l ] lines = [l.strip ("\n\r ").split ("\t") [4] for l in lines ] lines = [ float (x) for x in lines ] lines = [ (lines [x]-lines [x-1])/lines [x-1] for x in xrange (1, len (lines))] return lines def get_matrix (all) : """retourne la matrice des autocorrélations""" colonnes = [] for a,nom in all : close = get_close_ret (a) if len (colonnes) != 0 and len (close) != len (colonnes [0]) : message = "problème avec %s longueur %d <> %d " % \ (nom, len (close), len (colonnes [0])) raise Exception ("les données ne sont pas alignées dans le temps, " \ "une série ne contient le même nombre d'observations\n" + message) colonnes.append (close) mat = np.matrix (colonnes) # s'il y a une erreur ici, cela signifie que les # actions n'ont pas des cotations aux mêmes dates cor = np.corrcoef (mat) return cor if __name__ == "__main__" : if not os.path.exists ("quotes"): os.mkdir ("quotes") quotes = get_cac40_quotes () get_quotes_internet (quotes) mat = get_matrix (quotes) print mat.shape li = algorithme_cluster (mat) print li for a,b in zip (quotes,li) : print b, a [1], "\t", a [0]
, correction 2006
# coding: latin-1 # question 1 def lit_fichier (file) : f = open (file, "r") mot = [] for l in f : mot.append ( l.replace ("\n", "") ) f.close () return mot mot = lit_fichier ("td_note_texte.txt") print mot # question 2 def est_trie (mot) : for i in range (1, len (mot)) : if mot [i-1] > mot [i] : return False return True tri = est_trie (mot) print "liste triée ", tri # question 3 def cherche (mot, m) : for i in range (0, len (mot)) : if mot [i] == m : return i return -1 print "mot ACHATS ", cherche (mot, "ACHATS") print "mot achats ", cherche (mot, "achats") # question 4 un = cherche (mot, "UN") deux = cherche (mot, "DEUX") print "recherche normale ", un, deux print "nombre d'itérations", un + deux # question 5, 6, nbun et nbdeux contiennent le nombre de comparaisons def cherche_dicho (mot, m) : a = 0 b = len (mot)-1 nb = 0 while a < b : nb += 1 p = (a+b)/2 if mot [p] == m : return p,nb elif mot [p] > m : b = p-1 else : a = p+1 return -1,nb un,nbun = cherche_dicho (mot, "UN") deux,nbdeux = cherche_dicho (mot, "DEUX") print "recherche dichotomique ", un, deux print "nombre d'itérations ", nbun + nbdeux # question 7 """ Lors d'une recherche simple, au pire, l'élément cherche sera en dernière position, ce qui signifie n itérations pour le trouver. Le coût de la recherche simple est en O(n). """ # question 8 """ Lors de la recherche dichotomique, à chaque itération, on divise par deux l'ensemble dans lequel la recherche s'effectue, au départ n, puis n/2, puis n/4 jusqu'à ce que n/2^k soit nul c'est-à-dire k = partie entière de ln n / ln 2 il y a au plus k itérations donc le coût de l'algorithme est en O (ln n). """
File: td_note_2007.tex, line 63
class Date : def __init__ (self, jour, mois) : ...
, correction 2007
# coding: latin-1 #################################### # exercice 1 #################################### # question 1 def numero (jour, mois, duree = [31, 28, 31,30,31,30,31,31,30,31,30,31] ) : s = 0 for i in range (0,mois-1) : s += duree [i] s += jour - 1 return s+1 # question 2 def conversion_liste (li) : res = [] for jour,mois in s : res.append ( numero (jour, mois)) # pareil que # for i in range (0, len (s)) : res.append ( numero (s [i][0], s [i][1])) return res def ecart (num) : res = [] for i in range (1, len (num)) : d = num [i] - num [i-1] res.append (d) return res s = [ (1,1), (9,4), (1,5), (8,5), (17,5), (4,6), (14,7), \ (15,8), (1,11), (11,11), (25,12) ] r = conversion_liste (s) ec = ecart (r) # question 3 pos = ec.index ( max (ec) ) print "position de l'écart le plus grand ", pos print "jour ", s [pos], " --> ", s [pos+1] #################################### # exercice 2 #################################### # question 4 class Date : def __init__ (self, jour, mois) : self.jour = jour self.mois = mois self.duree = [31, 28, 31,30,31,30,31,31,30,31,30,31] # question 5 def numero (self) : s = 0 for i in range (0,self.mois-1) : s += self.duree [i] s += self.jour - 1 return s+1 # question 6 def difference (self, autre) : return self.numero () - autre.numero () def conversion_date (s) : res = [] for jour,mois in s : res.append ( Date (jour, mois) ) return res def ecart_date (date) : ec = [] for i in range (1, len (date)) : ec.append ( date [i].difference ( date [i-1] ) ) return ec # question 7 s = [ (1,1), (9,4), (1,5), (8,5), (17,5), (4,6), \ (14,7), (15,8), (1,11), (11,11), (25,12) ] r = conversion_date (s) ec = ecart_date (r) pos = ec.index ( max (ec) ) print "position de l'ecart le plus grand ", pos print "jour ", s [pos], " --> ", s [pos+1] # question 8 """ La conversion en Date est faite une fois pour les dates (1,1) et (25,12) et 2 fois pour les autres en effet, la méthode difference effectue la conversion en numéros des dates self et autre la fonction ecart_date calcule date [i].difference ( date [i-1] ) et date [i+1].difference ( date [i] ) --> la date [i] est convertie 2 fois """ # question 9 """ On peut par exemple stocker la conversion en numéro dans le constructeur comme suit : """ class Date : def __init__ (self, jour, mois) : self.jour = jour self.mois = mois self.duree = [31, 28, 31,30,31,30,31,31,30,31,30,31] self.num = self.numero () # question 5 def numero (self) : s = 0 for i in range (0,self.mois-1) : s += self.duree [i] s += self.jour - 1 return s+1 # question 6 def difference (self, autre) : return self.num - autre.num r = conversion_date (s) ec = ecart_date (r) pos = ec.index ( max (ec) ) print "position de l'écart le plus grand ", pos print "jour ", s [pos], " --> ", s [pos+1]
File: td_note_2008.tex, line 26
l = [ (1, "un"), (3, "deux",), (2, "deux"), (1, "hun"), (-1, "moinsun") ] l.sort (reverse = True) print l
File: td_note_2008.tex, line 34
[(3, 'deux'), (2, 'deux'), (1, 'un'), (1, 'hun'), (-1, 'moinsun')]
, correction 2008
# coding: latin-1 # la première ligne autorise les accents dans un programme Python # la langue anglaise est la langue de l'informatique, # les mots-clés de tous les langages # sont écrits dans cette langue. #################################### # exercice 1 #################################### # # question 1 def lit_fichier (file) : f = open (file, "r") li = f.readlines () # découpage sous forme de lignes f.close () res = [] for l in li : s = l.replace ("\n", "") s = s.split (" ") # le séparateur des colonnes est l'espace res.append (s) return res mat = lit_fichier ("logpdf.txt") for m in mat [0:5] : # on affiche les 5 premières lignes print m # parce que sinon, c'est trop long # question 2 def compte_date (mat) : d = { } for m in mat : date = m [1] # clé if date in d : d [date] += 1 else : d [date] = 1 return d dico_date = compte_date (mat) print dico_date # remarque générale : si le fichier logpdf.txt contient des lignes # vides à la fin, il se produira une erreur à la ligne 34 (date = m [1]) # car la matrice mat contiendra des lignes avec une seule colonne et non quatre. # Il suffit soit de supprimer les lignes vides du fichier logpdf.txt # soit de ne pas les prendre en compte lors de la lecture de ce fichier. # question 3 # La méthode sort trie la liste mais comment ? # Il est facile de trier une liste de nombres mais une liste de couples de # nombres ? L'exemple montre que la liste est triée selon le premier élément de # chaque couple. Pour les cas où deux couples ont un premier élément en commun, # les éléments semblent triés selon le second élément. L'exemple suivant le monte : l = [(1, "un"), (3, "deux",), (2, "deux"), (1, "hun"), (1, "un"), (-1, "moinsun")] l.sort (reverse = True) print l # affiche [(3, 'deux'), (2, 'deux'), (1, 'un'), # (1, 'un'), (1, 'hun'), (-1, 'moinsun')] # question 4 def dix_meilleures (dico) : # dans cette fonction on crée une liste de couples (valeur,clé) ou # la clé représente une date et valeur le nombre de téléchargement # pour cette date li = [] for d in dico : cle = d valeur = dico [cle] li.append ( ( valeur, cle ) ) li.sort (reverse = True) return li [0:10] dix = dix_meilleures (dico_date) print dix # la première date est (283, '26/Sep/2007') # les quatre premières dates correspondent aux quatre premiers TD en 2007 à l'ENSAE # question 5 # la date est en colonne 1, le document en colonne 3 # on fait un copier-coller de la fonction compte_date en changeant un paramètre def compte_document (mat) : d = { } for m in mat : doc = m [3] # clé, 3 au lieu de 1 à la question 2 if doc in d : d [doc] += 1 else : d [doc] = 1 return d dix = dix_meilleures ( compte_document (mat) ) print dix # le premier document est # (323, '/mywiki/Enseignements?.....target=python_cours.pdf'), # question 6 def heure (s) : hs = s [0:2] # on extrait la partie correspondant à l'heure return int (hs) # on retourne la conversion sous forme d'entiers # question 7 # on recommence avec un copier-coller def compte_heure (mat) : d = { } for m in mat : h = m [2] # clé, 2 au lieu de 1 à la question 2 cle = heure (h) if cle in d : d [cle] += 1 else : d [cle] = 1 return d h = compte_heure (mat) dix = dix_meilleures ( h ) print dix # la première heure est (432, 17), ce qui correspond à l'heure des TD for i in h : print i, "h ", h [i] # Il y a beaucoup plus de téléchargement entre 20h et 2h du matin # que le matin avant 10h. # Le site est plutôt consulté le soir. # La conclusion ne serait pas aussi évidente avec un site consulté par des gens # du monde entier puisque 6h du matin est une heure de l'après midi au Japon. # Il faudrait croiser l'heure avec la position géographique de la personne # qui consulte le site.
File: td_note_2009.tex, line 22
pieces = [1,2,5,10,20,50] ...
File: td_note_2009.tex, line 45
pieces = [1,2,4,5,10,20,50]
, correction 2009
# coding: latin-1 ################################### # question 1 : retourner un tableau ################################### pieces = [1,2,5,10,20,50] pieces.reverse () print pieces # affiche [50, 20, 10, 5, 2, 1] # il existait d'autres solutions pieces.sort (reverse = True) # ou encore l'utilisation d'une fonction compare modifiée # qui s'inspire de l'exemple # http://www.xavierdupre.fr/enseignement/initiation/... # ...initiation_via_python_ellipse/chap2_type_tex_-_tri-_3.html # on encore un tri programmé # http://www.xavierdupre.fr/enseignement/initiation/... # ...initiation_via_python_ellipse/chap3_syntaxe_tex_-_tri-_27.html ################################################################## # question 2 : trouve la plus grande pièce inférieure à un montant ################################################################## def plus_grande_piece (montant, pieces) : # on suppose que les pièces sont triées par ordre décroissant for p in pieces : if p <= montant : return p # on peut ajouter la ligne return 0 # qui correspond au fait qu'aucune pièce plus petite ou égale au montant # n'a été trouvé --> le montant est négatif ou nul # on vérifie print "plus_grande_piece (80, pieces) =", plus_grande_piece (80, pieces) # affiche 50 #################################### # question 3 : décomposer un montant #################################### def decomposer (montant, pieces) : # on suppose que les pièces sont triées par ordre décroissant res = [ ] # contiendra la liste des pièces pour le montant while montant > 0 : p = plus_grande_piece (montant, pieces) # on prend la plus grande pièce # inférieure ou égale au montant res.append (p) # on l'ajoute à la solution montant -= p # on ôté p à montant : # c'est ce qu'il reste encore à décomposer return res print "decomposer (98, pieces) =", decomposer (98, pieces) # affiche [50, 20, 20, 5, 2, 1] print "decomposer (99, pieces) =", decomposer (99, pieces) # affiche [50, 20, 20, 5, 2, 2] ###################################################### # question 4 : trouver la décomposition la plus grande ###################################################### def maximum_piece (pieces) : # détermine le nombre maximum de pièces à utiliser maxi = 0 montant = 0 for m in range (1, 100) : r = decomposer (m, pieces) if len (r) >= maxi : # si on remplace cette ligne par if len (r) > maxi : maxi = len (r) # on trouve le plus petit montant # avec la pire décomposition montant = m # et non le plus grand montant # avec la pire décomposation return maxi, montant print "maximum_piece (pieces) =", maximum_piece (pieces) # affiche (6, 99) ################################## # question 5 : décomposition de 98 ################################## pieces4 = [1,2,4,5,10,20,50] pieces4.reverse () print "decomposer (98, pieces) = ", decomposer (98, pieces) # [50, 20, 20, 5, 2, 1] print "decomposer (98, pieces4) = ", decomposer (98, pieces4) # [50, 20, 20, 5, 2, 1] """ Les deux décompositions sont identiques. Or il existe une décomposition plus courte avec la pièce 4 : 98 = 50 + 20 + 20 + 4 + 4 = 5 pièces L'algorithme fait la même erreur lorsqu'il décompose le montant 8. Il cherche toujours la plus grande pièce inférieure au montant qui est 5. Il lui est alors impossible d'utiliser la pièce 4 pour décomposer 8. Cet algorithme ne fournit pas la bonne solution avec ce nouveau jeu de pièces. """ ################################# # question 6 : algorithme optimal ################################# # version récursive : très longue def decomposer_optimal (montant, pieces) : if montant in pieces : return [ montant ] else : r = [ 1 for m in range (0, montant) ] for p in pieces : if montant > p : # si ce test n'est pas fait, la récurrence peut être infinie # car les montants négatifs ne sont pas pris en compte # par le premier test dec = decomposer_optimal (montant - p, pieces) + [p] if len (dec) < len (r) : r = dec return r # print "decomposer_optimal (98, pieces4) =", decomposer_optimal (98, pieces4) # trop long # version non récursive def decomposer_optimal (montant, pieces) : memo = [ [ 1 for l in range (0, m) ] for m in range (0, montant+1) ] # memo [i] contient la pire décomposition du montant i (que des pièces de un) # pour les pièces de pieces, on sait faire plus court for p in pieces : if p < len (memo) : memo [p] = [ p ] for m in range (1, montant+1) : for p in pieces : if m > p : # on calcule la nouvelle décomposition dec = [p] + memo [m-p] # si elle est plus courte, on la garde if len (dec) < len (memo [m] ) : memo [m] = dec # on retourne la meilleur décomposition pour montant return memo [ montant ] # beaucoup plus rapide print "decomposer_optimal (98, pieces4) =", decomposer_optimal (98, pieces4) # affiche [50, 20, 20, 4, 4] ####################### # question 7 : résultat ####################### # pour trouver la décomposition la plus longue avec n'importe quel jeu de pièces # on reprend la fonction maximum_piece et on remplace decomposer par decomposer optimale def maximum_piece (pieces) : # détermine le nombre maximum de pièces à utiliser maxi = 0 montant = 0 for m in range (1, 100) : r = decomposer_optimal (m, pieces) if len (r) >= maxi : # si on remplace cette ligne par if len (r) > maxi : maxi = len (r) # on trouve le plus petit montant # avec la pire décomposation montant = m # et non le plus grand montant # avec la pire décomposation return maxi, montant print "maximum_piece (pieces) =", maximum_piece (pieces) # affiche (6, 99) print "maximum_piece (pieces4) =", maximum_piece (pieces4) # affiche (5, 99) # on teste pour toutes les pièces [3,4,6,7,8,9] # ajoutées au jeu de pièces standard [1,2,5,10,20,50] ensemble = [3,4,6,7,8,9] for ajout in [3,4,6,7,8,9] : pieces = [1,2,5,10,20,50] + [ ajout ] pieces.sort (reverse = True) print "maximum_piece (" + str (pieces) + ") = ", maximum_piece (pieces) # résultat : """ maximum_piece ([50, 20, 10, 5, 3, 2, 1]) = (6, 99) maximum_piece ([50, 20, 10, 5, 4, 2, 1]) = (5, 99) # 4, ok maximum_piece ([50, 20, 10, 6, 5, 2, 1]) = (6, 99) maximum_piece ([50, 20, 10, 7, 5, 2, 1]) = (5, 99) # 7, ok maximum_piece ([50, 20, 10, 8, 5, 2, 1]) = (5, 99) # 8, ok maximum_piece ([50, 20, 10, 9, 5, 2, 1]) = (5, 98) # 9, ok """ ############################ # question 8 : décomposition ############################ """ On cherche ici le coût de la fonction decomposer_optimal en fonction du montant. Il n'y a qu'une seule boucle qui dépend du montant, le coût de la fonction est en O(n). Dans la version récursive, le coût est le résultat d'une suite récurrente : u(n) = u(n-1) + ... + u(n-d) où d est le nombre de pièces. Le coût est donc en O(a^n) où a est la plus grande des racines du polynôme : P (x) = x^d - x^(d-1) - ... - 1 P(1) < 0 et lim P(x) = infini lorsque x tend vers infini, donc la plus grande des racines est supérieure à 1. Le coût de la fonction decomposer_optimal récursive est en O(a^n) avec 1,96 < a < 1,97. Pour des explications plus conséquentes, voir la page http://fr.wikipedia.org/wiki/Suite_r%C3%A9currente_lin%C3%A9aire sur les suites récurrentes et l'exercice 12.3.3 du livre : http://www.xavierdupre.fr/enseignement/initiation/... ...initiation_via_python_ellipse.pdf (ou 13.3.3 http://www.xavierdupre.fr/enseignement/... ...initiation/initiation_via_python_small.pdf). """
File: td_note_2009_rattrape.tex, line 37
N10 P10 gris corde N15 P15 rouge chandelier N8 P8 marron fer à cheval
File: td_note_2009_rattrape.tex, line 54
N3 P3 cuisine N19 P19 bureau N20 P20 salle à manger
File: td_note_2009_rattrape.tex, line 65
def convertit_fichier_en_matrice (fichier) : ...
File: td_note_2009_rattrape.tex, line 77
def convertit_matrice_en_dictionnaire (matrice) : ...
File: td_note_2009_rattrape.tex, line 89
def fusion_dictionnaire (dico1, dico2) :
File: td_note_2009_rattrape.tex, line 98
def convertit_dictionnaire_en_matrice (dico) :
File: td_note_2009_rattrape.tex, line 106
def convertit_matrice_en_fichier (mat, fichier) :
File: td_note_2009_rattrape.tex, line 114
def fusion_fichier (fichier1, fichier2, fichier_resultat) :
File: td_note_2009_rattrape.tex, line 122
def union_moins_intersection_fichier (fichier1, fichier2, fichier_resultat) :
, correction 2009
# coding: latin-1 # Question 1 def convertit_fichier_en_matrice (file): f = open (file, "r") l = f.readlines () f.close () mat = list() for s in l : l = s.strip ("\n\r").split ("\t") mat.append (l) return mat # Question 2 def convertit_matrice_en_dictionnaire (matrice) : d={} for line in matrice : d[line[0],line[1]] = line [2:] return d # Question 3 def fusion_dictionnaire (dico1, dico2) : dico={} for k in dico1 : if k in dico2 : dico[k] = dico1[k] + dico2[k] return dico # Question 4 def convertit_dictionnaire_en_matrice (dico) : m =[] for k,v in dico.iteritems () : line = list (k) + v m.append (line) return m # Question 5 def convertit_matrice_en_fichier (mat,nomfichier): f = open (nomfichier, "w") for line in mat : f.write ( "\t".join ( [ str (x) for x in line ] ) + "\n") f.close () # Question 6 def fusion_fichier (fichier1, fichier2, fichier_resultat) : matrice1 = convertit_fichier_en_matrice(fichier1) matrice2 = convertit_fichier_en_matrice(fichier2) dico1 = convertit_matrice_en_dictionnaire(matrice1) dico2 = convertit_matrice_en_dictionnaire(matrice2) dico = fusion_dictionnaire (dico1,dico2) matrice = convertit_dictionnaire_en_matrice(dico) convertit_matrice_en_fichier (matrice,fichier_resultat) fusion_fichier ( "td_note_2009_cluedo_1.txt", "td_note_2009_cluedo_2.txt", "cluedo.txt") # Question 7 def fusion_dictionnairebis (dico1,dico2) : l1=dico1.keys() l2=dico2.keys() dico={} for k in l1 : if k not in l2 : dico[k]=[] for k in l2 : if k not in l1 : dico[k]=[] return dico def union_moins_intersection_fichier (fichier1, fichier2, fichier_resultat): matrice1 = convertit_fichier_en_matrice(fichier1) matrice2 = convertit_fichier_en_matrice(fichier2) dico1 = convertit_matrice_en_dictionnaire(matrice1) dico2 = convertit_matrice_en_dictionnaire(matrice2) dico = fusion_dictionnairebis (dico1,dico2) matrice = convertit_dictionnaire_en_matrice(dico) convertit_matrice_en_fichier (matrice,fichier_resultat) union_moins_intersection_fichier ( "td_note_2009_cluedo_1.txt", "td_note_2009_cluedo_2.txt", "cluedo2.txt") # Question 8 """ Il suffit de fusionner les fichiers deux par deux en procédant par récurrence. On fusionne d'abord les deux premiers, puis on fusionne le troisième au résultat de la première fusion... """
File: td_note_2010.tex, line 30
def sous_nuage (nb, x, y, v) : # retourne une liste de 2-uples
File: td_note_2010.tex, line 35
def n_sous_nuages (n, nb) : # retourne une liste de 2-uples
File: td_note_2010.tex, line 41
import matplotlib.pyplot as plt x = [ ... ] y = [ ... ] fig = plt.figure() ax = fig.add_subplot(111) ax.plot (x,y, 'o') plt.savefig ("im1.png") # ou plt.show () pour afficher le graphe
File: td_note_2010.tex, line 52
def random_class (points, n) : # retourne une liste d'entiers
File: td_note_2010.tex, line 67
def proche_barycentre (point, barycentres) : # retourne un entier
File: td_note_2010.tex, line 72
def association_barycentre (points, barycentres) : # retourne une liste d'entiers
File: td_note_2010.tex, line 82
def barycentre_classe (points, classes, numero_class) : # retourne un 2-uple def tous_barycentres (points, classes) : # retourne une liste de 2-uples
File: td_note_2010.tex, line 88
def nuees_dynamiques (points, nombre_classes) : # retourne une liste d'entiers
File: td_note_2010.tex, line 98
import matplotlib.pyplot as plt x1 = [ ... ] y1 = [ ... ] x2 = [ ... ] y2 = [ ... ] fig = plt.figure() ax = fig.add_subplot(111) ax.plot (x1,y1, 'o') ax.plot (x2,y2, 'x') # ligne ajoutée, 'x', 'bo', ... plt.savefig ("im2.png") # 'rx', 'go', 'gs', 'bs', ...
File: td_note_2010.tex, line 133
def n_sous_nuages (n, nb): m = [] for i in range (0,n): x = 5*random.random() y = 5*random.random() d = sous_nuage(nb,x,y,1) m += d return m
File: td_note_2010.tex, line 146
def n_sous_nuages (n, nb): m = [] for i in range (0,n): x = random.randint(0,20) y = random.randint(0,20) d = sous_nuage(nb,x,y,1) m += d return m
File: td_note_2010.tex, line 168
def n_sous_nuages (n, nb): m = [] for i in range (0,n): x = random.gauss(0,1) y = random.gauss(0,1) d = sous_nuage(nb,x,y,1) m += d return m
File: td_note_2010.tex, line 191
def n_sous_nuages (n, nb): m = [] for i in range (0,n): x = random.gauss(0,1) y = random.gauss(0,1) d = sous_nuage(nb,x,y,1) m += [ d ] # le résultat n'est # plus une liste return m
File: td_note_2010.tex, line 209
import matplotlib.pyplot as plt x = [ p [0] for p in n_sous_nuages (3,50) ] y = [ p [1] for p in n_sous_nuages (3,50) ] fig = plt.figure() ax = fig.add_subplot(111) ax.plot (x,y, 'o' ) plt.savefig ("im1.png")
File: td_note_2010.tex, line 223
def random_class(l,n): l = [] for i in range(0,len(l)): l += [ random.randint (1,n) ] return l
File: td_note_2010.tex, line 234
def random_class(l,n): l = [] for i in range(0,len(l)): l += [ random.randint (0,n) ] return l
File: td_note_2010.tex, line 245
d= ( (p[0]-f[0])**2+(p[1]-f[1])**2 ) ** (1/2)
File: td_note_2010.tex, line 251
def proche_barycentre (point,barycentres): d=distance_euclidienne(point,barycentres[0]) for i in range (0,len(barycentres)): if distance_euclidienne(point,barycentres[i])<=d: d=distance_euclidienne(point,barycentres[i]) return d
File: td_note_2010.tex, line 265
def barycentre_classe (points, classes, numero_class): x=0 y=0 for i in range (0,len(classes)): if classes[i]==numero_class: # ligne importante l=point[i] x=x+l[0] y=y+l[1] c=[x/n,y/n] # ligne importante return c
File: td_note_2010.tex, line 284
def tous_barycentres (points,classes): c=[] for i in classes : # or on a len(classes) == len(points) c+=[barycentre_classe (points,classes,i)] return c
File: td_note_2010.tex, line 294
def tous_barycentres (points,classes): c=[] mx=max(classes) # il faut ajouter +1 for i in range(0,mx) : c+=[barycentre_classe (points,classes,i)] return c
File: td_note_2010.tex, line 309
def nuees_dynamiques (points,nombre_classes): l = random_class (points,nombre_classes) for j in range (0,10): c = tous_barycentres (points, l) a = association_barycentre (points,c) # il faut ajouter ici l = a pour corriger la fonction return a
File: td_note_2010.tex, line 321
def nuees_dynamiques (points,nombre_classes): for j in range (0,10): l = random_class (points,nombre_classes) c = tous_barycentres (points, l) a = association_barycentre (points,c) l = a return a
File: td_note_2010.tex, line 333
def nuees_dynamiques (n,nb): for j in range (0,10): points = n_sous_nuage (n,nb) l = random_class (points,nombre_classes) c = tous_barycentres (points, l) a = association_barycentre (points,c) l = a return a
, correction 2010
# coding: latin-1 import random import numpy def dessin (nuage, image = None) : """dessine un nuage de points @param nuage le nuage de points @param image si None, on affiche le nuage au travers d'une fenêtre, sinon, image correspond à un nom d'image sur disque dur qui contiendra le graphique final""" import matplotlib.pyplot as plt x = [ p[0] for p in nuage ] y = [ p[1] for p in nuage ] plt.clf () fig = plt.figure() ax = fig.add_subplot(111) ax.plot (x,y, 'o') if image == None : plt.show () else : plt.savefig (image) def dessin_classes (nuage, classes, image = None) : """dessine un nuage, donne des couleurs différentes selon que le point appartient à telle ou telle classes @param nuage nuage[i], c'est le point i @param classes classes [i] est la classe associée au point i @param image voir la fonction précédente """ import matplotlib.pyplot as plt x = {} y = {} for i in range (0, len (nuage)) : cl = classes [i] if cl not in x : x [cl] = [] y [cl] = [] x [cl].append ( nuage [i][0] ) y [cl].append ( nuage [i][1] ) plt.clf () fig = plt.figure() ax = fig.add_subplot(111) for cl in x : ax.plot (x [cl], y [cl], "+") if image == None : plt.show () else : plt.savefig (image) def sous_nuage (nb, x, y) : """retourne un ensemble de points tirés aléatoirement selon une loi normale centrée autour du point x,y @param nb nombre de points @param x abscisse du centre @param y ordonnée du centre @return une liste de points ou matrice de deux colonnes - la première correspond aux abscisses, - la seconde aux ordonnées """ res = [] for i in xrange (0, nb) : xx = random.gauss (0,1) yy = random.gauss (0,1) res.append ( [x+xx, y+yy] ) return res def n_sous_nuages (nb_class, nb_point) : """crée un nuage de points aléatoires @param nb_class nombre de sous nuages @param nb_point nombre de points dans chaque sous nuage @return une liste de points ou matrice de deux colonnes - la première correspond aux abscisses, - la seconde aux ordonnées""" res = [] for c in xrange (0, nb_class) : x = random.gauss (0,1) * 5 y = random.gauss (0,1) * 5 res += sous_nuage (nb_point, x,y) return res def random_class ( nuage, n) : """choisis aléatoirement un entier pour chaque point du nuage @param nuage un nuage de points (matrice de deux colonnes) @param n nombre de classes @return une liste d'entiers """ res = [ ] for p in nuage : c = random.randint (0, n-1) res.append (c) return res def proche_barycentre (point, barycentres) : """détermine le barycentre le plus d'un point @param point liste de 2 réels : [x,y] @param barycentres liste de n points = matrice de deux colonnes, chaque ligne correspond à un barycentre @return un entier qui correspond à l'index du barycentre le plus proche""" dmax = 1e6 for i in range (0, len (barycentres)) : b = barycentres [i] dx = point [0] - b [0] dy = point [1] - b [1] d = (dx**2 + dy**2) ** 0.5 if d < dmax : dmax = d m = i return m def association_barycentre (points, barycentres) : """détermine pour chaque point le barycentre le plus proche @param points nuage (matrice de deux colonnes) @param barycentres c'est aussi une matrice de deux colonnes mais avec moins de lignes @return liste d'entiers, chaque entier correspond à la classe du point points[i], c'est-à-dire l'index du barycentre le plus proche ici: point: points [i] classe: res[i] barycentre: barycentres[ res[i] ] """ res = [] for p in nuage : m = proche_barycentre (p, barycentres) res.append (m) return res def barycentre_classe (points, classes, numero_class) : """calcule le barycentre d'une classe @param points ensemble de points (matrice de deux colonnes) @param classes liste d'entiers de même longueur, chaque élément classes[i] est la classe de point[i] @param numero_class classe pour laquelle on doit calculer le barycentre @return résultat barycentre x,y dans cette fonction, on doit calculer le barycentre d'une classe c'est-à-dire le barycentre des points points[i] pour lesquelles classes[i] == numero_class """ mx,my = 0.0,0.0 nb = 0 for i in range (0, len (points)) : p = points [i] c = classes [i] if c != numero_class : continue nb += 1 mx += p [0] my += p [1] return mx/nb, my/nb def tous_barycentres (points, classes) : """calcule les barycentres pour toutes les classes @param points points, nuage, matrice de deux colonnes @param classes liste d'entiers @return liste de barycentre = matrice de deux colonnes """ mx = max (classes)+1 barycentre = [] for m in range (0,mx) : b = barycentre_classe (points, classes, m) barycentre.append (b) return barycentre def numpy_tous_barycentres (points, classes) : """écriture de barycentre_classe et tous_barycentres en une seule fonction avec numpy """ nbcl = max (classes)+1 mat = numpy.matrix (points) vec = numpy.array ( classes ) clas = numpy.zeros ( (len (points), nbcl) ) for i in range (0, nbcl) : clas [ vec == i, i ] = 1.0 nb = clas.sum (axis = 0) for i in range (0, nbcl) : clas [ vec == i, i ] = 1.0 / nb [i] ba = mat.transpose () * clas ba = ba.transpose () ba = ba.tolist () barycentre = [ b for b in ba ] return barycentre def numpy_tous_barycentres2 (points, classes) : """écriture de barycentre_classe et tous_barycentres en une seule fonction avec numpy """ nbcl = max (classes)+1 mat = numpy.matrix (points) matt = mat.transpose () matcl = numpy.matrix (classes).transpose () barycentre = [] for c in xrange (0, nbcl) : w = numpy.matrix (matcl) w [matcl==c] = 1 w [matcl!=c] = 0 wt = w.transpose () r = matt * w n = wt * w r /= n [0,0] barycentre += [ [ r [0,0], r [1,0] ] ] return barycentre def nuees_dynamiques (points, nbcl) : """algorithme des nuées dynamiques @param points ensemble points = matrice de deux colonnes @param nbcl nombre de classes demandées @return un tableau incluant la liste d'entiers """ classes = random_class (points, nbcl) # on a le choix entre la version sans numpy for i in range (0,10) : print "iteration",i, max (classes)+1 barycentres = tous_barycentres (points, classes) # ou l'un classes = association_barycentre (points, barycentres) cl1 = classes # ou la première version avec numpy for i in range (0,10) : print "iteration",i, max (classes)+1 barycentres = numpy_tous_barycentres (points, classes) # ou l'autre classes = association_barycentre (points, barycentres) cl2 = classes # ou la seconde version avec numpy for i in range (0,10) : print "iteration",i, max (classes)+1 barycentres = numpy_tous_barycentres2 (points, classes) # ou l'autre classes = association_barycentre (points, barycentres) cl3 = classes # on doit trouver cl1 == cl2 == cl3 if cl1 != cl2 or cl1 != cl3 : print "erreur de calculs dans l'une des trois fonctions" return classes # début du programme : on construit un nuage de points nuage = n_sous_nuages (3, 50) # on appelle l'algorithme classes = nuees_dynamiques (nuage, 3) # on dessine le résultat dessin_classes (nuage, classes)
File: td_note_2010_rattrape.tex, line 73
[['Auxerre', 3.537309885, 47.767200469999999], ['Bastia', 9.4343004229999998, 42.661758419999998], ...
File: td_note_2010_rattrape.tex, line 81
def get_tour () : stour = """Auxerre 3,537309885 47,76720047 Bastia 9,434300423 42,66175842 Bordeaux -0,643329978 44,80820084""" ... return tour
File: td_note_2010_rattrape.tex, line 93
def distance (tour, i,j) : ... return d
File: td_note_2010_rattrape.tex, line 101
def longueur_tour (tour) : ... return d
File: td_note_2010_rattrape.tex, line 109
import pylab def graph (tour) : x = [ t[1] for t in tour ] y = [ t[2] for t in tour ] .... .... pylab.plot (x,y) for ville,x,y in tour : pylab.text (x,y,ville) pylab.show ()
File: td_note_2010_rattrape.tex, line 132
def permutation (tour) :
File: td_note_2010_rattrape.tex, line 164
def retourne (tour, i,j) :
File: td_note_2010_rattrape.tex, line 171
def croisement (tour) :
File: td_note_2010_rattrape.tex, line 177
def resoud_et_dessine (tour) :
, correction 2010
# coding: latin-1 import random, numpy, math, pylab, copy ### ### réponse à la question 1 ### def get_tour () : tour = """Auxerre 3,537309885 47,76720047 Bastia 9,434300423 42,66175842 Bordeaux -0,643329978 44,80820084 Boulogne 1,579570055 50,70875168 Caen -0,418989986 49,14748001 Le Havre 0,037500001 49,45898819 Lens 2,786649942 50,40549088 Lille 2,957109928 50,57350159 Lyon 4,768929958 45,70447922 Paris 2,086790085 48,65829086 Lyon 4,768929958 45,70447922 Marseille 5,290060043 43,1927681 Lille 2,957109928 50,57350159 Nantes -1,650889993 47,16867065 Rennes -1,759150028 48,05683136 Toulouse 1,356109977 43,5388298 Strasbourg 7,687339783 48,49562836 Nancy 6,134119987 48,66695023 Nice 7,19904995 43,6578598 Saint-Etienne 4,355700016 45,39992905 Brest -4,552110195 48,36014938 Metz 6,11729002 49,0734787 Sedan 4,896070004 49,68407059 Grenoble 5,684440136 45,13940048 Annecy 6,082499981 45,8782196""".replace (",", ".").split ("\n") # ligne d'avant : on découpe l'unique chaîne de caractères # ligne suivant : on découpe chaque ligne en colonne tour = [ t.strip ("\r\n ").split ("\t") for t in tour ] # puis on convertit les deux dernières colonnes tour = [ t [:1] + [ float (x) for x in t [1:] ] for t in tour ] return tour ### ### réponse à la question 2 ### def distance (tour, i,j) : dx = tour [i][1] - tour [j][1] dy = tour [i][2] - tour [j][2] return (dx**2 + dy**2) ** 0.5 ### ### réponse à la question 3 ### def longueur_tour (tour) : # n villes = n segments d = 0 for i in xrange (0,len(tour)-1) : d += distance (tour, i,i+1) # il ne faut pas oublier de boucler pour le dernier segment d += distance (tour, 0,-1) return d ### ### réponse à la question 4 ### def graph (tour) : x = [ t[1] for t in tour ] y = [ t[2] for t in tour ] x += [ x [0] ] # on ajoute la dernière ville pour boucler y += [ y [0] ] # pylab.plot (x,y) for ville,x,y in tour : pylab.text (x,y,ville) pylab.show () ### ### réponse à la question 5 ### def permutation (tour) : # on calcule la longueur du tour actuelle best = longueur_tour (tour) # variable fix : dit combien d'échanges ont eu lieu depuis la # dernière amélioration fix = 0 while True : # on tire deux villes au hasard i = random.randint (0, len(tour)-1) j = random.randint (0, len(tour)-1) if i == j : continue # on les échanges si i != j e = tour [i] tour [i] = tour [j] tour [j] = e # on calcule la nouvelle longueur d = longueur_tour (tour) if d >= best : # si le résultat est plus long --> retour en arrière # ce qui consiste à échanger à nouveau les deux villes fix += 1 e = tour [i] tour [i] = tour [j] tour [j] = e else : # sinon, on garde le tableau tel quel best = d # et on met fix à 0 pour signifier qu'une modification a eu lieu fix = 0 # si aucune modification n'a eu lieu durant les dernières 10000 itérations, # on s'arrête if fix > 10000 : break ### ### réponse à la question 6 ### def retourne (tour, i,j) : """ on échange les éléments i et j puis i+1 et j-1 puis i+2 et j-2 tant que i+k < j-k """ while i <= j : e = tour [i] tour [i] = tour [j] tour [j] = e i += 1 j -= 1 ### ### réponse à la question 7 ### def croisement (tour) : """ cette fonction reprend le même schéma que la fonction permutation on annule une modification en appelant à nouveau la fonction retourne """ best = longueur_tour (tour) fix = 0 while True : i = random.randint (0, len(tour)-2) j = random.randint (i+1, len(tour)-1) retourne (tour, i,j) d = longueur_tour (tour) if d >= best : # retour en arrière fix += 1 retourne (tour, i,j) else : fix = 0 best = d if fix > 10000 : break ### ### réponse à la question 8 ### def enchaine (tour) : """ cette fonction est plus complexe que le résultat demandé pour cette question on enchaîne les deux fonctions (croisement, permutation) tant que la longueur du circuit diminue et si jamais cette longueur ne diminue plus, on perturbe le circuit au plus deux fois en échangeant trois couples de villes choisies au hasard, cette dernière partie n'était pas prévue dans l'énoncé """ best = longueur_tour (tour) tttt = copy.deepcopy (tour) print "debut", best nom = 0 while True : croisement (tour) d = longueur_tour (tour) print "croisement", d, best permutation (tour) d = longueur_tour (tour) print "permutation", d, best if d < best : best = d tttt = copy.deepcopy (tour) nom = 0 elif nom > 2 : break else : nom += 1 for k in range (0,3) : i = random.randint (0, len(tour)-2) j = random.randint (i+1, len(tour)-1) e = tour [i] tour [i] = tour [j] tour [j] = e return tttt if __name__ == "__main__" : tour = get_tour () tour = enchaine (tour) graph (tour)
File: td_note_2011.tex, line 45
75002 2.407478 48.930141 75010 2.405963 48.921033 75002 2.400573 48.913487 75018 2.391144 48.934509
, correction 2011
# coding: latin-1 import urllib2, math # question 1 def lit_fichier () : # le principe est le même que pour le chargement d'un fichier # le programme lit directement les informations depuis Internet f = urllib2.urlopen ("http://www.xavierdupre.fr/enseignement"\ "/examen_python/restaurant_paris.txt") s = f.read () f.close () lines = s.split ("\n") # on découpe en lignes # on découpe en colonnes lines = [ _.strip ("\n\r ").split ("\t") for _ in lines if len (_) > 0 ] lines = [ _ for _ in lines if len (_) == 3 ] # on supprime les lignes vides # on convertit les coordonnées en réel lines = [ (a [3:], float (b), float (c)) for a,b,c in lines ] return lines # question 2 def compte_restaurant (mat) : # simple comptage, voir le chapitre 3... compte = { } for cp,x,y in mat : if cp not in compte : compte [cp] = 0 compte [cp] += 1 return compte # question 3 def barycentre (mat) : # un barycentre est un point (X,Y) # où X et Y sont respectivement la moyenne des X et des Y barycentre = { } # boucle sur la matrice for cp,x,y in mat : if cp not in barycentre : barycentre [cp] = [ 0, 0.0, 0.0 ] a,b,c = barycentre [cp] barycentre [cp] = [a+1, b+x, c+y] # boucle sur les barycentres for cp in barycentre : a,b,c = barycentre [cp] barycentre [cp] = [b/a, c/a] # le coût de cette fonction est en O (n log k) # où k est le nombre de barycentre # de nombreux élèves ont deux boucles imbriquées, # d'abord sur la matrice, ensuite sur les barycentres # ce qui donne un coût en O (nk), beaucoup plus grand return barycentre # question 4 def distance (x1, y1, x2, y2) : return ((x1-x2)**2 + (y1-y2)**2)**0.5 # question 5 def plus_proche_restaurant (x,y, arr, mat) : m,mx,my = None, None, None for cp,a,b in mat : if cp != arr and (m == None or distance (a,b,x,y) < m) : mx,my = a,b m = distance (a,b,x,y) return mx,my # question 6 def densite_approchee (mat) : g = barycentre (mat) compte = compte_restaurant (mat) res = { } for cp in g : out = plus_proche_restaurant (g [cp][0], g [cp][1], cp, mat) r = distance (g [cp][0], g [cp][1], out [0], out [1]) aire = math.pi * r ** 2 res [cp] = compte [cp] / aire return res if __name__ == "__main__" : if False : #mettre à vrai pour remplacer la fonction plus_proche_restaurant # ajout par rapport à l'énoncé # en réponse à la dernière question # plutôt que de prendre le premier point à hors de l'arrondissement # on considère celui correspondant à un quantile (5%) # ce qui évite les quelques restaurants dont les données #sont erronées def plus_proche_restaurant_avec_amelioration (x,y, arr, mat) : all = [] for cp,a,b in mat : if cp != arr : m = distance (a,b,x,y) all.append ( (m,a,b)) all.sort () a,b = all [len(all)/20][1:] return a,b # ajout par rapport à l'énoncé plus_proche_restaurant = plus_proche_restaurant_avec_amelioration mat = lit_fichier () com = densite_approchee (mat) ret = [ (v,k) for k,v in com.iteritems () ] ret.sort () for a,b in ret : print "%d\t%s" % (a,b) # ajout par rapport à l'énoncé # permet de dessiner les restaurants, une couleur par arrondissement # on observe que certains points sont aberrants, ce qui réduit d'autant # l'estimation du rayon d'un arrondissement (il suffit qu'un restaurant # étiquetés dans le 15ème soit situé près du barycentre du 14ème.) import matplotlib import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab import matplotlib.cbook as cboo fig = plt.figure() ax = fig.add_subplot(111) colors = [ 'red', 'blue', 'yellow', 'orange', 'black', 'green', 'purple', 'brown', 'gray', 'magenta', 'cyan', 'pink', 'burlywood', 'chartreuse', '#ee0055'] for cp in barycentre (mat) : lx = [ m[1] for m in mat if m [0] == cp ] ly = [ m[2] for m in mat if m [0] == cp ] c = colors [ int(cp) % len (colors) ] #if cp not in ["02", "20"] : continue ax.scatter(lx,ly, s = 5., c=c,edgecolors = 'none' ) plt.show ()
, énoncé 2012
#coding:latin-1 import urllib, os, os.path, numpy def charge_donnees (nom = "donnees_enquete_2003_television.txt") : if os.path.exists (nom) : # si le fichier existe (il a déjà été téléchargé une fois) f = open (nom, "r") text = f.read () f.close () else : # si le fichier n'existe pas link = "http://www.xavierdupre.fr/enseignement/td_python/" + \ "python_td_minute/data/examen/" + nom url = urllib.urlopen (link) text = url.read () # on enregistre les données pour éviter de les télécharger une seconde fois f = open (nom, "w") f.write (text) f.close () lines = text.split ("\n") lines = [ l.split("\t") for l in lines if len(l) > 3 ] lines = [ [ "0" if s.strip() == "" else s for s in l ] for l in lines ] return lines donnees = charge_donnees () colonne = donnees [0] matrice = numpy.array (donnees [1:], dtype=float) # quelques exemples d'utilisation du module numpy petite_matrice = matrice [0:5,2:4] print petite_matrice # dimension d'une matrice print petite_matrice.shape # multiplication terme à terme vecteur = petite_matrice [:,0] * petite_matrice [:,1] print vecteur # sum print vecteur.sum () # changer une valeur selon une condition petite_matrice [ petite_matrice [:,1] == 1, 1] = 5 print petite_matrice # ne conserver que certaines lignes de la matrice m = petite_matrice [ petite_matrice[:,1] == 5,: ] print m # créer une matrice 10x2 avec des zéros m = numpy.zeros( (10,2) ) # trier les lignes selon la première colonne tr = numpy.sort (petite_matrice, 0) # dessiner deux courbes def dessin_temperature (temperature) : import pylab u = [ t[3] for t in temperature ] v = [ t[4] for t in temperature ] pylab.plot (u) pylab.plot (v) pylab.show()
File: td_note_2012.tex, line 41
POIDLOG POIDSF cLT1FREQ cLT2FREQ 0.8894218317 4766.8652013 2 1 2.740069772 14685.431344 6 2
File: td_note_2012.tex, line 106
temperature = charge_donnees("cannes_charleville_2010_max_t.txt")
File: td_note_2012.tex, line 119
def dessin_temperature (temperature) : import pylab u = [ t[3] for t in temperature ] v = [ t[4] for t in temperature ] pylab.plot (u) pylab.plot (v) pylab.show()
, correction 2012
# coding: latin-1 # ce fichier contient le programme fournit au début de l'examen # http://www.xavierdupre.fr/enseignement/examen_python/python_examen_2011_2012.py from td_note_2012_enonce import * import numpy, pylab ######################################################################## # exercice 1 ######################################################################## # question 1 (+1=1p) donnees = charge_donnees () colonne = donnees [0] matrice = numpy.array (donnees [1:], dtype=float) mat = matrice mat = mat [ mat [:,3] > 0, : ] # question 2 (+1=2p) mat [ mat[:,3] == 1, 3 ] = 24 mat [ mat[:,3] == 2, 3 ] = 24*7 mat [ mat[:,3] == 3, 3 ] = 24*30 # question 3 (+1=3p) res = mat [:,2] / mat [:,3] print res.sum() / res.shape [0] # 0.111 ~ 11,1% du temps passé devant la télévision print res.sum() / res.shape [0] * 24 # soit 2h40min # question 4 (+2=5p) m = mat[:,1] * mat[:,2] / mat[:,3] print m.sum() / mat[:,1].sum() # 0.108 ~ 10,8% # question 5 (+1=6p) m = mat[ mat[:,2] > mat[:,3], : ] print m # il y a deux personnes et la raison la plus probable est une erreur dans l'unité de temps # question 6 (+2=8p) res = numpy.sort (res, 0) print res[res.shape[0]/2] # 0.083 ~ 8.3% = 2h # question 7 (+2=10p) pr = numpy.zeros ((mat.shape[0],4)) pr [:,0] = mat[:,2] / mat[:,3] pr [:,1] = mat[:,1] pr [:,2] = pr[:,0] * pr[:,1] pr = numpy.sort (pr, 0) total = pr[:,2].sum() pr[0,3] = pr [0,2] for i in xrange (1, pr.shape[0]) : pr[i,3] = pr[i-1,3] + pr[i,2] if pr[i,3]/total > 0.5 : fin = i break print pr[fin,3] / pr[:fin+1,1].sum() # 0.0895 ~ 8.95% ######################################################################## # exercice 2 ######################################################################## # question 1 (+1=1p) temperature = charge_donnees("cannes_charleville_2010_max_t.txt") def conversion_reel (temperature) : return [ [ float (x) for x in l ] for l in temperature [1:] ] temperature = conversion_reel(temperature) #question 2 (+2=3p) def valeur_manquante (temperature, c) : for i in xrange (1, len (temperature)-1) : if temperature [i][c] == -1000 : temperature [i][c] = (temperature [i-1][c] + temperature [i+1][c]) / 2 valeur_manquante(temperature, 3) valeur_manquante(temperature, 4) def dessin_temperature (temperature) : import pylab u = [ t[3] for t in temperature ] v = [ t[4] for t in temperature ] pylab.plot (u) pylab.plot (v) pylab.show() # on met en commentaire pour éviter de l'exécuter à chaque fois # dessin_temperature(temperature) # question 3 (+1=4p) def distance (u,t) : return (u-t)**2 # question 4 (+3=7p) def somme_ecart (temperature, t1, t2, T) : s = 0 for i in xrange (0, len(temperature)) : if t1 < i < t2 : s += distance (temperature[i][3], T) # charleville else : s += distance (temperature[i][4], T) # cannes return s # question 5 (+3=10p) def minimisation (temperature, T) : best = 1e10 t1t2 = None for t1 in xrange (0,len(temperature)) : for t2 in xrange (t1+1,len(temperature)) : d = somme_ecart(temperature,t1,t2,T) if best == None or d < best : best = d t1t2 = t1,t2 return t1t2, best #for i in range (300,363) : print "*",somme_ecart (temperature, i, i+2, 20) print temperature [191] print temperature [266] for T in range (15, 25) : print T, "**",minimisation (temperature,T) # (191 = 11/7, 266 = 24/9) (attendre 2 minutes) # question 6 # Le coût de l'algorithme est on O(n^2) car l'optimisation est une double boucle sur les températures. # Passer des jours aux semaines, c'est utiliser des séries 7 fois plus courtes, # l'optimisation sera 7^2 fois plus rapide.
, correction 2012
# coding: latin-1 # question 1 def frequence_lettre (mot) : res = { } for c in mot : if c in res : res[c] += 1 else : res [c] = 1 return res print frequence_lettre ("aviateur") # affiche {'a': 2, 'e': 1, 'i': 1, 'r': 1, 'u': 1, 't': 1, 'v': 1} # Deux autres écritures de la fonction def frequence_lettre (mot) : res = { c:0 for c in mot } for c in mot : res[c] += 1 return res def frequence_lettre (mot) : res = { } for c in mot : # la méthode get retourne res[c] si cette valeur existe, 0 sinon res[c] = res.get( c, 0 ) + 1 return res # question 2 def anagramme (mot1, mot2) : h1 = frequence_lettre(mot1) h2 = frequence_lettre(mot2) # il fallait éviter d'écrire la ligne suivante bien qu'elle retourne le résultat cherché : # return h1 == h2 for c in h1 : if c not in h2 or h1[c] != h2[c] : return False # il ne faut pas oublier cette seconde partie for c in h2 : if c not in h1 : return False return True a,b = "anagramme", "agrammane" print anagramme (a,b), anagramme (b,a) # affiche True, True # on vérifie que la fonctionne marche aussi dans l'autre cas a,b = "anagramme", "agrummane" print anagramme (a,b), anagramme (b,a) # affiche False, False # on pouvait faire plus rapide en éliminant les cas évidents def anagramme (mot1, mot2) : if len(mot1) != len(mot2) : return False h1 = frequence_lettre(mot1) h2 = frequence_lettre(mot2) if len(h1) != len(h2) : return False for c in h1 : if h1[c] != h2.get(c, 0) : return False return True
, correction 2012
# coding: latin-1 # question 1 def factorielle (n) : res = 1 while n > 1 : res *= n n -= 1 return res print factorielle (3) # voici la version récursive qui n'était pas demandée : def factorielle_recursive (n) : return n*factorielle_recursive (n-1) if n > 1 else 1 # question 2 def f(a,b) : # f(a,b) = f(a-1,b) + f(a,b-1) # la formule implique de calculer toutes les valeurs f(i,j) # avec (i,j) dans [[0,a]] x [[0,b]] # un moyen afin d'éviter de trop nombreux calculs est de # stocker les valeurs intermédiaires de f dans une matrice # il faut ensuite s'assurer que f(a-1,b) et f(a,b-1) # ont déjà été calculées avant de calculer f(a,b) # pour cela, on parcourt la matrice dans le sens des i et j croissants # il ne faut pas oublier les a+1,b+1 car range (a) est égal à [ 0,1, ..., a-1 ] mat = [ [ 0 for i in range (b+1) ] for j in range (a+1) ] for i in range (a+1) : for j in range (b+1) : if i == 0 or j == 0 : mat [i][j] = max (i,j) else : mat [i][j] = mat [i-1][j] + mat[i][j-1] return mat [a][b] # on teste pour des valeurs simples print f(0,5) # affiche 5 print f(1,1) # affiche 2 # on vérifie en suite que cela marche pour a < b et b > a print f (4,5) # affiche 210 print f (5,4) # affiche 210 # autres variantes # la version récursive ci-dessous est juste beaucoup plus longue, elle appelle # la fonction f_recursive autant de fois que la valeur retournée # par la fonction cout_recursive alors que la fonction précédente # effectue de l'ordre de O(a*b) calculs def f_recursive(a,b) : return f_recursive(a-1,b) + f_recursive(a,b-1) if a > 0 and b > 0 else max(a,b) def cout_recursive(a,b) : return cout_recursive(a-1,b) + cout_recursive(a,b-1) if a > 0 and b > 0 else 1 # une autre version non récursive def f(a,b) : mat = { } for i in range (a+1) : for j in range (b+1) : mat [i,j] = mat [i-1,j] + mat[i,j-1] if i > 0 and j > 0 else max (i,j) return mat [a,b]
, correction 2012
def f_recursive(a,b, memoire) : if (a,b) in memoire : return memoire [a,b] else : res = f_recursive(a-1,b, memoire) + f_recursive(a,b-1, memoire) \ if a > 0 and b > 0 else max(a,b) memoire [a,b] = res return res
, correction 2012
# coding: latin-1 # question 1 def somme_partielle (li, i, j) : r = 0 for a in range (i,j) : r += li [a] return r # question 2 def plus_grande_sous_liste (li) : meilleur = min(li) # ligne A im,jm = -1,-1 for i in range (0,len(li)) : for j in range (i+1, len(li)+1) : # ne pas oublier +1 car sinon # le dernier élément n'est jamais pris en compte s = somme_partielle(li, i,j) if s > meilleur : meilleur = s im,jm = i,j return li [im:jm] # si li ne contient que des valeurs positives, la solution est évidemment la liste entière # c'est pourquoi il faut tester cette fonction avec des valeurs négatives li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste(li) print(m) # affiche [79, 9, 7, 7] # autre version plus courte def plus_grande_sous_liste (li) : solution = [ (somme_partielle(li,i,j), i, j) \ for i in range (0,len(li)) \ for j in range (i+1, len(li)+1) ] m = max(solution) return li [m[1]:m[2]]
, correction 2012
def plus_grande_sous_liste_n2 (li) : meilleur = 0 im,jm = -1,-1 for i in range (0,len(li)) : s = 0 for j in range (i, len(li)) : s += li[j] if s > meilleur : meilleur = s im,jm = i,j+1 return li [im:jm] li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste_n2(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste_n2(li) print(m) # affiche [79, 9, 7, 7]
, correction 2012
#coding:latin-1 def plus_grande_sous_liste_rapide_r (li, i,j) : if i == j : return 0 elif i+1 == j : return li[i],i,i+1 milieu = (i+j)//2 # on coupe le problème deux ma,ia,ja = plus_grande_sous_liste_rapide_r (li, i, milieu) mb,ib,jb = plus_grande_sous_liste_rapide_r (li, milieu, j) # pour aller encore plus vite dans un cas précis if ja == ib : total = ma+mb im,jm = ia,jb else : # on étudie la jonction im,jm = milieu,milieu+1 meilleur = li[milieu] s = meilleur for k in range (milieu+1, j) : s += li[k] if s > meilleur : meilleur = s jm = k+1 total = meilleur meilleur = li[milieu] s = meilleur for k in range (milieu-1, i-1, -1) : s += li[k] if s > meilleur : meilleur = s im = k total += meilleur - li[milieu] if ma >= max(mb,total) : return ma,ia,ja elif mb >= max(ma,total) : return mb,ib,jb else : return total,im,jm def plus_grande_sous_liste_rapide (li) : m,i,j = plus_grande_sous_liste_rapide_r (li,0,len(li)) return li[i:j] li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste_rapide(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste_rapide(li) print(m) # affiche [79, 9, 7, 7]
, correction 2012
#-*- coding: latin-1 -*- def plus_grande_sous_liste_n (li) : meilleur = [ None for i in li ] somme = [ None for i in li ] best = None for i,el in enumerate(li): if i == 0 or meilleur[i-1] is None: meilleur[i] = i somme[i] = el if best is None or somme[i] > somme[best]: best = i else: if el >= 0 or somme[i-1] > -el : meilleur[i] = meilleur[i-1] somme[i] = somme[i-1] + el if best is None or somme[i] > somme[best]: best = i i,j = meilleur[best], best+1 return li [i:j] li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste_n(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste_n(li) print(m) # affiche [79, 9, 7, 7]
File: td_note_2013_preparation.tex, line 25
import random i = random.randint(0,5)
, correction 2013
#coding:latin-1 import random # question 1 def sequence () : res = [ ] nb = 1 while nb > 0 : i = random.randint(0,2) nb += i - 1 res.append (i) return res # question 2 def moyenne (nb_tirage) : somme = 0.0 for i in range(nb_tirage) : s = sequence() somme += len(s) return somme / nb_tirage s = sequence () print len(s),s m = moyenne (100) print m
, correction 2013
#coding:latin-1 import random def randomint (a,b,c) : x = random.random() if x <= a : return 0 elif x <= a+b : return 1 else : return 2 def sequence (a,b,c) : res = [ ] nb = 1 while nb > 0 : i = randomint(a,b,c) nb += i - 1 res.append (i) return res def moyenne (nb_tirage,a,b,c) : somme = 0.0 for i in range(nb_tirage) : s = sequence(a,b,c) somme += len(s) return somme / nb_tirage a,c = 0.3, 0.2 b = 1-a-c moy = 1.0 / (a-c) print "calcul",moy m1 = moyenne (100000, a,b,c) print "simulée", m1
, correction 2013
#coding:latin-1 import random, math # question 1 def calcul_suite_a (n, e, a,b,c) : p = {} p [0,0] = 1 for u in range (1,n+1) : for k in range (e,u+2) : if k == e : p [u,k] = a * p.get ( (u-1,k+1), 0 ) elif k == e+1 : p [u,k] = a * p.get ( (u-1,k+1), 0 ) + \ b * p.get ( (u-1,k ), 0 ) elif k > e+1 : p [u,k] = a * p.get ( (u-1,k+1), 0 ) + \ b * p.get ( (u-1,k ), 0 ) + \ c * p.get ( (u-1,k-1), 0 ) return p def affiche_proba (ps, e) : n = max ( [ k[1] for k,z in ps.iteritems () ] ) moy = 0.0 logru = [] logu = [] for u in range (1, n+1) : p = ps.get((u,e),0)*1.0 moy += p * u mes = "u % 3d P(U=u) %1.6g r_u %1.6g" % (u, p, moy) if u < 3 or u %50 == 0 : print mes logru.append(math.log(moy)) logu.append(math.log(u)) import pylab pylab.plot ( logu, logru, "o") pylab.show() a,c = 1.0/3, 1.0/3 b = 1-a-c e = -1 su = calcul_suite_a(600,e,a,b,c) affiche_proba(su, e)
File: td_note_2013_preparation.tex, line 186
u 1 P(U=u) 0.333333 r_u 0.333333 u 2 P(U=u) 0.111111 r_u 0.555556 u 50 P(U=u) 0.0013566 r_u 5.57241 u 100 P(U=u) 0.00048407 r_u 8.38753 u 150 P(U=u) 0.000264311 r_u 10.5627 u 200 P(U=u) 0.000171942 r_u 12.4016 u 250 P(U=u) 0.000123146 r_u 14.0242 u 300 P(U=u) 9.37388e-05 r_u 15.4926 u 350 P(U=u) 7.44204e-05 r_u 16.8438 u 400 P(U=u) 6.09325e-05 r_u 18.1021 u 450 P(U=u) 5.10779e-05 r_u 19.2843 u 500 P(U=u) 4.36202e-05 r_u 20.4028 u 550 P(U=u) 3.78157e-05 r_u 21.4669 u 600 P(U=u) 3.31933e-05 r_u 22.4839
File: td_note_2013_preparation.tex, line 311
import random N = 10 M = [ [ 1 if random.randint(1,5) == 1 else 0 for i in range (N) ] for j in range(N) ] for l in M : print l nb = 0 for i in range(N) : for j in range (N) : if i > 0 and M[i-1][j] == 1 : nb += 1 elif i < N-1 and M[i+1][j] == 1 : nb += 1 elif j > 0 and M[i][j-1] == 1 : nb += 1 elif j < N-1 and M[i][j+1] == 1 : nb += 1 print nb
File: td_note_2013_preparation.tex, line 329
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0] [0, 0, 0, 0, 0, 0, 0, 0, 1, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 1, 0, 1, 1] [0, 0, 0, 0, 1, 0, 1, 1, 0, 1] [0, 0, 1, 0, 1, 0, 0, 1, 1, 1] [0, 0, 0, 0, 0, 1, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 1, 0, 0, 0] [0, 1, 0, 0, 0, 1, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 46
File: td_note_2013_preparation.tex, line 345
[0, 1, 0] [0, 0, 1] [0, 0, 0] 4
File: td_note_2013_preparation.tex, line 391
import random, numpy N = 10 M = [ [ 1.0 if random.randint(1,5) == 1 else 0.0 for i in range (N) ] for j in range(N) ] M = numpy.matrix(M) MM = numpy.matrix(M) for i in range (N) : s = numpy.sum(M[i,:]) # ou M[i,:].sum() if s > 0 : MM [i,:] = M [i,:] / s print MM
File: td_note_2013_preparation.tex, line 406
import random, numpy N = 5 M = [ [ 1 if random.randint(1,5) == 1 else 0 for i in range (N) ] for j in range(N) ] M = numpy.matrix (M) MM = numpy.matrix(M) for i in range (N) : s = numpy.sum(M[i,:]) if s > 0 : MM [i,:] = M [i,:]*1.0 / s # multiplication par 1.0 print MM
File: td_note_2013_exoS.tex, line 14
#coding:latin-1 import exoS matrice = exoS.construit_matrice(100)
File: td_note_2013_exoS.tex, line 21
exoS.dessin_matrice(matrice) # cette fonction place un point bleu pour une case contenant 1, # rouge pour une case contenant 2, # rien si elle contient 0
File: td_note_2013_exoS.tex, line 31
def voisins_a_valeur_nulle ( matrice, i, j ) : resultat = [ ] # ... return resultat
File: td_note_2013_exoS.tex, line 41
def tous_voisins_a_valeur_nulle ( matrice, liste_points ) : resultat = [ ] # ... return resultat
File: td_note_2013_exoS.tex, line 57
def fonction_coloriage( matrice, i0, j0) : # ...
File: td_note_2013.tex, line 20
def surface_coloriee ( matrice ) : # ... return surface
File: td_note_2013.tex, line 27
def fonction_coloriage_environ_1000 ( matrice, i0, j0 ) : # ... return surface
, énoncé 2013
#coding:latin-1 import math # cette fonction construit deux spirales imbriquées dans une matrice nb x nb # le résultat est retourné sous forme de liste de listes def construit_matrice (nb) : mat = [ [ 0 for x in range (0,nb) ] for y in range(0,nb) ] def pointij (nb,r,th,mat,c,phase) : i,j = r*th * math.cos(th+phase), r*th*math.sin(th+phase) i,j = int(i*100/nb), int(j*100/nb) i,j = (i+nb)/2, (j+nb)/2 if 0 <= i < nb and 0 <= j < nb : mat[i][j] = c return i,j r = 3.5 t = 0 for tinc in range (nb*100000) : t += 1.0 * nb / 100000 th = t * math.pi * 2 i,j = pointij (nb,r,th,mat,1, 0) i,j = pointij (nb,r,th,mat,1, math.pi) if i >= nb and j >= nb : break return mat # cette fonction reçoit une matrice sous forme de liste de listes contenant des entiers : 0,1,2 # à chaque valeur est associée une couleur : # 0 pour blanc, 1 pour bleu, 2 pour rouge def dessin_matrice (matrice) : import pylab colors = { 1: "blue", 2:"red" } for i in range(0,len(matrice)) : for j in range (0, len(matrice[i])) : if matrice [i][j] in colors : pylab.plot ([i-0.5,i-0.5,i+0.5,i+0.5,i-0.5,i+0.5,i-0.5,i+0.5], [j-0.5,j+0.5,j+0.5,j-0.5,j-0.5,j+0.5,j+0.5,j-0.5], colors [ matrice[i][j] ]) pylab.show() if __name__ == "__main__" : matrice = construit_matrice(100) dessin_matrice(matrice)
, correction 2013
#coding:latin-1 import td_note_2013_novembre_2012_exoS as exoS # question 1, exo S (1 ou 4) def voisins_a_valeurs_nulle (matrice,i,j) : res = [] if i > 0 and matrice[i-1][j] == 0 : res.append ( (i-1,j) ) if i < len(matrice)-1 and matrice[i+1][j] == 0 : res.append ( (i+1,j) ) if j > 0 and matrice[i][j-1] == 0 : res.append ( (i, j-1) ) if j < len(matrice[i])-1 and matrice[i][j+1] == 0 : res.append ( (i, j+1) ) return res # question 2, exo S (1 ou 4) def tous_voisins_a_valeurs_nulle (matrice, liste_points) : res = [] for i,j in liste_points : res += voisins_a_valeurs_nulle (matrice, i,j) return res # question 3, exo S (1 ou 4) def fonction_coloriage ( matrice, i0, j0) : # étage 1 acolorier = [ ( i0, j0 ) ] while len (acolorier) > 0 : # étape 2 for i,j in acolorier : matrice [i][j] = 2 # étape 3 acolorier = tous_voisins_a_valeurs_nulle ( matrice, acolorier ) # on enlève les doublons car sinon cela prend trop de temps d = { } for i,j in acolorier : d [i,j] = 0 acolorier = [ (i,j) for i,j in d ] # question 5, exo S (version 1) def surface_coloriee (matrice) : surface = 0 for line in matrice : for c in line : if c == 2 : surface += 1 return surface # question 5, exo S (version 4) def fonction_coloriage_1000 ( matrice, i0, j0) : acolorier = [ ( i0, j0 ) ] nb = 0 # ligne ajoutée while len (acolorier) > 0 : for i,j in acolorier : matrice [i][j] = 2 nb += 1 # ligne ajoutée if nb > 1000 : break # ligne ajoutée acolorier = tous_voisins_a_valeurs_nulle ( matrice, acolorier ) d = { } for i,j in acolorier : d [i,j] = 0 acolorier = [ (i,j) for i,j in d ] # question 4, exo S (1 ou 4) matrice = exoS.construit_matrice(100) fonction_coloriage (matrice, 53, 53) exoS.dessin_matrice(matrice) print surface_coloriee (matrice) # retourne 3258 # question 5, exo S (version 4) vérification matrice = exoS.construit_matrice(100) fonction_coloriage_1000 (matrice, 53, 53) exoS.dessin_matrice(matrice) print surface_coloriee (matrice) # retourne 1002
File: td_note_2013_exoM.tex, line 4
#coding:latin-1 import exoM fichier_zip = exoM.import_module_or_file_from_web_site ("equipements_sportif_2011.zip") fichier_texte = exoM.unzip_fichier (fichier_zip) # enlever le dernier paramètre 500 pour avoir le tableau complet colonne, intitule, variables = exoM.construit_matrice (fichier_texte, 500) # colonne : contient le nom des colonnes # intitule : contient les deux premières colonnes du fichier textes avec du texte # variables : contient les autres colonnes avec des valeurs numériques
File: td_note_2013_exoM.tex, line 18
import numpy intitule = numpy.array(intitule) # array et non matrix variables = numpy.array(variables) # array et non matrix # utilisation de numpy pour sélectionner des lignes spécifiques print intitule [ intitule[:,1] == "Chevroux", : ] # affiche [['01102' 'Chevroux']] print variables[ intitule[:,1] == "Chevroux", : ] # affiche [[ 82. 1. 12 ...
File: td_note_2013_exoM.tex, line 29
print tab.shape # si tab est une matrice ou un tableau numpy à deux dimensions, # tab.shape est un couple (nb_lignes, nb_colonnes) a = numpy.column_stack ( ( m, e ) ) # coller deux matrices, tableaux ayant le même nombre de lignes
File: td_note_2013_exoM.tex, line 51
# crée une matrice de dimension nb_lignes x nb_colonnes initialisés à zéro mvide = numpy.zeros ( ( nb_lignes, nb_colonnes) )
File: td_note_2013_exoM.tex, line 64
li = list ( mat [:,i] ) # convertit une colonne d'un tableau numpy en une liste print colonne[0][i+2] # affiche le label de la colonne i gini = exoM.coefficient_gini (li) # retourne le coefficient de Gini # pour la liste li
, énoncé 2013
#coding:latin-1 import math, sys # extrait les données depuis un site internet, puis les écrit à côté du programme # ne fait rien si le fichier a déjà été téléchargé def import_module_or_file_from_web_site (module) : import os if os.path.exists ("data\\equipement_sportifs_2011\\" + module) : return "data\\equipement_sportifs_2011\\" + module if not os.path.exists (module) : url = "http://www.xavierdupre.fr/enseignement/complements/" + module import urllib2 if module.lower().endswith("zip") : f = urllib2.urlopen (url, "rb") t = f.read() f.close() f = open(module, "wb") f.write(t) f.close() else : f = urllib2.urlopen (url) t = f.read() f.close() f = open(module, "w") f.write(t) f.close() return module # extrait le fichier texte contenu dans le fichier zip # et l'enregistre à côté du programme # ne fait rien si cela est déjà fait def unzip_fichier (fichier_zip) : import zipfile, os file = zipfile.ZipFile (fichier_zip, "r") res = None for info in file.infolist () : filename = info.filename res = filename if not os.path.exists (filename) : data = file.read(filename) f = open (filename,"w") if sys.version.startswith("3.") : data = str (data, encoding="iso-8859-1") data = data.replace("\r","").split("\n") data = [ _ for _ in data if len (_) > 1 ] data = "\n".join(data) f.write (data) f.close() file.close () return res # construit le tableau extrait du fichier précédent # les deux premières lignes contiennent la description des colonnes # les autres lignes contiennent les données elles-même # pour aller plus vite à chaque exécution, on peut limiter le nombre de lignes # il faudra toutes les utiliser pour l'exécution final def construit_matrice (fichier, stop_apres = -1) : def float_except(x) : try : return float(x) except : return -1 f = open (fichier, "r") lines = [ line.replace("\n","").split("\t")[:107] \ for line in f.readlines()[:stop_apres] ] f.close () colonne = lines [:2] lines = lines [2: ] lines = [ line [:2] + [ float_except(x) for x in line [2:] ] \ for line in lines if len(line)>5 ] intitule = [ line[:2] for line in lines ] lines = [ line[2:] for line in lines ] return colonne, intitule, lines def coefficient_gini (valeurs) : #voir http://fr.wikipedia.org/wiki/Coefficient_de_Gini valeurs.sort() gini = 0 s = 0 for (i,v) in enumerate (valeurs) : gini += (i+1)*v s += v gini = 2*gini / (len(valeurs)*s) - (len(valeurs)+1.0)/len(valeurs) return gini if __name__ == "__main__" : fichier_zip = import_module_or_file_from_web_site ("equipements_sportif_2011.zip") fichier_texte = unzip_fichier (fichier_zip) # enlever le dernier paramètre 500 pour avoir le tableau complet colonne, intitule, variables = construit_matrice (fichier_texte, 500) import numpy intitule = numpy.array(intitule) variables = numpy.array(variables) # affichage des colonnes for i in range (len(colonne[0])) : print (i,colonne[0][i], " --- ", colonne[1][i]) # utilisation de numpy pour sélectionner des lignes spécifiques print (intitule [ intitule[:,1] == "Chevroux", : ]) print (variables [ intitule[:,1] == "Chevroux", : ])
, correction 2013
#coding:latin-1 import numpy import td_note_2013_novembre_2012_exoM as exoM fichier_zip = exoM.import_module_or_file_from_web_site ("equipements_sportif_2011.zip") fichier_texte = exoM.unzip_fichier (fichier_zip) # enlever le dernier paramètre 500 pour avoir le tableau complet colonne, intitule, variables = exoM.construit_matrice (fichier_texte) import numpy intitule = numpy.array(intitule) variables = numpy.array(variables) # question 1, exo M (2 ou 3) code_postaux = [ intitule[i,0] [:2] for i in range (intitule.shape[0] ) ] intitule3 = numpy.column_stack ( (intitule, code_postaux) ) # question 2, exo M (2 ou 3) comptage = {} for i in range (intitule3.shape[0]) : comptage [intitule3 [i,2] ] = 0 departements = [ k for k in comptage ] departements.sort() # question 3, exo M (2 ou 3) D = numpy.zeros ( (len(departements), variables.shape[1] ) ) for i in range (len (departements)) : d = departements [i] for j in range (variables.shape[1]) : D [i,j] = variables [ intitule3 [:,2] == d, j ].sum() # question 4, exo M (2 ou 3) E = numpy.zeros ( D.shape ) for i in range (E.shape[0]) : E [i,:] = D[i,:] / D[i,5] # question 5, exo M (2 ou 3) ginis = [] for j in range (E.shape[1]) : li = list ( E [:,j] ) gini = exoM.coefficient_gini (li) ginis.append ( (gini, colonne[0][j+2]) ) ginis.sort () for line in ginis : print line # les dernières lignes du tableau sont : #(0.86910090569180598, 'Domaine skiable') #(0.88139092467853186, 'Sports nautiques avec au moins une aire de pratique couverte') #(0.89326137963164931, 'Domaine skiable - nombre de pistes') #(0.9348918282098031, 'Parcours sportif avec au moins un parcours couvert') #(0.93902978850018792, 'Domaine skiable avec au moins une piste \xe9clair\xe9e') #(0.94625459043715754, '\xc9quipement de cyclisme avec au moins une piste couverte') #(0.95743849241598267, 'Sports nautiques - nombre de places en tribune') #(0.97248425032547758, 'Domaine skiable avec au moins une piste couverte') #(0.97718065858676906, 'Parcours sportif - nombre de places en tribune') #(0.98637386313881081, 'Terrain de golf - nombre de places en tribune') #(0.98969072164948457, 'Domaine skiable - nombre de places en tribune')
File: td_note_2013_rattrape.tex, line 25
def lit_fichier (file) : """ 0 Séance 1 Référence 2 Entité dépositaire 3 Elu dépositaire 4 Objet 5 Type 6 Rapporteur """ f = open(file,"r") lines = f.readlines () f.close () lines = [ _ for _ in lines if len(_) > 0 ] lines = [ _.split("\t") for _ in lines ] [1:] lines = [ (_[0], _[4] ) for _ in lines if len(_) > 5 ] return lines
File: td_note_2013_rattrape.tex, line 58
import re def extrait_montant (objet) : exp = re.compile ("[ (]([0-9.,]+) {0,3}euros") res = exp.search (objet) if res : montant = res.groups() [0] return montant else : print ("problème ", objet) return None
File: td_note_2013_rattrape.tex, line 87
exp = re.compile ("association(.*)[(]([0-9]+e)[)]")
, correction 2013
#coding:latin-1 import numpy import td_note_2013_novembre_2012_exoM as exoM fichier_zip = exoM.import_module_or_file_from_web_site ("equipements_sportif_2011.zip") fichier_texte = exoM.unzip_fichier (fichier_zip) # enlever le dernier paramètre 500 pour avoir le tableau complet colonne, intitule, variables = exoM.construit_matrice (fichier_texte) import numpy intitule = numpy.array(intitule) variables = numpy.array(variables) # question 1, exo M (2 ou 3) code_postaux = [ intitule[i,0] [:2] for i in range (intitule.shape[0] ) ] intitule3 = numpy.column_stack ( (intitule, code_postaux) ) # question 2, exo M (2 ou 3) comptage = {} for i in range (intitule3.shape[0]) : comptage [intitule3 [i,2] ] = 0 departements = [ k for k in comptage ] departements.sort() # question 3, exo M (2 ou 3) D = numpy.zeros ( (len(departements), variables.shape[1] ) ) for i in range (len (departements)) : d = departements [i] for j in range (variables.shape[1]) : D [i,j] = variables [ intitule3 [:,2] == d, j ].sum() # question 4, exo M (2 ou 3) E = numpy.zeros ( D.shape ) for i in range (E.shape[0]) : E [i,:] = D[i,:] / D[i,5] # question 5, exo M (2 ou 3) ginis = [] for j in range (E.shape[1]) : li = list ( E [:,j] ) gini = exoM.coefficient_gini (li) ginis.append ( (gini, colonne[0][j+2]) ) ginis.sort () for line in ginis : print line # les dernières lignes du tableau sont : #(0.86910090569180598, 'Domaine skiable') #(0.88139092467853186, 'Sports nautiques avec au moins une aire de pratique couverte') #(0.89326137963164931, 'Domaine skiable - nombre de pistes') #(0.9348918282098031, 'Parcours sportif avec au moins un parcours couvert') #(0.93902978850018792, 'Domaine skiable avec au moins une piste \xe9clair\xe9e') #(0.94625459043715754, '\xc9quipement de cyclisme avec au moins une piste couverte') #(0.95743849241598267, 'Sports nautiques - nombre de places en tribune') #(0.97248425032547758, 'Domaine skiable avec au moins une piste couverte') #(0.97718065858676906, 'Parcours sportif - nombre de places en tribune') #(0.98637386313881081, 'Terrain de golf - nombre de places en tribune') #(0.98969072164948457, 'Domaine skiable - nombre de places en tribune')
extrait 1 à copier pour l'énoncé de décembre 2013
def deux_recherches(element, liste_impaire, liste_paire) : # .... return position_dans_liste_impaire, position_dans_liste_paire
vérifier que tous les éléments de la liste sont bien retrouvés
l = [ 0, 2, 4, 6, 8, 100, 1000 ] for i in l : print (i,recherche_dichotomique(i, l))
, énoncé 2014
#coding: latin-1 ######### énoncé 1, exercice 1, recherche dichotomique ## question 1 def recherche_dichotomique( element, liste_triee ): """ premier code: http://www.xavierdupre.fr/blog/2013-12-01_nojs.html """ a = 0 b = len(liste_triee)-1 m = (a+b)//2 while a < b : if liste_triee[m] == element : return m elif liste_triee[m] > element : b = m-1 else : a = m+1 m = (a+b)//2 return a l = [ 0, 2, 4, 6, 8, 100, 1000 ] print (recherche_dichotomique(100, l)) # affiche 5 ## question 2 def deux_recherches(element,liste_impair,liste_pair) : if element % 2 == 0 : return recherche_dichotomique(element, liste_pair), -1 else : return -1, recherche_dichotomique(element, liste_impair) lp = [ 0, 2, 4, 6, 8, 100, 1000 ] li = [ 1, 3, 5 ] print (deux_recherches(100, li, lp)) # affiche (5, -1) ## question 3 """ liste coupée liste non coupée (2n) recherche simple 1 + n 2n recherche dichotomique 1 + ln n ln(2n) = 1 + ln(n) coût équivalent """ ## question 4 def recherche_dichotomique( element, liste_triee ): a = 0 b = len(liste_triee)-1 m = (a+b)//2 while a < b : if liste_triee[m] == element : return m elif liste_triee[m] > element : b = m-1 else : a = m+1 m = (a+b)//2 if liste_triee[a] != element : return -1 # ligne ajoutée else : return m # ligne ajoutée l = [ 0, 2, 4, 6, 8, 100, 1000 ] for i in l : print (i,recherche_dichotomique(i, l)) # vérifier qu'on retrouve tous les éléments existant print (recherche_dichotomique(1, l)) # affiche -1 ## question 5 def deux_recherches(element,liste_impair,liste_pair) : i = recherche_dichotomique(element, liste_impair) if i == -1 : return recherche_dichotomique(element, liste_pair) else : return i ##question 6 """ Les logarithmes sont en base 2. coût fonction question 2 : 1001 ( 1 + ln(n) ) = C1 coût fonction question 5 : 1000 ln(n) + 2 ln(n) = C2 C2 - C1 = ln(n) - 1001 > 0 La fonction 5 est plus rapide dans ce cas. """
cas où la recherche n'est plus dichotomique
def recherche_dichotomique( element, liste_triee ): if element not in list_triee : return -1 # ligne A a = 0 b = len(liste_triee)-1 m = (a+b)//2 while a < b : if liste_triee[m] == element : return m elif liste_triee[m] > element : b = m-1 else : a = m+1 m = (a+b)//2 return a
File: td_note_2014.tex, line 110
def deux_recherches(element,liste_impair,liste_pair) : if recherche_dichotomique(element, liste_impair) == -1 : return recherche_dichotomique(element, liste_pair) else : return recherche_dichotomique(element, liste_impair)
, énoncé 2014
#coding: latin-1 ######### énoncé 1, exercice 2 distance de Levenstein ## question 1 def distance_edition(mot1, mot2): """ première fonction retrouvée à : http://www.xavierdupre.fr/blog/2013-12-02_nojs.html """ dist = { (-1,-1): 0 } for i,c in enumerate(mot1) : dist[i,-1] = dist[i-1,-1] + 1 dist[-1,i] = dist[-1,i-1] + 1 for j,d in enumerate(mot2) : opt = [ ] if (i-1,j) in dist : x = dist[i-1,j] + 1 opt.append(x) if (i,j-1) in dist : x = dist[i,j-1] + 1 opt.append(x) if (i-1,j-1) in dist : x = dist[i-1,j-1] + (1 if c != d else 0) opt.append(x) dist[i,j] = min(opt) return dist[len(mot1)-1,len(mot2)-1] print ("****1*") print (distance_edition("levenstein","levenshtein")) # 1 print (distance_edition("bonbon","bonbom")) # 1 print (distance_edition("example","exemples")) # 2 print (distance_edition("esche","eche")) # 1 ## question 2 print ("****2*") print (distance_edition("levenshtein","levenstein")) # 1 print (distance_edition("bonbom","bonbon")) # 1 print (distance_edition("exemples","example")) # 2 print (distance_edition("eche","esche")) # 1 ## question 3 def distance_edition(mot1, mot2): dist = { (-1,-1): 0 } for i,c in enumerate(mot1) : dist[i,-1] = dist[i-1,-1] + 1 dist[-1,i] = dist[-1,i-1] + 1 for j,d in enumerate(mot2) : opt = [ ] if (i-1,j) in dist : x = dist[i-1,j] + 1 opt.append(x) if (i,j-1) in dist : x = dist[i,j-1] + 1 opt.append(x) if (i-1,j-1) in dist : if c == d : x = dist[i-1,j-1] ## elif c in ['n','m'] and d in ['n','m'] : x = dist[i-1,j-1] + 0.5 ## else : x = dist[i-1,j-1] + 1 ## opt.append(x) dist[i,j] = min(opt) return dist[len(mot1)-1,len(mot2)-1] print ("****3*") print (distance_edition("levenstein","levenshtein")) # 1 print (distance_edition("bonbon","bonbom")) # 0.5 print (distance_edition("example","exemples")) # 2 print (distance_edition("esche","eche")) # 1 print (distance_edition("levenshtein","levenstein")) # 1 print (distance_edition("bonbom","bonbon")) # 0.5 print (distance_edition("exemples","example")) # 2 print (distance_edition("eche","esche")) # 1 ## question 4 def distance_edition(mot1, mot2): dist = { (-1,-1): 0 } for i,c in enumerate(mot1) : dist[i,-1] = dist[i-1,-1] + 1 dist[-1,i] = dist[-1,i-1] + 1 for j,d in enumerate(mot2) : opt = [ ] if (i-1,j) in dist : if c == "s" : x = dist[i-1,j] + 0.5 ## else : x = dist[i-1,j] + 1 ## opt.append(x) if (i,j-1) in dist : if d == "s" : x = dist[i,j-1] + 0.5 ## else : x = dist[i,j-1] + 1 ## opt.append(x) if (i-1,j-1) in dist : if c == d : x = dist[i-1,j-1] elif c in ['n','m'] and d in ['n','m'] : x = dist[i-1,j-1] + 0.5 else : x = dist[i-1,j-1] + 1 opt.append(x) dist[i,j] = min(opt) return dist[len(mot1)-1,len(mot2)-1] print ("****4*") print (distance_edition("levenstein","levenshtein")) # 1 print (distance_edition("bonbon","bonbom")) # 0.5 print (distance_edition("example","exemples")) # 1.5 print (distance_edition("esche","eche")) # 0.5 print (distance_edition("levenshtein","levenstein")) # 1 print (distance_edition("bonbom","bonbon")) # 0.5 print (distance_edition("exemples","example")) # 1.5 print (distance_edition("eche","esche")) # 0.5 ## question 5 def distance_edition(mot1, mot2): dist = { (-1,-1): 0 } for i,c in enumerate(mot1) : dist[i,-1] = dist[i-1,-1] + 1 dist[-1,i] = dist[-1,i-1] + 1 for j,d in enumerate(mot2) : opt = [ ] if (i-1,j) in dist : if c == "s" : if i == len(mot1)-1 : x = dist[i-1,j] + 0.2 ## else : x = dist[i-1,j] + 0.5 ## else : x = dist[i-1,j] + 1 opt.append(x) if (i,j-1) in dist : if d == "s" : if j == len(mot2)-1 : x = dist[i,j-1] + 0.2 ## else : x = dist[i,j-1] + 0.5 ## else : x = dist[i,j-1] + 1 opt.append(x) if (i-1,j-1) in dist : if c == d : x = dist[i-1,j-1] elif c in ['n','m'] and d in ['n','m'] : x = dist[i-1,j-1] + 0.5 else : x = dist[i-1,j-1] + 1 opt.append(x) dist[i,j] = min(opt) return dist[len(mot1)-1,len(mot2)-1] print ("****5*") print (distance_edition("levenstein","levenshtein")) # 1 print (distance_edition("bonbon","bonbom")) # 0.5 print (distance_edition("example","exemples")) # 1.2 print (distance_edition("esche","eche")) # 0.5 print (distance_edition("levenshtein","levenstein")) # 1 print (distance_edition("bonbom","bonbon")) # 0.5 print (distance_edition("exemples","example")) # 1.2 print (distance_edition("eche","esche")) # 0.5
File: td_note_2014.tex, line 176
if (i-1,j-1) in dist : x = dist[i-1,j-1] + (0.5 if c != d else 0) # 1 --> 0.5
, énoncé 2014
#coding: latin-1 ######### énoncé 2, exercice 3 distance de Levenstein ## question 1 def distance_edition(mot1, mot2): """ première fonction retrouvée à : http://www.xavierdupre.fr/blog/2013-12-02_nojs.html """ dist = { (-1,-1): 0 } for i,c in enumerate(mot1) : dist[i,-1] = dist[i-1,-1] + 1 dist[-1,i] = dist[-1,i-1] + 1 for j,d in enumerate(mot2) : opt = [ ] if (i-1,j) in dist : x = dist[i-1,j] + 1 opt.append(x) if (i,j-1) in dist : x = dist[i,j-1] + 1 opt.append(x) if (i-1,j-1) in dist : x = dist[i-1,j-1] + (1 if c != d else 0) opt.append(x) dist[i,j] = min(opt) return dist[len(mot1)-1,len(mot2)-1] print ("****1*") print (distance_edition("levenstein","levenstien")) # 2 print (distance_edition("bonbbon","bonbon")) # 1 print (distance_edition("example","exemples")) # 2 ## question 2 print ("****2*") print (distance_edition("levenstien","levenstein")) # 2 print (distance_edition("bonbon","bonbbon")) # 1 print (distance_edition("exemples","example")) # 2 ## question 3 def distance_edition(mot1, mot2): """ première fonction retrouvée à : http://www.xavierdupre.fr/blog/2013-12-02_nojs.html """ dist = { (-1,-1): 0 } for i,c in enumerate(mot1) : dist[i,-1] = dist[i-1,-1] + 1 dist[-1,i] = dist[-1,i-1] + 1 for j,d in enumerate(mot2) : opt = [ ] if (i-1,j) in dist : x = dist[i-1,j] + 1 opt.append(x) if (i,j-1) in dist : x = dist[i,j-1] + 1 opt.append(x) if (i-1,j-1) in dist : x = dist[i-1,j-1] + (1 if c != d else 0) opt.append(x) if (i-2,j-2) in dist : ## if c == mot2[j-1] and d == mot1[i-1] : ## x = dist[i-2,j-2] + 1 ## opt.append(x) ## dist[i,j] = min(opt) return dist[len(mot1)-1,len(mot2)-1] print ("****3*") print (distance_edition("levenstein","levenstien")) # 1 print (distance_edition("bonbbon","bonbon")) # 1 print (distance_edition("example","exemples")) # 2 print (distance_edition("levenstien","levenstein")) # 1 print (distance_edition("bonbon","bonbbon")) # 1 print (distance_edition("exemples","example")) # 2 ## question 4 def distance_edition(mot1, mot2): """ première fonction retrouvée à : http://www.xavierdupre.fr/blog/2013-12-02_nojs.html """ dist = { (-1,-1): 0 } for i,c in enumerate(mot1) : dist[i,-1] = dist[i-1,-1] + 1 dist[-1,i] = dist[-1,i-1] + 1 for j,d in enumerate(mot2) : opt = [ ] if (i-1,j) in dist : x = dist[i-1,j] + 1 opt.append(x) if (i,j-1) in dist : x = dist[i,j-1] + 1 opt.append(x) if (i-1,j-1) in dist : x = dist[i-1,j-1] + (1 if c != d else 0) opt.append(x) if (i-2,j-2) in dist : if c == mot2[j-1] and d == mot1[i-1] : x = dist[i-2,j-2] + 1 opt.append(x) if (i-2,j-1) in dist and c == d == mot1[i-1] : ## x = dist[i-2,j-1] + 0.45 ## opt.append(x) ## if (i-1,j-2) in dist and c == d == mot2[j-1] : ## x = dist[i-1,j-2] + 0.45 ## opt.append(x) ## dist[i,j] = min(opt) return dist[len(mot1)-1,len(mot2)-1] print ("****4*") print (distance_edition("levenstein","levenstien")) # 1 print (distance_edition("bonbbon","bonbon")) # 0.45 print (distance_edition("example","exemples")) # 2 print (distance_edition("levenstien","levenstein")) # 1 print (distance_edition("bonbon","bonbbon")) # 0.45 print (distance_edition("exemples","example")) # 2
File: td_note_2014.tex, line 252
if abs(i-j)==1 and mot1[i]==mot2[j] and (mot1[i+1]==mot2[j-1] or mot1[i-1]==mot2[j+1]):
File: td_note_2014.tex, line 260
if abs(j-i)==1 and mot1[i]==mot2[j] and (mot1[i+1]==mot2[j-1] or mot1[i-1]==mot2[j+1]): dist[i,j] = min(opt)-1 else: dist[i,j]=min(opt)
vérifier que tous les éléments de la liste sont bien retrouvés
l = [ 0, 2, 4, 6, 8, 100, 1000 ] for i in l : print (i,recherche_dichotomique(i, l))
extrait 2 à copier pour l'énoncé de décembre 2013
def deux_recherches(element, liste1, liste2) : # .... return position_dans_liste1, position_dans_liste2
, énoncé 2014
#coding: latin-1 ######### énoncé 1, exercice 1, recherche dichotomique ## question 1 def recherche_dichotomique( element, liste_triee ): """ premier code: http://www.xavierdupre.fr/blog/2013-12-01_nojs.html """ a = 0 b = len(liste_triee)-1 m = (a+b)//2 while a < b : if liste_triee[m] == element : return m elif liste_triee[m] > element : b = m-1 else : a = m+1 m = (a+b)//2 return a l = [ 0, 2, 3, 5, 10, 100, 340 ] print (recherche_dichotomique(100, l)) # affiche 5 ## question 2 def recherche_dichotomique( element, liste_triee ): a = 0 b = len(liste_triee)-1 m = (a+b)//2 while a < b : if liste_triee[m] == element : return m elif liste_triee[m] > element : b = m-1 else : a = m+1 m = (a+b)//2 if liste_triee[a] != element : return -1 # ligne ajoutée else : return m l = [ 0, 2, 4, 6, 8, 100, 1000 ] for i in l : print (i,recherche_dichotomique(i, l)) # vérifier qu'on retrouve tous les éléments existant print (recherche_dichotomique(1, l)) # affiche -1 ## question 3 def deux_recherches(element,liste1,liste2) : return recherche_dichotomique(element, liste1) , \ recherche_dichotomique(element,liste2) l1 = [ 0, 2, 4, 6, 8, 100, 1000 ] l2 = [ 1200, 3000, 4000, 5555 ] print (deux_recherches(100,l1,l2) ) # affiche (5,-1) ## question 4 """ Les logarithmes sont en base 2. cas 1 : 1000 ln(n) + 10 (ln(n) + ln(10n)) = 1020 ln(n) + 10 ln(10) = C1 cas 2 : 1010 ln(n + 10n) = 1010 ln(n) + 1010 ln(11) = C2 delta = C2 - C1 = -10 ln(n) + 1010 ln(11) - 10 ln(10) Conclusion : pour n petit, le cas C1 est préférable, pour les n grands, c'est le cas 2. """ ## question 5 def deux_recherches(element,liste1,liste2) : if element > liste1[-1] : return -1, recherche_dichotomique(element, liste2) else : return recherche_dichotomique(element,liste1), -1 l1 = [ 0, 2, 4, 6, 8, 100, 1000 ] l2 = [ 1200, 3000, 4000, 5555 ] print (deux_recherches(100,l1,l2) ) # affiche (5,-1)
File: td_note_2015.tex, line 51
suites_chemin( [ 0, 1 ], dico ) --> [ [ 0, 1, 2 ] ] suites_chemin( [ 0, 1, 2 ], dico ) --> [ ] # il n'y pas de suite possible
vérifier que tous les éléments de la liste sont bien retrouvés
%l = [ 0, 2, 4, 6, 8, 100, 1000 ] %for i in l : % print (i,recherche_dichotomique(i, l)) %
File: td_note_2015.tex, line 150
dictionnaire [ i,j ] dictionnaire [ (i,j) ]
File: td_note_2015.tex, line 157
mot --> { 0:'', 1:'m', 2:'mo', 3:'mot' }
File: td_note_2015.tex, line 166
vertices = { (i,j): (d1[i],d2[j]) }
File: td_note_2015.tex, line 184
edges = { (i1,j1),(i2,j2) : valeur }
File: td_note_2015.tex, line 190
edges [ (i1,j1),(i2,j2) ] = 1 si (i2-i1 == 1 et j1 == j2) ou (j2-j1 == 1 et i1 == i2)
File: td_note_2016.tex, line 26
def rendement(x, n, r): # .... return
File: td_note_2016.tex, line 34
def decompose_mensualite(K,M,p): # ... return capital, interet
File: td_note_2016.tex, line 43
def mensualites(K,M,p): # .... return [ liste de mensualités ]
File: td_note_2016.tex, line 52
def somme_maximale(M,p,Y): # .... return K max
File: td_note_2016.tex, line 61
def economie(A,S,L,r,Y): # .... return economie
File: td_note_2016.tex, line 81
def bascule(A,S,L,r,Y,C,p): # .... return nombre d'années
File: td_note_2016.tex, line 90
def surface_max(A,L,r,Y,C,p,delay=20): # .... return surface
File: td_note_2016.tex, line 116
adele 06 64 34 22 67 --> 06 46 34 22 67 lettres 06 aa dd ee ll gerard 06 64 34 22 68 --> 06 64 43 22 86 lettres 06 gg ee rr aa
File: td_note_2016.tex, line 124
def transforme_numero(prenom, numero): # .... return
File: td_note_2016.tex, line 158
Adèle 06 64 34 22 67 --> 06 60 34 24 67 lettres 06 aa dd ee ll Gérard 06 64 34 22 68 --> 06 64 37 22 64 lettres 06 gg ee rr aa
File: td_note_2016.tex, line 166
def transforme_numero(prenom, numero): # .... return
File: td_note_2016.tex, line 198
def rendement(x, n, r): # .... return
File: td_note_2016.tex, line 206
def mensualites(K,M,p): # .... return [ liste de mensualités ]
File: td_note_2016.tex, line 215
def somme_maximale(M,p,Y): # .... return K max
File: td_note_2016.tex, line 224
def economie(A,S,L,r,Y): # .... return economie
File: td_note_2016.tex, line 233
def bascule(A,S,L,r,Y,C,p): # .... return nombre d'années
File: td_note_2016.tex, line 256
def A40a30(L,r,Y,C,p): # .... return surface
, correction 2012
# coding: latin-1 # question 1 def frequence_lettre (mot) : res = { } for c in mot : if c in res : res[c] += 1 else : res [c] = 1 return res print frequence_lettre ("aviateur") # affiche {'a': 2, 'e': 1, 'i': 1, 'r': 1, 'u': 1, 't': 1, 'v': 1} # Deux autres écritures de la fonction def frequence_lettre (mot) : res = { c:0 for c in mot } for c in mot : res[c] += 1 return res def frequence_lettre (mot) : res = { } for c in mot : # la méthode get retourne res[c] si cette valeur existe, 0 sinon res[c] = res.get( c, 0 ) + 1 return res # question 2 def anagramme (mot1, mot2) : h1 = frequence_lettre(mot1) h2 = frequence_lettre(mot2) # il fallait éviter d'écrire la ligne suivante bien qu'elle retourne le résultat cherché : # return h1 == h2 for c in h1 : if c not in h2 or h1[c] != h2[c] : return False # il ne faut pas oublier cette seconde partie for c in h2 : if c not in h1 : return False return True a,b = "anagramme", "agrammane" print anagramme (a,b), anagramme (b,a) # affiche True, True # on vérifie que la fonctionne marche aussi dans l'autre cas a,b = "anagramme", "agrummane" print anagramme (a,b), anagramme (b,a) # affiche False, False # on pouvait faire plus rapide en éliminant les cas évidents def anagramme (mot1, mot2) : if len(mot1) != len(mot2) : return False h1 = frequence_lettre(mot1) h2 = frequence_lettre(mot2) if len(h1) != len(h2) : return False for c in h1 : if h1[c] != h2.get(c, 0) : return False return True
, correction 2012
# coding: latin-1 # question 1 def factorielle (n) : res = 1 while n > 1 : res *= n n -= 1 return res print factorielle (3) # voici la version récursive qui n'était pas demandée : def factorielle_recursive (n) : return n*factorielle_recursive (n-1) if n > 1 else 1 # question 2 def f(a,b) : # f(a,b) = f(a-1,b) + f(a,b-1) # la formule implique de calculer toutes les valeurs f(i,j) # avec (i,j) dans [[0,a]] x [[0,b]] # un moyen afin d'éviter de trop nombreux calculs est de # stocker les valeurs intermédiaires de f dans une matrice # il faut ensuite s'assurer que f(a-1,b) et f(a,b-1) # ont déjà été calculées avant de calculer f(a,b) # pour cela, on parcourt la matrice dans le sens des i et j croissants # il ne faut pas oublier les a+1,b+1 car range (a) est égal à [ 0,1, ..., a-1 ] mat = [ [ 0 for i in range (b+1) ] for j in range (a+1) ] for i in range (a+1) : for j in range (b+1) : if i == 0 or j == 0 : mat [i][j] = max (i,j) else : mat [i][j] = mat [i-1][j] + mat[i][j-1] return mat [a][b] # on teste pour des valeurs simples print f(0,5) # affiche 5 print f(1,1) # affiche 2 # on vérifie en suite que cela marche pour a < b et b > a print f (4,5) # affiche 210 print f (5,4) # affiche 210 # autres variantes # la version récursive ci-dessous est juste beaucoup plus longue, elle appelle # la fonction f_recursive autant de fois que la valeur retournée # par la fonction cout_recursive alors que la fonction précédente # effectue de l'ordre de O(a*b) calculs def f_recursive(a,b) : return f_recursive(a-1,b) + f_recursive(a,b-1) if a > 0 and b > 0 else max(a,b) def cout_recursive(a,b) : return cout_recursive(a-1,b) + cout_recursive(a,b-1) if a > 0 and b > 0 else 1 # une autre version non récursive def f(a,b) : mat = { } for i in range (a+1) : for j in range (b+1) : mat [i,j] = mat [i-1,j] + mat[i,j-1] if i > 0 and j > 0 else max (i,j) return mat [a,b]
, correction 2012
def f_recursive(a,b, memoire) : if (a,b) in memoire : return memoire [a,b] else : res = f_recursive(a-1,b, memoire) + f_recursive(a,b-1, memoire) \ if a > 0 and b > 0 else max(a,b) memoire [a,b] = res return res
, correction 2012
# coding: latin-1 # question 1 def somme_partielle (li, i, j) : r = 0 for a in range (i,j) : r += li [a] return r # question 2 def plus_grande_sous_liste (li) : meilleur = min(li) # ligne A im,jm = -1,-1 for i in range (0,len(li)) : for j in range (i+1, len(li)+1) : # ne pas oublier +1 car sinon # le dernier élément n'est jamais pris en compte s = somme_partielle(li, i,j) if s > meilleur : meilleur = s im,jm = i,j return li [im:jm] # si li ne contient que des valeurs positives, la solution est évidemment la liste entière # c'est pourquoi il faut tester cette fonction avec des valeurs négatives li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste(li) print(m) # affiche [79, 9, 7, 7] # autre version plus courte def plus_grande_sous_liste (li) : solution = [ (somme_partielle(li,i,j), i, j) \ for i in range (0,len(li)) \ for j in range (i+1, len(li)+1) ] m = max(solution) return li [m[1]:m[2]]
, correction 2012
def plus_grande_sous_liste_n2 (li) : meilleur = 0 im,jm = -1,-1 for i in range (0,len(li)) : s = 0 for j in range (i, len(li)) : s += li[j] if s > meilleur : meilleur = s im,jm = i,j+1 return li [im:jm] li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste_n2(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste_n2(li) print(m) # affiche [79, 9, 7, 7]
, correction 2012
#coding:latin-1 def plus_grande_sous_liste_rapide_r (li, i,j) : if i == j : return 0 elif i+1 == j : return li[i],i,i+1 milieu = (i+j)//2 # on coupe le problème deux ma,ia,ja = plus_grande_sous_liste_rapide_r (li, i, milieu) mb,ib,jb = plus_grande_sous_liste_rapide_r (li, milieu, j) # pour aller encore plus vite dans un cas précis if ja == ib : total = ma+mb im,jm = ia,jb else : # on étudie la jonction im,jm = milieu,milieu+1 meilleur = li[milieu] s = meilleur for k in range (milieu+1, j) : s += li[k] if s > meilleur : meilleur = s jm = k+1 total = meilleur meilleur = li[milieu] s = meilleur for k in range (milieu-1, i-1, -1) : s += li[k] if s > meilleur : meilleur = s im = k total += meilleur - li[milieu] if ma >= max(mb,total) : return ma,ia,ja elif mb >= max(ma,total) : return mb,ib,jb else : return total,im,jm def plus_grande_sous_liste_rapide (li) : m,i,j = plus_grande_sous_liste_rapide_r (li,0,len(li)) return li[i:j] li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste_rapide(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste_rapide(li) print(m) # affiche [79, 9, 7, 7]
, correction 2012
#-*- coding: latin-1 -*- def plus_grande_sous_liste_n (li) : meilleur = [ None for i in li ] somme = [ None for i in li ] best = None for i,el in enumerate(li): if i == 0 or meilleur[i-1] is None: meilleur[i] = i somme[i] = el if best is None or somme[i] > somme[best]: best = i else: if el >= 0 or somme[i-1] > -el : meilleur[i] = meilleur[i-1] somme[i] = somme[i-1] + el if best is None or somme[i] > somme[best]: best = i i,j = meilleur[best], best+1 return li [i:j] li = [ 4,-6,7,-1,8,-50,3] m = plus_grande_sous_liste_n(li) print(m) # affiche [7, -1, 8] li = [1,2,3,4,5,-98,78,9,7,7] m = plus_grande_sous_liste_n(li) print(m) # affiche [79, 9, 7, 7]
File: interro_rapide_45_minutes_2012_12.tex, line 24
s = [ random.randint(0,20) for i in range(0,10000) ]
, correction 2012
#coding:latin-1 # correction exerice 1 import random # question 1, version 1 (version abrégée) def ecart_moyen (s) : positions = [ j for j,e in enumerate(s) if e == 0 ] dd = [ positions[j] - positions[j-1] for j in range(1,len(positions)) ] # une division entière retourne 0, il faut multiplier par 1.0 return 1.0*sum(dd) / len(dd) s = [ random.randint(0,20) for i in range(0,10000) ] print ecart_moyen(s) # question 1, version 2 (version plus longue) def ecart_moyen (s) : positions = [ ] for j in range(len(s)) : if s[j] == 0 : positions.append (j) ecart = 0 for j in range(len(positions)-1) : ecart += positions[j+1] - positions[j] # on return ecart*1.0 / (len(positions)-1) # question 1, version 3 (version courte + astuce) def ecart_moyen (s) : # moyenne des écarts = (dernière position - première position) / (nombre de positions - 1) positions = [ j for j,e in enumerate(s) if e == 0 ] return (positions [-1] - positions [0])*1.0 / (len(positions)-1) # question 2, version 1 def tirage_sans_remise () : l = [ random.randint(0,20) ] while len(l) < 4 : x = random.randint(0,20) if x not in l : l.append (x) return l def moyenne () : s = 0 for i in range(0,10000) : l = tirage_sans_remise () l.sort() s1 = l[0]+l[1] s2 = l[2]+l[3] if s1*2 >= s2 : s+=1 return s*1.0/10000 print "v1", moyenne() # question 2, version 2 def tirage_sans_remise () : l = range(0,20) random.shuffle(l) return l[:4] def moyenne () : s = 0 for i in range(0,10000) : l = tirage_sans_remise () l.sort() s1 = l[0]+l[1] s2 = l[2]+l[3] if s1*2 >= s2 : s+=1 return s*1.0/10000 print "v2",moyenne() # question 3 def combinaison (N = 100) : # res [ n,p ] res = { } res [0,0] = res [1,0] = res[1,1] = 1.0 for n in range (2, N) : res [n,0] = 1.0 res [n,n] = 1.0 for p in range (1,n/2+1) : res [n,p] = res [n-1,p] + res[n-1,p-1] res [n,n-p] = res [n,p] return res if False : # pour éviter des affichages trop longs d = combinaison (100) for n,p in sorted(d) : print "c(n=%d,p=%s)=%f" % (n,p,d[n,p]) # question 4 def ordonne (mat) : # on concatène toutes les lignes suml = [ ] for l in mat : suml += l # on trie suml.sort() # et on crée une autre matrice nc = len(mat[0]) #nombre de colonne res = [ suml[ i*nc: i*nc+nc] for i in range (0, len(mat)) ] return res l = [[4,5], [3, 7], [1,2] ] print ordonne(l) # affiche [[1, 2], [3, 4], [5, 7]]
File: interro_rapide_45_minutes_2012_12.tex, line 81
li = [[0, 1, 2, 4], [4, 5, 6, 8], [8, 9, 10, 12], [12, 13, 14, 16]] random.shuffle(li) print li # example : [[8, 9, 10, 12], [12, 13, 14, 16], [4, 5, 6, 8], [0, 1, 2, 4]]
File: interro_rapide_45_minutes_2012_12.tex, line 92
l = ["chat", "chats", "chien", "chiens", "cheval", "chevaux" ] def nombre_moyen_voyelles (l) : ...
File: interro_rapide_45_minutes_2012_12.tex, line 108
mots = ["paris", "texas", "montmartre", "wim", "wenders", "france"] texte = "paris texas est un film de wim wenders ce paris n'est pas en france mais au texas"]
, correction 2012
#coding:latin-1 # correction exerice 2 import random # question 1, version 1 # l'astuce consiste à transposer la matrice def shuffle_colonne (li) : tr = [ [ li [j][i] for j in range(len(li[0])) ] for i in range(len(li))] random.shuffle(tr) res = [ [ tr [j][i] for j in range(len(tr[0])) ] for i in range(len(tr))] return res li = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]] print shuffle_colonne (li) # question 2 def nombre_moyen_voyelle (l) : s = 0 # nombre total de voyelles ts = 0 # nombre total de lettres for m in l : ts += len(m) for c in m : if c in "aeiouy" : s += 1 return s * 1.0 / ts l = ["chat", "chats", "chien", "chiens", "cheval", "chevaux" ] print "voyelle", nombre_moyen_voyelle (l) # 0.3333 # question 3 def tirage_avec_remise () : l = [ random.randint(0,20) for i in range(0,4) ] l.sort() return l def moyenne () : s = 0 for i in range(0,10000) : l = tirage_avec_remise () l.sort() s1 = l[0]+l[1] s2 = l[2]+l[3] if s1*2 >= s2 : s+=1 return s*1.0/10000 print "v1", moyenne() # question 4, version 1 def compte_pairs (mots, texte) : p = 0 for m in mots : for mm in mots : t = m + " " + mm if t in texte : p += 1 return p mots = ["paris", "texas", "montmartre", "wim", "wenders", "france"] texte = "paris texas est un film de wim wenders ce paris n'est pas en france mais au texas" print compte_pairs(mots, texte) # affiche 2 # question 4, version 2 def compte_pairs (mots, texte) : dec = texte.split() p = 0 for i in range(1,len(dec)) : if dec[i-1] in mots and dec[i] in mots : p += 1 return p mots = ["paris", "texas", "montmartre", "wim", "wenders", "france"] texte = "paris texas est un film de wim wenders ce paris n'est pas en france mais au texas" print compte_pairs(mots, texte) # affiche 2
File: exercice_2013_leftover.tex, line 25
l = ["par", "parti", "pas", "pars"] t = "parpasparspasparti"
File: exercice_2013_leftover.tex, line 31
s.startswith(d) # retourne True si la chaîne de caractères s # commence par d s [i:j] # extrait la sous-chaîne de caractère entre les positions i et j (exclu)
File: exercice_2013_leftover.tex, line 49
l = ["a", "aa"] t = "aaa"
, correction 2012
#coding:latin-1 def decoupage (mots, texte) : res = [ ] # si le texte est vide, le résultat l'est aussi if len(texte) == 0 : return res # on parcourt tous les mots de la liste for m in mots : if texte.startswith (m) : # si un mot commence la chaîne de caractères texte # on ajoute ce mot au résultat res.append (m) # on soustrait ce mot au texte texte = texte [ len(m) : ] # on appelle la fonction decoupage sur le reste du texte res += decoupage (mots, texte) return res # si aucun mot de la liste ne commence texte res.append (texte[0]) texte = texte [ 1 : ] res += decoupage (mots, texte) return res l = ["par", "parti", "pas", "pars"] t = "parpasparspasparti" d = decoupage (l, t) print d # ['par', 'pas', 'par', 's', 'pas', 'par', 't', 'i'] print " ".join (d) # par pas par s pas par t i
File: exercice_2013_leftover.tex, line 60
# on trie les mots par ordre décroissant de taille l = [ (len(m), m) for m in l ] l.sort(reverse = True) l = [ c[1] for c in l ] d = decoupage (l, t) print " ".join (d) # par pas pars pas parti
, correction 2012
#coding:latin-1 def decoupage (mots, texte) : res = [ ] # on parcourt tous les mots de la liste while len(texte) > 0 : # on a besoin de cette variable pour dire si on a trouvé un mot # de la liste qui commence texte motliste = False for m in mots : if texte.startswith (m) : res.append (m) texte = texte [ len(m) : ] motliste = True break if not motliste : res.append (texte[0]) texte = texte [ 1 : ] return res l = ["par", "parti", "pas", "pars"] t = "parpasparspasparti" d = decoupage (l, t) print " ".join (d) # par pas par s pas par t i
, correction 2012
#coding:latin-1 def decoupages (mots, texte) : res = [ ] if len(texte) == 0 : return res trouve = False for m in mots : if texte.startswith (m) : trouve = True fin = texte [ len(m) : ] ds = decoupages (mots, fin) if len(ds) == 0 : # dans ce cas, cela veut dire fin est vide # le seul découpage possible est [ m ] res.append ( [ m ] ) else : # dans ce cas, l'ensemble des découpages possibles # est construit selon le schéma suivant : # m + un découpage de ds for d in ds : td = [ m ] + d res.append ( td ) if not trouve : # ici, on retrouve le même code que précédemment # mais pour un seul caractère m = texte [0] fin = texte [ 1 : ] ds = decoupages (mots, fin) if len(ds) == 0 : res.append ( [ m ] ) else : for d in ds : td = [ m ] + d res.append ( td ) return res l = ["par", "parti", "pas", "pars"] t = "parpasparspasparti" ds = decoupages (l, t) for d in ds : print " ".join (d) l = ["a", "aa"] t = "aaa" ds = decoupages (l, t) for d in ds : print " ".join (d)
File: exercice_2013_leftover.tex, line 80
par pas par s pas par t i par pas par s pas parti par pas pars pas par t i par pas pars pas parti a a a a aa aa a
File: exercice_2013_leftover.tex, line 92
l = ["a", "aa", "b", "bb"] t = "aaabbb" ds = decoupages (l, t) for d in ds : print " ".join (d)
File: exercice_2013_leftover.tex, line 102
a a a b b b a a a b bb a a a bb b a aa b b b a aa b bb a aa bb b aa a b b b aa a b bb aa a bb b
File: exercice_2013_leftover.tex, line 116
1 aaabbb 2 aabbb 3 abbb 4 bbb 5 bb 6 b 7 b 8 bbb 9 bb 10 b 11 b 12 abbb 13 bbb 14 bb 15 b 16 b
, correction 2012
#coding:latin-1 def decoupage (mots, texte) : res = [ ] # si le texte est vide, le résultat l'est aussi if len(texte) == 0 : return res # on parcourt tous les mots de la liste for m in mots : if texte.startswith (m) : # si un mot commence la chaîne de caractères texte # on ajoute ce mot au résultat res.append (m) # on soustrait ce mot au texte texte = texte [ len(m) : ] # on appelle la fonction decoupage sur le reste du texte res += decoupage (mots, texte) return res # si aucun mot de la liste ne commence texte res.append (texte[0]) texte = texte [ 1 : ] res += decoupage (mots, texte) return res l = ["par", "parti", "pas", "pars"] t = "parpasparspasparti" d = decoupage (l, t) print d # ['par', 'pas', 'par', 's', 'pas', 'par', 't', 'i'] print " ".join (d) # par pas par s pas par t i
File: exercice_2013_leftover.tex, line 142
1 aaabbb 2 aabbb 3 abbb 4 bbb 5 bb 6 b
File: exercice_2013_leftover.tex, line 176
a = 10.**i/3 c = 10.**(-i)/4*3 b = 1
File: exercice_2013_leftover.tex, line 189
import time, math debut = time.clock() y = 0 N = 1000000 for i in range (1,N+1) : s = i*1.0/N x = math.log(s) y += x fin = time.clock() print "integ ",y/N print "temps ",fin - debut
File: exercice_2013_leftover.tex, line 209
import time, math debut = time.clock() y = 0 N = 1000000 z = math.log(N) for i in range (1,N+1) : x = math.log(i*1.0) y += x y -= z*N fin = time.clock() print "integ ",y/N print "temps ",fin - debut
File: exercice_2013_leftover.tex, line 229
import time, math debut = time.clock() def monlog (i) : return math.log(i) y = 0 N = 1000000 z = math.log(N) for i in range (1,N+1) : x = monlog(i*1.0) y += x y -= z*N fin = time.clock() print "integ ",y/N print "temps ",fin - debut
File: exercice_2013_leftover.tex, line 249
integ -0.999992173306 temps 0.780309832669
File: exercice_2013_leftover.tex, line 256
integ -0.999992173306 temps 0.5965760959
File: exercice_2013_leftover.tex, line 263
integ -0.999992173306 temps 0.698039702544
File: exercice_2013_leftover.tex, line 281
import time, math debut = time.clock() y = 0 N = 1000000 z = math.log(N) for i in range (1,N+1) : x = math.log(i*1.0) y += x y -= z*N fin = time.clock() print "integ ",y/N print "temps ",fin - debut
File: exercice_2013_leftover.tex, line 303
import time, math debut = time.clock() def monlog (i) : return math.log(i) y = 0 N = 1000000 z = math.log(N) for i in range (1,N+1) : x = monlog(i*1.0) y += x y -= z*N fin = time.clock() print "integ ",y/N print "temps ",fin - debut
File: exercice_2013_leftover.tex, line 325
import time, math memolog = { } for i in range(1,N+1) : memolog [i] = math.log(i) debut = time.clock() y = 0 N = 1000000 z = math.log(N) for i in range (1,N+1) : x = memolog[i] y += x y -= z*N fin = time.clock() print "integ ",y/N print "temps ",fin - debut
File: exercice_2013_leftover.tex, line 347
integ -0.999992173306 temps 0.6014340817
File: exercice_2013_leftover.tex, line 354
integ -0.999992173306 temps 0.68944518564
File: exercice_2013_leftover.tex, line 361
integ -0.999992173306 temps 0.424331883008
File: exercice_2013_leftover.tex, line 387
l = ["par", "parti", "pas", "pars"] t = "parpasparspasparti"
File: exercice_2013_leftover.tex, line 393
s.startswith(d) # retourne True si la chaîne de caractères s # commence par d s [i:j] # extrait la sous-chaîne de caractère entre les positions i et j (exclu)
File: exercice_2013_leftover.tex, line 410
a = 10.0**i/3 # ne pas changer 10.0 en 10 pour éviter c = 10.0**(-i)/4*3 # les problèmes de calculs avec des entiers b = 1 # ** est l'opérateur puissance
, correction 2012
# coding: latin-1 # question 1 def frequence_lettre (mot) : res = { } for c in mot : if c in res : res[c] += 1 else : res [c] = 1 return res print frequence_lettre ("aviateur") # affiche {'a': 2, 'e': 1, 'i': 1, 'r': 1, 'u': 1, 't': 1, 'v': 1} # Deux autres écritures de la fonction def frequence_lettre (mot) : res = { c:0 for c in mot } for c in mot : res[c] += 1 return res def frequence_lettre (mot) : res = { } for c in mot : # la méthode get retourne res[c] si cette valeur existe, 0 sinon res[c] = res.get( c, 0 ) + 1 return res # question 2 def anagramme (mot1, mot2) : h1 = frequence_lettre(mot1) h2 = frequence_lettre(mot2) # il fallait éviter d'écrire la ligne suivante bien qu'elle retourne le résultat cherché : # return h1 == h2 for c in h1 : if c not in h2 or h1[c] != h2[c] : return False # il ne faut pas oublier cette seconde partie for c in h2 : if c not in h1 : return False return True a,b = "anagramme", "agrammane" print anagramme (a,b), anagramme (b,a) # affiche True, True # on vérifie que la fonctionne marche aussi dans l'autre cas a,b = "anagramme", "agrummane" print anagramme (a,b), anagramme (b,a) # affiche False, False # on pouvait faire plus rapide en éliminant les cas évidents def anagramme (mot1, mot2) : if len(mot1) != len(mot2) : return False h1 = frequence_lettre(mot1) h2 = frequence_lettre(mot2) if len(h1) != len(h2) : return False for c in h1 : if h1[c] != h2.get(c, 0) : return False return True
programme non corrigé
def fonction_mystere(a,b) : am = a.split() bm = b.split() r = 0 for c in am : if c in bm : r += 1 return r / (len(am)-r+len(bm) print ( fonction_mystere ("deux mots", "et trois mots"))
File: interro_rapide_30_minutes_2013_10.tex, line 39
File "interro_rapide_30_minutes_2013_10_1.py", line 10 print ( fonction_mystere ("deux mots", "et trois mots")) ^ SyntaxError: invalid syntax
même fonction gérant le cas des mots vides
def fonction_mystere(a,b) : am = a.split() bm = b.split() if len(am) == 0 and len(bm) == 0 : return 0.0 r = 0 for c in am : if c in bm : r += 1 return r / (len(am)-r+len(bm))
triangle de Pascal
pascal = { } for i in range(1,100) : # A pascal[i,0] = 1 pascal[i,i] = 1 # B for j in range(0,i) : # C pascal [i,j] = pascal [i-1,j-1] + pascal[i-1,j] (ligne 10 mentionnée dans l'erreur) print (pascal[5,4])
File: interro_rapide_45_minutes_2013_12.tex, line 43
Traceback (most recent call last): File "interro_rapide_45_minutes_2013_12_1.py", line 10, in <module> pascal [i,j] = pascal [i-1,j-1] + pascal[i-1,j] KeyError: (0, -1)
calcul de la somme des chiffres d'un entier positif (1)
def somme_chiffre (i) : return sum ( [ int(c) for c in str(i) ] ) print (somme_chiffre(199))
calcul de la somme des chiffres d'un entier positif (2)
def somme_chiffre (i) : s = 0 while i > 0 : s += i % 10 i //= 10 return s
divisible par 11
def division_11 (i) : spair = 0 simpair = 0 pos = 1 # la première position est 1 while i > 0 : if pos % 2 == 0 : spair += i % 10 else : simpair += i % 10 i //= 10 pos += 1 diff = abs(spair - simpair) if diff == 0 : return True elif diff < 11 : return False elif diff == 11 : return True else : return division_11(diff) for i in [7,11,55,100,121,1001,3003,4000] : print (i,division_11(i))
suite de Fibonacci
n = 100 fibo = [ 0 ] * (n+1) # A fibo[0] = 1 for i in range(2,n) : # B fibo[i] = fibo[i-1] + fibo[i-2] # C print (fibo[n]) #affiche zéro
diviseurs d'un nombre entier
def diviseur (i) : div = [ ] for d in range (1, i//2+1) : if i % d == 0 : div.append(d) return div print (diviseur (11)) print (diviseur (512))
nombre parfait
def nombre_parfait (i) : div = diviseur(i) return sum(div) == 2*i for i in range(115,125) : print (i, nombre_parfait(i), diviseur(i))
question 1.1 : remplacer des accents
File: interro_rapide_20_minutes_2014_10.tex, line 31
from math import log s = 0 N = 100 while N > 1 : for i in range(1, N): s += log(i) N //= 2 print(s)
question 1.1 : remplacer des accents
File: interro_rapide_20_minutes_2014_10.tex, line 83
s = 0 ii = 1 N = 7 for i in range(1,N): ii *= 2 for k in range(1,ii): s += log(k) print(s)
File: interro_rapide_20_minutes_2014_11.tex, line 23
nbs = [ 1, 5, 4, 7 ] for n in nbs: s += n ----> 3 s += n NameError: name 's' is not defined
File: interro_rapide_20_minutes_2014_11.tex, line 35
def f(x) : return x%2 nbs = { i:f(i) for i in range(0,5) }
File: interro_rapide_20_minutes_2014_11.tex, line 42
def ma_fonction(x1,y1,x2,y2): d = (x1-x2)**2 +(y1-y2)**2 print(d) d = ma_fonction(0,0,1,1) print(d) ----- 2 None
File: interro_rapide_20_minutes_2014_11.tex, line 55
n = 0 N = 100 for i in range(0,N): for k in range(0,i): n += N
File: interro_rapide_20_minutes_2014_11.tex, line 66
a = 3 b = "6" a+b a*b
File: interro_rapide_20_minutes_2014_11.tex, line 91
nbs = ( 1, 5, 4, 7 ) nbs[0] = 0 ----> 2 nbs[0] = 0 TypeError: 'tuple' object does not support item assignment
File: interro_rapide_20_minutes_2014_11.tex, line 102
d = {4: 'quatre'} c = d.get('4', None)
File: interro_rapide_20_minutes_2014_11.tex, line 109
N = 8 s = 0 while N > 0 : for i in range(N): s += 1 N //= 2 x = (s+1)//2
File: interro_rapide_20_minutes_2014_11.tex, line 121
l = ['a', 'b', 'c'] c = l[1]
File: interro_rapide_20_minutes_2014_11.tex, line 128
def fonction(N): l = None for i in range(N): if l is None : l = [ ] l.append(i) return l ma_liste = fonction(???) ma_liste.append(-1) ---- ----> 8 ma_liste.append(-1) AttributeError: 'NoneType' object has no attribute 'append'
File: interro_rapide_20_minutes_2014_11.tex, line 171
l = [ 0, 1,2,3] for i in range(len(l)): print(i) del l[i] ---- 0 1 2 ---- ----> 4 del l[i] IndexError: list assignment index out of range
File: interro_rapide_20_minutes_2014_11.tex, line 187
a = 2 for i in range(1,5): a += a
File: interro_rapide_20_minutes_2014_11.tex, line 198
x = 2.67 y = int ( x * 2 ) / 2
File: interro_rapide_20_minutes_2014_11.tex, line 206
def moyenne(l): s = 0 for x in l : print("*") s += x return s / len(l) def variance(l): return sum ( [ (x - moyenne(l))**2 for x in l ] ) / len(l) l = [ random.random() for i in range(0,100) ] print(variance(l)**0.5)
File: interro_rapide_20_minutes_2014_11.tex, line 221
import random x = random.randint(0,100) while x != 50: x = random.randint(0,100)
File: interro_rapide_20_minutes_2015_09.tex, line 23
tab = [1, 3] for i in range(0, len(tab)): print(tab[i] + tab[i+1])
File: interro_rapide_20_minutes_2015_09.tex, line 32
n = 1 if n = 1: y = 0 else: y = 1
File: interro_rapide_20_minutes_2015_09.tex, line 61
y = "a" * 3 + 1 z = 3 * "a" + 1 print(y,z)
File: interro_rapide_20_minutes_2015_09.tex, line 70
l = [] for i in range(0, 10): l.append([i]) print(l)
File: interro_rapide_20_minutes_2015_10.tex, line 23
import random l = [0, 1, 2, 3, 4] i = random.randint(0, 5) del l[i]
File: interro_rapide_20_minutes_2015_10.tex, line 33
mat = {} for i in range(0,3) and j in range(0,3): mat[i,j] = 0
File: interro_rapide_20_minutes_2015_10.tex, line 60
i = 2 if i == 2: i = 1 else: i = 2
File: interro_rapide_20_minutes_2015_10.tex, line 71
l = {{}} for i,j in zip(range(0,3), range(0,3)): l[i,j] = 1
File: interro_rapide_20_minutes_2015_10.tex, line 79
----> 1 l = {{}} 2 for i,j in zip(range(0,3), range(0,3)): 3 l[i,j] = 1 4 l TypeError: unhashable type: 'dict'
File: ecrit_2006.tex, line 28
l = [ 0,1,2,3,4,6,5,8,9,10] res = True for i in range (1,len (l)) : if l[i-1] > l[i] : res = False
File: ecrit_2006.tex, line 58
def somme (n) : return sum ( [ int (c) for c in str (n) ] )
File: ecrit_2006.tex, line 66
def somme (n) : l = str (n) # il ne faut pas confondre l=str (n) avec l = "n" s = 0 for c in l : # ou for i in range (0, len (c)) : s += int (c) # ou s += int (c [i]) return s
File: ecrit_2006.tex, line 78
def somme (n) : s = 0 while n > 0 : s += n % 10 n /= 10 # ici, c'est une division entière, si vous n'êtes pas sûr : # n = int (n/10) return n
File: ecrit_2006.tex, line 91
def somme (n) : if n <= 0 : return 0 else : return (n % 10) + somme ( n / 10 )
File: ecrit_2006.tex, line 100
import math def somme (n) : k = int (math.log (n) / math.log (10) + 1) s = 0 for i in range (1,k+1) : d = 10 ** i # ou encore d = int (exp ( k * log (10) ) ) c = n / d e = n - c * d f = e / (d / 10) s += f return s
File: ecrit_2006.tex, line 128
n = 0 for i in range (0,10) : if (n + i) % 3 == 0 : n += 1
File: ecrit_2006.tex, line 177
def grenouille (n) : if n == 2 : return 2 elif n == 1 : return 1 else : return grenouille (n-1) + grenouille (n-2) print grenouille (13)
File: ecrit_2006.tex, line 191
def grenouille (fin, n = 2, u1 = 1, u2 = 2) : if fin == 1 : return u1 elif fin == 2 : return u2 elif n == fin : return u2 u = u1 + u2 return grenouille (fin, n+1, u2, u) print grenouille (13)
File: ecrit_2006.tex, line 205
def grenouille (n) : if n == 1 : return 1 u1 = 1 u2 = 2 for i in range (3,n+1) : u = u1 + u2 # il est impossible de u1 = u2 # résumer ces trois lignes u2 = u # en deux return u2 print grenouille (13)
File: ecrit_2006.tex, line 222
def grenouille (n) : if n == 1 : return 1 u = [1,2] for i in range (2,n) : u.append (u [i-1] + u [i-2]) return u [n-1] print grenouille (12)
File: ecrit_2006.tex, line 236
def grenouille (n) : if n == 1 : return 1 u = range (0, n) # il ne faut pas oublier de créer le tableau # avec autant de cases que nécessaire # ici 13 u [0] = 1 u [1] = 2 for i in range (2,n) : u [i] = u [i-1] + u [i-2] return u [n-1] print grenouille (12)
File: ecrit_2006.tex, line 261
a = "abcdefghijklmnopqrstuvwxyz" print len (a) d = {} for i in range (0,len (a)) : d [ a [ i ] ] = i print d ["M"]
File: ecrit_2006.tex, line 274
examen.py:14: KeyError: 'M'
File: ecrit_2006.tex, line 288
a = "abcdefghijklmnopqrstuvwxyz" print len (a) d = {} for i in range (0,len (a)) : d [ a [ i ] ] = i print d ["m"] ###### ligne modifiée
File: ecrit_2006.tex, line 301
a = "abcdefghijklmnopqrstuvwxyz" a = a.upper () ####### ligne ajoutée print len (a) d = {} for i in range (0,len (a)) : d [ a [ i ] ] = i print d ["M"]
File: ecrit_2006.tex, line 324
def somme (tab) : l = tab[0] for i in range (1, len (tab)) : l += tab [i] return l ens = [[0,1],[2,3]] print somme ( ens ) # affiche [0,1,2,3] print ens # affiche [ [0,1,2,3], [2,3] ]
File: ecrit_2006.tex, line 345
import copy ###### ligne ajoutée def somme (tab) : l = copy.copy (tab[0]) ###### ligne modifiée for i in range (1, len (tab)) : l += tab [i] return l ens = [[0,1],[2,3]] print somme ( ens ) # affiche [0,1,2,3] print ens # affiche [ [0,1,2,3], [2,3] ]
File: ecrit_2006.tex, line 360
def somme (tab) : l = [] ###### ligne modifiée for i in range (0, len (tab)) : ###### ligne modifiée l += tab [i] return l ens = [[0,1],[2,3]] print somme ( ens ) # affiche [0,1,2,3] print ens # affiche [ [0,1,2,3], [2,3] ]
File: ecrit_2006.tex, line 382
li = range (0,10) sup = [0,9] for i in sup : del li [i] print li
File: ecrit_2006.tex, line 393
examen.py:44: IndexError: list assignment index out of range
File: ecrit_2006.tex, line 406
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
File: ecrit_2006.tex, line 410
[ 1, 2, 3, 4, 5, 6, 7, 8, 9]
File: ecrit_2006.tex, line 416
li = range (0,10) sup = [9,0] ####### ligne modifiée for i in sup : del li [i] print li
File: ecrit_2006.tex, line 439
l = ["un", "deux", "trois", "quatre", "cinq"] for i in range (0,len (l)) : mi = i for j in range (i, len (l)) : if l[mi] < l [j] : mi = j e = l [i] l [mi] = l [i] l [i] = e print l
File: ecrit_2006.tex, line 455
['un', 'deux', 'deux', 'deux', 'cinq']
File: ecrit_2006.tex, line 470
l = ["un", "deux", "trois", "quatre", "cinq"] for i in range (0,len (l)) : mi = i for j in range (i, len (l)) : if l[mi] < l [j] : mi = j e = l [mi] ######## ligne modifiée l [mi] = l [i] l [i] = e print l
File: ecrit_2006.tex, line 499
def moyenne (tab) : s = 0.0 for x in tab : s += x return s / len (tab) def variance (tab) : s = 0.0 for x in tab : t = x - moyenne (tab) s += t * t return s / len (tab) l = [ 0,1,2, 2,3,1,3,0] print moyenne (l) print variance (l)
File: ecrit_2006.tex, line 529
def variance (tab) : s = 0.0 m = moyenne (tab) for x in tab : t = x - m s += t * t return s / len (tab)
File: ecrit_2006.tex, line 563
class carre : def __init__ (self, a) : self.a = a def surface (self) : return self.a ** 2 class rectangle (carre) : def __init__ (self, a,b) : carre.__init__(self,a) self.b = b def surface (self) : return self.a * self.b
File: ecrit_2006.tex, line 582
class rectangle : def __init__ (self, a,b) : self.a = a self.b = b def surface (self) : return self.a * self.b class carre (rectangle) : def __init__ (self, a) : rectangle.__init__ (self, a,a) def surface (self) : return self.a ** 2
File: ecrit_2006.tex, line 616
class carre : def __init__ (self, a) : self.a = a def surface (self) : return self.a ** 2 class rectangle (carre) : def __init__ (self, a,b) : carre.__init__(self,a) self.b = b def surface (self) : return self.a * self.b class losange (carre) : def __init__ (self, a,theta) : carre.__init__(self,a) self.theta = theta def surface (self) : return self.a * math.cos (self.theta) * self.a * math.sin (self.theta) * 2
File: ecrit_2006.tex, line 654
x = 1.0 for i in range (0,15) : x = x / 10 print i, "\t", 1.0 - x, "\t", x, "\t", x **(0.5)
File: ecrit_2006.tex, line 664
0 0.90000000000000002220 0.1 0.316227766017 1 0.98999999999999999112 0.01 0.1 2 0.99899999999999999911 0.001 0.0316227766017 3 0.99990000000000001101 0.0001 0.01 4 0.99999000000000004551 1e-05 0.00316227766017 5 0.99999899999999997124 1e-06 0.001 6 0.99999990000000005264 1e-07 0.000316227766017 7 0.99999998999999994975 1e-08 0.0001 8 0.99999999900000002828 1e-09 3.16227766017e-05 9 0.99999999989999999173 1e-10 1e-05 10 0.99999999998999999917 1e-11 3.16227766017e-06 11 0.99999999999900002212 1e-12 1e-06 12 0.99999999999989996891 1e-13 3.16227766017e-07 13 0.99999999999999000799 1e-14 1e-07 14 0.99999999999999900080 1e-15 3.16227766017e-08 15 0.99999999999999988898 1e-16 1e-08 16 1.00000000000000000000 1e-17 3.16227766017e-09 17 1.00000000000000000000 1e-18 1e-09 18 1.00000000000000000000 1e-19 3.16227766017e-10 19 1.00000000000000000000 1e-20 1e-10
File: ecrit_2006.tex, line 691
class matrice_carree_2 : def __init__ (self, a,b,c,d) : self.a, self.b, self.c, self.d = a,b,c,d def determinant (self) : return self.a * self.d - self.b * self.c m1 = matrice_carree_2 (1.0,1e-6,1e-6,1.0) m2 = matrice_carree_2 (1.0,1e-9,1e-9,1.0) print m1.determinant () print m2.determinant ()
File: ecrit_2006.tex, line 729
def valeurs_propres (self) : det = self.determinant () trace = self.a + self.d delta = trace ** 2 - 4 * det l1 = 0.5 * (trace - (delta ** (0.5)) ) l2 = 0.5 * (trace + (delta ** (0.5)) ) return l1,l2
File: ecrit_2006.tex, line 768
0.99999999999900002212 1.00000000000000000000
File: ecrit_2006.tex, line 777
l1 = 0.5 * (trace - ((trace ** 2 - 4 * det) ** (0.5)) ) l2 = 0.5 * (trace + ((trace ** 2 - 4 * det) ** (0.5)) )
File: ecrit_2006.tex, line 785
l1 = 1,000001 l2 = 0.99999899999999997124 # égale à 1 - 1e-6
File: ecrit_2006.tex, line 793
l1 = 1 l2 = 1
File: ecrit_2006.tex, line 801
l1 = 0.5 * (trace - ((trace ** 2 - 4 * det) ** (0.5)) ) = - det ** 0.5 = -1e-9 l2 = 0.5 * (trace + ((trace ** 2 - 4 * det) ** (0.5)) ) = det ** 0.5 = 1e-9
File: ecrit_2006.tex, line 809
l1 = 1-1e-9 = 0.99999999900000002828 l2 = 1+ 1e-9 = 1.000000001
File: ecrit_2007.tex, line 28
def fonction_log2 (k) : n = 0 while 2**n < k : n += 1 return n
File: ecrit_2007.tex, line 38
def fonction_log2 (k) : for i in range (0,1000) : if 2**i >= k : return i
File: ecrit_2007.tex, line 47
def fonction_log2 (k) : if k <= 1 : return 0 else : return fonction_log2 ((k+1)/2)+1
File: ecrit_2007.tex, line 63
def parcours (n) : i = 1 j = 1 while i+j < n : print (i,j) i += 1 j -= 1 if j < 1 : j = i+j i = 1
File: ecrit_2007.tex, line 101
(1,1) (1,2) (2,1) (1,3) (2,2) (3,1)
File: ecrit_2007.tex, line 115
(1,4) (2,3) (3,2) (4,1) (1,5) (2,4) (3,3) ...
File: ecrit_2007.tex, line 130
i += 1 j -= 1
File: ecrit_2007.tex, line 137
if j < 1 : j = i+j i = 1
File: ecrit_2007.tex, line 155
def suite (n) : n = n ** 2 / 2 + 1 return n n = 3 for i in range (0,10) : n = suite (n) % 17 print n
File: ecrit_2007.tex, line 198
def ensemble_lettre (s) : ens = [] for i in range (0, len (s)) : c = s [i] if c in ens : ens.append (c) return ens print lettre ("baaa")
File: ecrit_2007.tex, line 225
def compte_lettre (s) : nombre = {} for c in s : nombre [c] += 1 return nombre print compte_lettre ( "mysteres" )
File: ecrit_2007.tex, line 237
KeyError: 'm'
File: ecrit_2007.tex, line 261
def compteur (s) : nombre = {} for c in s : nombre [c] = 0 # ligne ajoutée for c in s : nombre [c] += 1 return nombre
File: ecrit_2007.tex, line 273
def compteur (s) : nombre = {} for c in s : if c not in nombre : nombre [c] = 0 # ligne ajoutée nombre [c] += 1 return nombre
File: ecrit_2007.tex, line 285
{'e': 2, 'm': 1, 's': 2, 'r': 1, 't': 1, 'y': 1}
File: ecrit_2007.tex, line 292
def compteur (s) : alpha = "abcdefghijklmnopqrstuvwxyz" nombre = [ 0 for c in alpha ] for c in s : i = alpha.index (c) nombre [i] += 1 return nombre
File: ecrit_2007.tex, line 305
[0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0]
File: ecrit_2007.tex, line 313
print compteur ( "mysteres" ) print compteur ( compteur ("mysteres") ) print compteur ( [0,1,1,4,-1, (6,0), 5.5, "ch"] ) print compteur ( { 1:1, 2:2, 1:[] } )
File: ecrit_2007.tex, line 323
print compteur ( [0, [0,0] ] )
File: ecrit_2007.tex, line 340
def autre_parcours (n) : i = 0 j = 0 k = 0 while k < n : print (k,i,j) if i == 0 and j == 0 : k += 1 if j == 0 and i < k : i += 1 elif i == k and j < k : j += 1 elif j == k and i > 0 : i -= 1 elif i == 0 and j > 0 : j -= 1 autre_parcours (3)
File: ecrit_2007.tex, line 379
def ligne_nulle (mat) : nb = 0 for i in range (0, len (mat)) : lig = 0 for j in range (0, len (mat [i])) : if mat [i][j] > 0 : lig += 1 if lig == 0 : nb += 1 return nb matri = [ [ random.randint (0,1) for i in range (0,4) ] for j in range (0,20) ] print ligne_nulle (matri)
File: ecrit_2007.tex, line 417
def ligne_nulle (mat) : nb = 0 for i in range (0, len (mat)) : lig = 0 for j in range (0, len (mat [i])) : if mat [i][j] > 0 : lig += 1 if lig == 0 : nb += 1 # ligne décalée vers la gauche return nb
File: ecrit_2007.tex, line 441
class erreur : def __init__ (self) : self.e = erreur () e = erreur ()
File: ecrit_2007.tex, line 451
Traceback (most recent call last): File "examen2007.py", line 4, in ? e = erreur () File "examen2007.py", line 2, in __init__ self.e = erreur () File "examen2007.py", line 2, in __init__ self.e = erreur () File "examen2007.py", line 2, in __init__ self.e = erreur () ...
File: ecrit_2007.tex, line 473
class erreur : def __init__ (self,e) : self.e = e
File: ecrit_2007.tex, line 493
def base3 (n) : s = "" while n > 0 : r = n % 3 # ....... à compléter # ....... à compléter return s
File: ecrit_2007.tex, line 512
def base3 (n) : s = "" while n > 0 : r = n % 3 s = str (r) + s n = n / 3 # équivalent à n = (n-r) / 3 # puisque / est une division entière return s
File: ecrit_2007.tex, line 534
import copy import math import random class Eleve : def __init__ (self, note) : self.note = note e = Eleve (0) l = [] for i in range (0,81) : e.note = int (random.gauss (15, 3) + 0.5) # tirage aélatoire et arrondi if e.note >= 20 : e.note = 20 # pas de note au-dessus de 20 if e.note < 0 : e.note = 0 # pas de note négative l.append (e) moy = 0 var = 0 for e in l : moy += e.note moy = float (moy) / len (l) # les notes sont entières, # il faut convertir avant de diviser # pour obtenir la moyenne for e in l : var += (e.note - moy) ** 2 var = math.sqrt ( float (var) ) / len (l) print "moyenne ", moy print "écart-type ", var
File: ecrit_2007.tex, line 570
moyenne 16.0 écart-type 0.0
File: ecrit_2007.tex, line 616
#... e = Eleve (0) l = [] for i in range (0,81) : e.note = int (random.gauss (15, 3) + 0.5) if e.note >= 20 : e.note = 20 if e.note < 0 : e.note = 0 l.append (e.note) # ligne modifiée moy = 0 var = 0 for note in l : # ligne modifiée moy += note # ligne modifiée moy = float (moy) / len (l) for note in l : # ligne modifiée var += (note - moy) ** 2 # ligne modifiée var = math.sqrt ( float (var) ) / len (l) print "moyenne ", moy print "écart-type ", var
File: ecrit_2007.tex, line 644
moy = 0 var = 0 for note in l : moy += note var += note * note moy = float (moy) / len (l) var = float (var) / len (l) var = var - moy * moy var = math.sqrt ( float (var) ) print "moyenne ", moy print "écart-type ", var
File: ecrit_2007.tex, line 680
def puiss (x, n) : s = 1.0 for i in range (0,n) : s *= x return s def log_suite (x) : x = float (x-1) # ...... s = 0 old = -1 n = 1 while abs (old - s) > 1e-10 : old = s po = puiss (x,n) / n if n % 2 == 0 : po = -po s += po n += 1 # ...... return s print log_suite (2)
File: ecrit_2007.tex, line 706
# ...... # ...... # ...... # ...... # ...... # ...... def log_suite (x) : x = float (x-1) x0 = x s = 0 old = -1 n = 1 while abs (old - s) > 1e-10 : old = s po = x / n if n % 2 == 0 : po = -po s += po n += 1 x *= x0 return s print log_suite (2)
File: ecrit_2007.tex, line 742
def racine_carree (k) : x0 = float (k)+1 x = float (k) while abs (x-x0) > 1e-10 : x0 = x x = (k-x*x) / (2 * x) + x return x
File: ecrit_2007.tex, line 768
class Noeud : def __init__ (self, mot) : self.mot = mot self.avant = None self.apres = None def insere (self, mot) : if mot < self.mot : if self.avant == None : self.avant = Noeud (mot) else : self.avant.insere (mot) else : if self.apres == None : self.apres = Noeud (mot) else : self.apres.insere (mot) def affiche (self) : if self.avant != None : self.avant.affiche () print self.mot if self.apres != None : self.apres.affiche () li = ["premier","deuxième","troisième","quatrième","cinquième","sixième","centième","mystère"] r = None for m in li : if r == None : r = Noeud (m) else : r.insere (m) r.affiche ()
File: ecrit_2007.tex, line 799
centième cinquième deuxième mystère premier quatrième sixième troisième
File: ecrit_2008.tex, line 31
def arrondi_05 (x) : return float (int (x * 2 + 0.5)) / 2 def arrondi_0125 (x) : return float (int (x * 8 + 0.5)) / 8 def arrondi (x, p) : return float (int (x / p + 0.5)) * p
File: ecrit_2008.tex, line 51
for a in range (0, 10) : for b in range (0, 10) : for c in range (0, 10) : print [a,b,c]
File: ecrit_2008.tex, line 69
a,b,c = 0,0,0 while c < 10 : print [a,b,c] a += 1 if a == 10 : b += 1 a = 0 if b == 10 : c += 1 b = 1
File: ecrit_2008.tex, line 86
l = [0,0,0] while l [-1] < 10 : print l l [0] += 1 i = 0 while i < len (l)-1 and l [i] == 10 : l [i] = 0 l [i+1] += 1 i += 1
File: ecrit_2008.tex, line 112
def fibo (n) : if n <= 2 : return 2 else : return fibo (n-1) + fibo (n-2)
File: ecrit_2008.tex, line 137
nb = 0 # variable globale def fibo (n,p) : global nb if n <= 2 : nb += 1 return p # plus de récurrence else : nb += 2 return fibo (n-1,p) + fibo (n-2,p) for n in range (1, 20) : nb = 0 # remis à zéro, à chaque fois # nb est la mesure du coût print fibo(n,3)-2, nb # nombres identiques # nb vérifie la récurrence de la suite c(n) # c(n) = c(n-1) + c(n-2) + 2
File: ecrit_2008.tex, line 209
l = [0,1,2,3,4,5] g = l for i in range (0, len (l)-1) : g [i] = g [i+1] print l print g
File: ecrit_2008.tex, line 221
l = [0,1,2,3,4,5] g = [0,1,2,3,4,5] for i in range (0, len (l)-1) : g [i] = g [i+1] print l print g
File: ecrit_2008.tex, line 233
l = [0,1,2,3,4,5] g = [0,1,2,3,4,5] for i in range (0, len (l)) : g [i] = g [(i+1)%len (l)] print l print g
File: ecrit_2008.tex, line 253
[1, 2, 3, 4, 5, 5] [1, 2, 3, 4, 5, 5]
File: ecrit_2008.tex, line 261
[0, 1, 2, 3, 4, 5] [1, 2, 3, 4, 5, 5]
File: ecrit_2008.tex, line 269
[0, 1, 2, 3, 4, 5] [1, 2, 3, 4, 5, 1]
File: ecrit_2008.tex, line 277
l = [0,1,2,3,4,5] g = [0,1,2,3,4,5] for i in range (0, len (l)) : g [i] = l [(i+1)%len (l)] # ligne modifiée, g devient l print l print g
File: ecrit_2008.tex, line 291
import copy l = [0,1,2,3,4,5] g = copy.copy (l) # on pourrait aussi écrire g = list (l) # ou encore g = [ i for i in l ] for i in range (0, len (l)) : g [i] = l [(i+1)%len (l)] print l print g
File: ecrit_2008.tex, line 316
def mystere (l) : """cette fonction s'applique à des listes de nombres""" l.sort () nb = 0 for i in range (1,len (l)) : if l [i-1] != l [i] : nb += 1 return nb+1 l = [4,3,1,2,3,4] print mystere (l) # affiche 4
File: ecrit_2008.tex, line 342
[1, 2, 3, 3, 4, 4]
File: ecrit_2008.tex, line 350
import copy def mystere (l) : """cette fonction s'applique à des listes de nombres""" l = copy.copy (l) # ligne insérée # on peut écrire aussi l = list (l) l.sort () nb = 0 for i in range (1,len (l)) : if l [i-1] != l [i] : nb += 1 return nb+1
File: ecrit_2008.tex, line 376
class Personne : def __init__ (self, nom) : self.nom = nom def entete (self) : return "" def __str__ (self) : s = self.entete () + self.nom return s class Homme (Personne) : def __init__ (self, nom) : Personne.__init__ (self, nom) def entete (self) : return "M. " class Femme (Personne) : def __init__ (self, nom) : Personne.__init__ (self, nom) def entete (self) : return "Melle " h = Homme ("Hector") f = Femme ("Gertrude") print h print f
File: ecrit_2008.tex, line 406
class Personne : def __init__ (self, nom, entete) : self.nom = nom self.entete = entete def __str__ (self) : s = self.entete + self.nom return s h = Personne ("Hector", "M. ") f = Personne ("Gertrude", "Melle ") print h print f
File: ecrit_2008.tex, line 450
M. Hector Melle Gertrude
File: ecrit_2008.tex, line 459
class Personne : def __init__ (self, nom) : self.nom = nom def entete (self) : return "" def __str__ (self) : s = self.entete () + self.nom return s class Homme (Personne) : def __init__ (self, nom) : Personne.__init__ (self, nom) def entete (self) : return "M. " class Femme (Personne) : def __init__ (self, nom) : Personne.__init__ (self, nom) def entete (self) : return "Melle " class Hermaphrodite (Personne) : def __init__ (self, nom) : Personne.__init__ (self, nom) def entete (self) : return "Melle et M. " h = Homme ("Hector") f = Femme ("Gertrude") g = Hermaphrodite ("Marie-Jean") print h print f print g
File: ecrit_2008.tex, line 497
class Personne : def __init__ (self, nom, entete) : self.nom = nom self.entete = entete def __str__ (self) : s = self.entete + self.nom return s h = Personne ("Hector", "M. ") f = Personne ("Gertrude", "Melle ") g = Personne ("Marie-Jean", \ "Melle et M. ") print h print f print g
File: ecrit_2008.tex, line 552
def tri_entiers(l): """cette fonction s'applique à une liste d'entiers""" # groupe 1 m = l [0] M = l [0] for k in range(1,len(l)): if l [k] < m : m = l [k] if l [k] > M : M = l [k] # groupe 2 p = [0 for i in range (m,M+1) ] for i in range (0, len (l)) : p [ l [i] - m ] += 1 # groupe 3 R = [0 for i in range (m,M+1) ] R [0] = p [0] for k in range (1, len (p)) : R [k] = R [k-1] + p [k] # groupe 4 pos = 0 for i in range (1, len (l)) : while R [pos] < i : pos += 1 l [i-1] = pos + m l [len (l)-1] = M
File: ecrit_2008.tex, line 643
import random def tirage (poids) : nb = [ 0 for p in poids ] while True : i = random.randint (0, len (poids)-1) nb [i] += 1 if nb [i] == poids [i] : return i salaire = [ 10000, 5000, 3000, 2000 ] poids = [ int (s / 1000) for s in salaire ] nombre = [ 0 for s in salaire ] for n in range (0,1000) : p = tirage (poids) nombre [p] += 1 for i in range (0, len (poids)) : print "salaire ", salaire [i], " : nb : ", nombre [i]
File: ecrit_2008.tex, line 669
salaire 10000 : nb : 0 salaire 5000 : nb : 49 salaire 3000 : nb : 301 salaire 2000 : nb : 650
File: ecrit_2008.tex, line 685
import random def tirage (poids, nb) : while True : i = random.randint (0, len (poids)-1) nb [i] += 1 if nb [i] % poids [i] == 0 : return i salaire = [ 10000, 5000, 3000, 2000 ] poids = [ int (s / 1000) for s in salaire ] nombre = [ 0 for s in salaire ] temp = [ 0 for s in salaire ] for n in range (0,1000) : p = tirage (poids, temp) nombre [p] += 1 for i in range (0, len (poids)) : print "salaire ", salaire [i], " : nb : ", nombre [i]
File: ecrit_2008.tex, line 711
salaire 10000 : nb : 90 salaire 5000 : nb : 178 salaire 3000 : nb : 303 salaire 2000 : nb : 429
File: ecrit_2008.tex, line 747
dico = { } dico ["Jean"] = { } dico ["Jean"] ["Matthieu"] = { } dico ["Jean"] ["Pierre"] = { } dico ["Jean"] ["Matthieu"] ["Thomas"] = { } dico ["Jean"] ["Matthieu"] ["Louis"] = { } dico ["Jean"] ["Pierre"] ["Anne"] = dico ["Jean"] ["Matthieu"] ["Thomas"] dico ["Jean"] ["Pierre"] ["Henri"] = { } dico ["Jean"] ["Pierre"] ["Anne"] ["Alphonse"] = { } def print_dico (dico, niveau = 0) : decalage = "...." * niveau for d in dico : print decalage, d if len (dico [d]) > 0 : print_dico (dico [d], niveau+1) print_dico (dico) # première fois dico ["Jean"] ["Pierre"] ["Anne"] ["Bernard"] = { } ### ligne B print "**********" print_dico (dico) # seconde fois
File: ecrit_2008.tex, line 774
Jean .... Matthieu ........ Louis ........ Thomas ............ Alphonse .... Pierre ........ Anne ............ Alphonse ........ Henri ********** Jean .... Matthieu ........ Louis ........ Thomas ............ Bernard ............ Alphonse .... Pierre ........ Anne ............ Bernard ............ Alphonse ........ Henri
File: ecrit_2008_rattrapage.tex, line 33
def u (n) : if n <= 2 : return 1 else : return u (n-1) + u (n-2) + u (n-3)
File: ecrit_2008_rattrapage.tex, line 46
def u_non_recursif (n) : if n <= 2 : return 1 u0 = 1 u1 = 1 u2 = 1 i = 3 while i <= n : u = u0 + u1 + u2 u0 = u1 u1 = u2 u2 = u i += 1 return u
File: ecrit_2008_rattrapage.tex, line 72
def fonction (n) : return n + (n % 2) print fonction (10) print fonction (11)
File: ecrit_2008_rattrapage.tex, line 91
10 12
File: ecrit_2008_rattrapage.tex, line 101
def fonction3 (n) : k = 0 while k < n : k += 3 return k
File: ecrit_2008_rattrapage.tex, line 112
def fonction3 (n) : if n % 3 == 0 : return n elif n % 3 == 1 : return n + 2 else : return n + 1
File: ecrit_2008_rattrapage.tex, line 123
def fonction3 (n) : if n % 3 == 0 : return n else : return n + 3 - (n % 3)
File: ecrit_2008_rattrapage.tex, line 140
def division (n) : return n / 2 print division (1) print division (0.9)
File: ecrit_2008_rattrapage.tex, line 158
0 0.45
File: ecrit_2008_rattrapage.tex, line 197
def compare_liste (p,q) : i = 0 while i < len (p) and i < len (q) : if p [i] < q [i] : return -1 # on peut décider elif p [i] > q [i] : return 1 # on peut décider i += 1 # on ne peut pas décider # fin de la boucle, il faut décider à partir des longueurs des listes if len (p) < len (q) : return -1 elif len (p) > len (q) : return 1 else : return 0
File: ecrit_2008_rattrapage.tex, line 214
def compare_liste (p,q) : i = 0 while i < len (p) and i < len (q) : c = cmp (p [i], q [i]) if c != 0 : return c # on peut décider i += 1 # on ne peut pas décider # fin de la boucle, il faut décider à partir des longueurs des listes return cmp (len (p), len (q))
File: ecrit_2008_rattrapage.tex, line 238
l = [0,1,2,3,4,5,6,7,8,9] i = 1 while i < len (l) : print l [i], l [i+1] i += 2
File: ecrit_2008_rattrapage.tex, line 250
1 2 3 4 5 6 7 8 9 Traceback (most recent call last): File "examen2008_rattrapage.py", line 43, in <module> print l [i], l [i+1] IndexError: list index out of range
File: ecrit_2008_rattrapage.tex, line 285
def suite_geometrique_1 (r) : x = 1.0 y = 0.0 n = 0 while x > 0 : y += x x *= r n += 1 return y,n print suite_geometrique_1 (0.5) #affiche (2.0, 1075)
File: ecrit_2008_rattrapage.tex, line 303
def suite_geometrique_2 (r) : x = 1.0 y = 0.0 n = 0 yold = y + 1 while abs (yold - y) > 0 : yold = y y += x x *= r n += 1 return y,n print suite_geometrique_2 (0.5) #affiche (2.0, 55)
File: ecrit_2008_rattrapage.tex, line 348
def hyper_cube_liste (n, m = [0,0]) : if n > 1 : m [0] = [0,0] m [1] = [0,0] m [0] = hyper_cube_liste (n-1, m [0]) m [1] = hyper_cube_liste (n-1, m [1]) return m h = hyper_cube_liste (3) print h # affiche [[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
File: ecrit_2008_rattrapage.tex, line 365
def hyper_cube_dico (n) : r = { } ind = [ 0 for i in range (0,n) ] while ind [0] <= 1 : cle = tuple ( ind ) # conversion d'une liste en tuple r [cle] = 0 ind [ len (ind)-1] += 1 k = len (ind)-1 while ind [ k ] == 2 and k > 0 : ind [k] = 0 ind [k-1] += 1 k -= 1 return r h = hyper_cube_dico (3) print h # affiche {(0, 1, 1): 0, (1, 1, 0): 0, (1, 0, 0): 0, (0, 0, 1): 0, # (1, 0, 1): 0, (0, 0, 0): 0, (0, 1, 0): 0, (1, 1, 1): 0}
File: ecrit_2008_rattrapage.tex, line 389
def occurrence (l,n) : d = ....... # choix d'un hyper_cube (n) ..... return d suite = [ 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1 ] h = occurrence (suite, 3) print h
File: ecrit_2008_rattrapage.tex, line 407
def occurrence (l,n) : d = hyper_cube_dico (n) for i in range (0, len (l)-n) : cle = tuple (l [i:i+n]) d [cle] += 1 return d
File: ecrit_2008_rattrapage.tex, line 421
def occurrence (l,n) : d = { } for i in range (0, len (l)-n) : cle = tuple (l [i:i+n]) if cle not in d : d [cle] = 0 d [cle] += 1 return d
File: ecrit_2008_rattrapage.tex, line 436
def occurrence (l,n) : d = hyper_cube_liste (n, [0,0]) # * remarque voir plus bas for i in range (0, len (l)-n) : cle = l [i:i+n] t = d # for k in range (0,n-1) : # point clé de la fonction : t = t [ cle [k] ] # accès à un élément t [cle [ n-1] ] += 1 return d
File: ecrit_2008_rattrapage.tex, line 454
Traceback (most recent call last): File "examen2008_rattrapage.py", line 166, in <module> h = occurrence (suite, n) File "examen2008_rattrapage.py", line 160, in occurrence t [cle [ n-1] ] += 1 TypeError: 'int' object is not iterable
File: ecrit_2008_rattrapage.tex, line 468
def fonction (l = [0,0]) : l [0] += 1 return l print fonction () # affiche [1,0] : résultat attendu print fonction () # affiche [2,0] : résultat surprenant print fonction ( [0,0]) # affiche [1,0] : résultat attendu
File: ecrit_2008_rattrapage.tex, line 483
import copy def fonction (l = [0,0]) : l = copy.copy (l) l [0] += 1 return l
File: ecrit_2008_rattrapage.tex, line 495
def hyper_cube_liste (n, m = [0,0]) : m = copy.copy (m) if n > 1 : m [0] = [0,0] m [1] = [0,0] m [0] = hyper_cube_liste (n-1, m [0]) m [1] = hyper_cube_liste (n-1, m [1]) return m
File: ecrit_2009.tex, line 45
def f(): x = 0 print x f() def g(): print x g()
File: ecrit_2009.tex, line 61
def f(): x = 0 print x x = 1 f() def g(): print x g()
File: ecrit_2009.tex, line 89
Traceback (most recent call last): File "p1.py", line 11, in <module> g() File "p1.py", line 9, in g print x NameError: global name 'x' is not defined
File: ecrit_2009.tex, line 106
a = [ None, 0 ] b = [ None, 1 ] a [0] = b b [0] = a print a [0][0] [0][0] [0][0] [1]
File: ecrit_2009.tex, line 118
import copy a = [ None, 0 ] b = [ None, 1 ] a [0] = copy.copy (b) b [0] = a print a [0][0] [0][0] [0][0] [1]
File: ecrit_2009.tex, line 141
0 1
File: ecrit_2009.tex, line 147
a = [ None, 0 ] b = [ None, 1 ] a [0] = b # b et a [0] désignent la même liste b [0] = a # b [0] et a désignent la même liste
File: ecrit_2009.tex, line 171
0
File: ecrit_2009.tex, line 204
import random def somme_alea (tableau, n) : s = 0 for i in range (0, n) : h = random.randint (0, len (tableau)) s += tableau [h] print s / n x = somme_alea ( range (0,100), 10) print "x = ", x
File: ecrit_2009.tex, line 223
44 x = None
File: ecrit_2009.tex, line 234
Traceback (most recent call last): File "examen2009.py", line 10, in <module> print somme_alea ( range (0,100), 10) File "examen2009.py", line 8, in somme_alea s += tableau [h] IndexError: list index out of range
File: ecrit_2009.tex, line 253
44
File: ecrit_2009.tex, line 258
h = random.randint (0, len (tableau)-1)
File: ecrit_2009.tex, line 288
def moyenne_mobile (suite, m) : res = [] for i in range (m, len (suite)-m) : s = 0 for j in range (-m,m+1) : s += suite [i+j] res.append ( float (s) / (m*2+1) ) return res
File: ecrit_2009.tex, line 301
def moyenne_mobile (suite, m) : res = [] for i in range (m, len (suite)-m) : if i == m : # ... ligne à remplacer else : # ... ligne à remplacer res.append ( float (s) / (m*2+1) ) return res
File: ecrit_2009.tex, line 333
def moyenne_mobile (suite, m) : res = [] for i in range (m, len (suite)-m) : if i == m : s = sum ( suite [i-m : i+m+1] ) else : s = s - suite [i-m-1] + suite [i+m] res.append ( float (s) / (m*2+1) ) return res
File: ecrit_2009.tex, line 358
def fonction_mystere (tableau) : for i in range (0, len (tableau)) : if tableau [i] % 2 != 0 : continue pos = i for j in range (i+1, len (tableau)) : if tableau [j] % 2 != 0 : continue if tableau [pos] < tableau [j] : pos = j ech = tableau [i] tableau [i] = tableau [pos] tableau [pos] = ech
File: ecrit_2009.tex, line 375
if tableau [i] % 2 != 0 : continue if tableau [pos] < tableau [j] : pos = j
File: ecrit_2009.tex, line 381
def fonction_mystere (tableau) : for i in range (0, len (tableau)) : pos = i for j in range (i+1, len (tableau)) : if tableau [pos] < tableau [j] : pos = j ech = tableau [i] tableau [i] = tableau [pos] tableau [pos] = ech
File: ecrit_2009.tex, line 393
a = [ 0, 1, 4, 3, 5, 2 ] print a # affiche [ 0, 1, 4, 3, 5, 2 ] b = fonction_mystere (a) print b # affiche [ 4, 1, 2, 3, 5, 0 ]
File: ecrit_2009.tex, line 494
class Boucle : def __init__ (self, a, b) : self.a = a self.b = b def iteration (self, i) : # contenu d'une itération pass def boucle (self) : # opère la boucle for i in range (self.a, self.b) : self.iteration (i)
File: ecrit_2009.tex, line 510
class Gauss (Boucle) : def __init__ (self, b) : Boucle.__init__ (self, 1, b+1) self.x = 0 def iteration (self,i) : self.x += i g = Gauss (10) g.boucle () print g.x
File: ecrit_2009.tex, line 542
class Carre (Gauss) : def iteration (self,i) : self.x += i*i # ligne changée g = Carre (10) g.boucle () print g.x
File: ecrit_2009.tex, line 554
class Boucle2 (Boucle) : def __init__ (self, a, b, c, d) : Boucle.__init__ (self, a, b) self.c = c self.d = d def iteration (self, i, j) : pass def boucle (self) : for j in range (self.c, self.d) : for i in range (self.a, self.b) : self.iteration (i,j) class Gauss2 (Boucle2) : def __init__ (self, a, b) : Boucle2.__init__ (self, 1, a+1, 1, b+1) self.x = 0 def iteration (self, i,j) : self.x += i+j
File: ecrit_2009.tex, line 577
class Boucle2 (Boucle) : def __init__ (self, a, b, c, d) : Boucle.__init__ (self, a, b) self.c = c self.d = d def iteration (self, i) : pass def boucle (self) : for j in range (self.c, self.d) : self.j = j for i in range (self.a, self.b) : self.iteration (i) class Gauss2 (Boucle2) : def __init__ (self, a, b) : Boucle2.__init__ (self, 1, a+1, 1, b+1) self.x = 0 def iteration (self, i) : self.x += self.j+i
File: ecrit_2009.tex, line 601
class Boucle2 (Boucle) : def __init__ (self, a, b, c, d) : Boucle.__init__ (self, a, b) self.c = c self.d = d def iteration (self, i) : pass def boucle (self) : for j in range (self.c, self.d) : self.j = j Boucle.boucle (self) # suppression d'une boucle # caché dans la classe Boucle
File: ecrit_2009.tex, line 618
class Boucle2 (Boucle) : def __init__ (self, a, b, c, d) : Boucle.__init__ (self, a, b) self.c = c self.d = d def iteration (self, i) : for j in range (self.c, self.d) : self.iteration2 (i,j) def iteration2 (self, i,j) : pass class Gauss2 (Boucle2) : def __init__ (self, a, b) : Boucle2.__init__ (self, 1, a+1, 1, b+1) self.x = 0 def iteration2 (self, i, j) : self.x += j+i
File: ecrit_2009.tex, line 644
class Boucle2 (Boucle) : def __init__ (self, a, b, c, d) : Boucle.__init__ (self, a, b) self.c = c self.d = d def iteration (self, i, j) : pass def boucle (self) : ab = self.b - self.a cd = self.d - self.c n = ab * cd for k in range (0, n) : i = k % ab + self.a j = k / ab + self.c self.iteration (i,j)
File: ecrit_2010.tex, line 46
l = [] for i in range (0, 4) : c = [] for j in range (0, i) : c += [ j ] # ou c.append (j) l += [ c ] # ou l.append (c) for c in l : print c
File: ecrit_2010.tex, line 58
l = [1,4,1,5,9] d = { } for u in l : if u in d : d [u] += 1 else : d [u] = 1 print d
File: ecrit_2010.tex, line 76
[] [0] [0, 1] [0, 1, 2]
File: ecrit_2010.tex, line 85
{1: 2, 4: 1, 5: 1, 9: 1}
File: ecrit_2010.tex, line 109
n = 10 l = [i for i in (0,n)] l[9]
File: ecrit_2010.tex, line 117
File "ecrit.py", line 3, in <module> l[9] IndexError: list index out of range
File: ecrit_2010.tex, line 129
d = {'un': 1, 'deux': 4} print deux
File: ecrit_2010.tex, line 137
File "ecrit.py", line 2, in <module> print deux NameError: name 'deux' is not defined
File: ecrit_2010.tex, line 149
l = [ "mot", "second" ] print l(0)
File: ecrit_2010.tex, line 157
File "ecrit.py", line 2, in <module> print l(0) TypeError: 'list' object is not callable
File: ecrit_2010.tex, line 171
l = [4, 2, 1, 3] ll = l.sort() print ll[0]
File: ecrit_2010.tex, line 179
File "ecrit.py", line 2, in <module> print ll[0] TypeError: 'NoneType' object is unsubscriptable
File: ecrit_2010.tex, line 194
n = 10 l = [i for i in (0,n)] print l # affiche [0, 10]
File: ecrit_2010.tex, line 200
l = [i for i in range (0,n)]
File: ecrit_2010.tex, line 210
l = [4, 2, 1, 3] ll = list (l) ll.sort() print ll[0]
File: ecrit_2010.tex, line 219
l = [4, 2, 1, 3] print min(l)
File: ecrit_2010.tex, line 240
i = random.randint (0,n) # tire aléatoirement un nombre entier entre 0 et n inclus l.sort () # trie la liste l quel que soit son contenu
File: ecrit_2010.tex, line 248
l = [4,5,3,7,4] l.sort () print l # affiche [3, 4, 4, 5, 7]
File: ecrit_2010.tex, line 256
l = [ (1,2), (0,10), (4,3), (5,0), (0,9) ] l.sort () print l # affiche [(0, 9), (0, 10), (1, 2), (4, 3), (5, 0)]
File: ecrit_2010.tex, line 264
def permutation_aleatoire (l) : .... return ... print permutation_aleatoire ([1,2,3,4]) # affiche [3,1,4,2]
File: ecrit_2010.tex, line 281
tab = ["zéro", "un", "deux"] # tableau à trier pos = [ (tab [i],i) for i in range (0, len (tab)) ] # tableau de couples pos.sort () # tri print pos # affiche [('deux', 2), ('un', 1), ('zéro', 0)]
File: ecrit_2010.tex, line 290
from random import randint def permutation (liste) : alea = [ randint (0,len (liste)) for i in liste ] couple = [ (r,l) for r,l in zip (alea,liste) ] couple.sort () permutation = [ l[1] for l in couple ] return permutation liste = [ i*2 for i in range (0,10) ] permu = permutation (liste) print liste # affiche [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] print permu # affiche [2, 6, 16, 10, 8, 14, 0, 12, 18, 4]
File: ecrit_2010.tex, line 308
from random import randint import copy def permutation (liste) : li = copy.copy (liste) for i in xrange (0, len (liste)) : n = randint (0, len (liste)-1) m = randint (0, len (liste)-1) s = li [n] li [n] = li [m] li [m] = s return li
File: ecrit_2010.tex, line 325
from random import randint import copy def permutation (liste) : li = copy.copy (liste) for i in xrange (0, len (liste)) : n = i m = randint (0, len (liste)-1) s = li [n] li [n] = li [m] li [m] = s return li
File: ecrit_2010.tex, line 342
from random import randint import copy def permutation (liste) : li = [ ] n = len (liste) for i in xrange (0, n) : m = randint (0, len (liste)-1) li.append (liste [m]) del liste [m] # on supprime l'élément tiré au hasard return li
File: ecrit_2010.tex, line 358
from random import randint import copy def permutation (liste) : li = [ ] n = len (liste) for i in xrange (0, n) : m = randint (0, len (liste)-1) if liste [m] not in li : li.append (liste [m]) return li
File: ecrit_2010.tex, line 391
def nom_csp (csp) : # csp est un entier compris entre 1 et 4 if csp == 1 : return "cat. A" elif csp == 2 : return "cat. B" elif csp == 3 : return "cat. C" else : return "cat. D"
File: ecrit_2010.tex, line 405
def nom_csp (csp) : # csp est un entier compris entre 1 et 4 if csp <= 2 : if csp == 1 : return "cat. A" else : return "cat. B" else : if csp == 3 : return "cat. C" else : return "cat. D"
File: ecrit_2010.tex, line 450
def nom_csp (csp) : if csp == 3 : return "cat. C" elif csp == 1 : return "cat. A" elif csp == 2 : return "cat. B" else : return "cat. D"
File: ecrit_2010.tex, line 513
def calculeN (I,J) : # I et J sont des entiers comme par exemple I=3 et J=5 nombre = [ [0 for i in range (0, J) ] for i in range (0, I) ] # nombre est alors égal à [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] for i in range (0, I) : nombre [i][0] = 1 for j in range (0, I) : nombre [0][j] = 1 for i in range (1, I) : for j in range (1, J) : nombre [i][j] = nombre [i-1][j] + nombre [i][j-1] return nombre nombre = calculeN (3,5) for l in nombre : print l
File: ecrit_2010.tex, line 536
[1, 1, 1, 0, 0] [1, 2, 3, 3, 3] [1, 3, 6, 9, 12]
File: ecrit_2010.tex, line 572
for j in range (0, I) : # il faut écrire range (0, J) nombre [0][j] = 1
File: ecrit_2010.tex, line 578
[1, 1, 1, 1, 1] [1, 2, 3, 4, 5] [1, 3, 6, 10, 15]
File: ecrit_2010.tex, line 589
def calculeN (I,J) : nombre = [ [0 for i in range (0, J) ] for i in range (0, I) ] for i in range (0, I) : nombre [i][0] = 1 for j in range (1, J) : nombre [0][j] = 1 nombre [0][1:5] = [2,] * (J-1) ##### ligne ajoutée for i in range (1, I) : for j in range (1, J) : nombre [i][j] = nombre [i-1][j] + nombre [i][j-1] return nombre nombre = calculeN (3,5) for l in nombre : print l
File: ecrit_2010.tex, line 612
[1, 2, 2, 2, 2] [1, 3, 5, 7, 9] [1, 4, 9, 16, 25]
File: ecrit_2010.tex, line 641
def generation_ensemble (n, s, s1, s2) : l = [ ] alpha = s * s2 / s1 beta = s2 * (1.0 - s**2) ** 0.5 for i in range (0, n) : x = random.gauss (0,s1) u = random.gauss (0,1.0) y = alpha * x + beta * u l [i] = [ [x,y] ] # ligne 26 return l
File: ecrit_2010.tex, line 656
Traceback (most recent call last): File "examen2010.py", line 62, in <module> points = generation_ensemble (50000, 1., 2., 6., 0.5) File "examen2010.py", line 26, in generation_ensemble l [i] = [ [x,y] ] IndexError: list assignment index out of range
File: ecrit_2010.tex, line 671
def generation_ensemble2 (n, s, s1, s2) : l = [ ] a = s * 100 for i in range (0, n) : x = random.gauss (0,s1) if (i % 100) <= a : # le symbole % désigne le modulo: # i % 100 est le reste de la division de i par 100 y = x * s2 / s1 else : y = random.gauss (0,s2) l += [ [x,y] ] return l
File: ecrit_2011.tex, line 54
def remplissage (mat, x , y) : # ligne 1 dico = { (x,y):0 } # ligne 2 while len (dico) > 0 : # ligne 3 point = dico.popitem ()# retourne un élément du dictionnaire et le supprime x,y = point [0] # ligne 5 mat [x][y] = 1 # ligne 6 dico [x-1,y] = 0 # ligne 7 dico [x+1,y] = 0 # ligne 8 dico [x,y-1] = 0 # ligne 9 dico [x,y+1] = 0 # ligne 10
File: ecrit_2011.tex, line 69
... 118 41 13 118 40 13 118 34 8 118 34 7 118 41 13 118 40 13 118 34 8 118 34 7 118 41 13 ...
File: ecrit_2011.tex, line 97
def remplissage (mat, x , y) : # dico = { (x,y):0 } # while len (dico) > 0 : # point = dico.popitem ()# x,y = point [0] # if mat [x][y] == 1 : continue # ligne ajoutée mat [x][y] = 1 # dico [x-1,y] = 0 # dico [x+1,y] = 0 # dico [x,y-1] = 0 # dico [x,y+1] = 0 #
File: ecrit_2011.tex, line 113
def remplissage (mat, x , y) : # dico = { (x,y):0 } # while len (dico) > 0 : # point = dico.popitem ()# x,y = point [0] # mat [x][y] = 1 # if mat[x-1][y] == 0 : dico [x-1,y] = 0 # if mat[x+1][y] == 0 : dico [x+1,y] = 0 # if mat[x][y-1] == 0 : dico [x,y-1] = 0 # if mat[x][y+1] == 0 : dico [x,y+1] = 0 #
File: ecrit_2011.tex, line 128
def remplissage (mat, x , y) : int compte = 0 # ligne ajoutée dico = { (x,y):0 } while len (dico) > 0 : point = dico.popitem () x,y = point [0] if mat [x][y] == 1 : continue mat [x][y] = 1 dico [x-1,y] = 0 dico [x+1,y] = 0 dico [x,y-1] = 0 dico [x,y+1] = 0 compte += 1 # ligne ajoutée return comte # ligne ajoutée
File: ecrit_2011.tex, line 165
def resolution_simple (objets, sac) : objets.sort (reverse = True) solution = [] for o in objets : ... return solution
File: ecrit_2011.tex, line 192
def resolution (objets, sac) : if len (objets) == 1 : if objets [0] <= sac : return [ objets [0] ] else : return [] reduit = objets [1:] s1 = resolution (reduit, sac) s2 = resolution (reduit, sac - objets [0]) # ligne B t1 = sum(s1) t2 = sum(s2) + objets [0] # ligne C if sac >= t1 and (t1 >= t2 or t2 > sac) : return s1 elif sac >= t2 and (t2 >= t1 or t1 > sac) : return [ objets [0], ] + s2 obj = [2,4,7,10] sac = 15 print "solution ",resolution (obj, sac) # ligne A
File: ecrit_2011.tex, line 215
solution Traceback (most recent call last): File "examen2011.py", line A, in <module> print "solution ",resolution (obj, sac) File "examen2011.py", line B, in resolution s2 = resolution (reduit, sac - objets [0]) File "examen2011.py", line C, in resolution t2 = sum(s2) + objets [0] TypeError: 'NoneType' object is not iterable
File: ecrit_2011.tex, line 241
def resolution_simple (objets, sac) : objets.sort (reverse = True) solution = [] for o in objets : if sum(solution) + o <= sac : # ligne ajoutée solution.append (o) # ligne ajoutée return solution
File: ecrit_2011.tex, line 260
t2 = sum(s2) + objets [0] TypeError: 'NoneType' object is not iterable
File: ecrit_2011.tex, line 278
s2 = resolution (reduit, sac - objets [0]) # ligne B
File: ecrit_2011.tex, line 284
if sac >= t1 and (t1 >= t2 or t2 > sac) : return s1 elif sac >= t2 and (t2 >= t1 or t1 > sac) : return [ objets [0], ] + s2
File: ecrit_2011.tex, line 291
if sac >= t1 and (t1 >= t2 or t2 > sac) : return s1 elif sac >= t2 and (t2 >= t1 or t1 > sac) : return [ objets [0], ] + s2 else : return [] # ligne ajoutée
File: ecrit_2007_rattrapage.tex, line 32
l2 = [ ( l [i], i ) for i in range (0, len (l)) ] l2.sort () print l2 [0][1] # affiche la position du plus petit élément # dans le tableau initial
File: ecrit_2007_rattrapage.tex, line 50
def ensemble_lettre (s) : ens = [] for i in range (0, len (s)) : c = s [i] if c in ens : ens.append (c) return ens print lettre ("baaa")
File: ecrit_2007_rattrapage.tex, line 75
def ensemble_lettre (s) : ens = [] for i in range (0, len (s)) : c = s [i] if c not in ens : ens.append (c) return ens
File: ecrit_2007_rattrapage.tex, line 98
def autre_parcours (n) : i = 0 j = 0 k = 0 while k < n : print (k,i,j) if i == 0 and j == 0 : k += 1 if j == 0 and i < k : i += 1 elif i == k and j < k : j += 1 elif j == k and i > 0 : i -= 1 elif i == 0 and j > 0 : j -= 1 autre_parcours (3)
File: ecrit_2007_rattrapage.tex, line 127
(0, 0, 0) (1, 1, 0) (1, 1, 1) (1, 0, 1) (1, 0, 0) (2, 1, 0) (2, 2, 0) (2, 2, 1) (2, 2, 2) (2, 1, 2) (2, 0, 2) (2, 0, 1) (2, 0, 0)
File: ecrit_2007_rattrapage.tex, line 165
k = [10,14,15,-1,6] l = [] for i in range (0,len (k)) : l.append ( k [ len (k) - i ] )
File: ecrit_2007_rattrapage.tex, line 180
k = [10,14,15,-1,6] l = [] for i in range (0,len (k)) : l.append ( k [ len (k) - i-1 ] ) # -1 a été ajouté
File: ecrit_2007_rattrapage.tex, line 203
def puiss (x, n) : s = 1.0 for i in range (0,n) : s *= x return s def log_suite (x) : x = float (x-1) # ...... s = 0 old = -1 n = 1 while abs (old - s) > 1e-10 : old = s po = puiss (x,n) / n if n % 2 == 0 : po = -po s += po n += 1 # ...... return s print log_suite (2)
File: ecrit_2007_rattrapage.tex, line 231
# ...... # ...... # ...... # ...... # ...... # ...... def log_suite (x) : x = float (x-1) x0 = x s = 0 old = -1 n = 1 while abs (old - s) > 1e-10 : old = s po = x / n if n % 2 == 0 : po = -po s += po n += 1 x *= x0 return s print log_suite (2)
File: ecrit_2007_rattrapage.tex, line 269
def racine_carree (k) : x0 = float (k)+1 x = float (k) while abs (x-x0) > 1e-10 : x0 = x x = (k-x*x) / (2 * x) + x return x
File: ecrit_2007_rattrapage.tex, line 339
class Noeud : def __init__ (self, mot) : self.mot = mot self.avant = None self.apres = None def insere (self, mot) : if mot < self.mot : if self.avant == None : self.avant = Noeud (mot) else : self.avant.insere (mot) else : if self.apres == None : self.apres = Noeud (mot) else : self.apres.insere (mot) def affiche (self) : if self.avant != None : self.avant.affiche () print self.mot if self.apres != None : self.apres.affiche () li = ["premier","deuxième","troisième","quatrième", \ "cinquième","sixième","centième","mystère"] r = None for m in li : if r == None : r = Noeud (m) else : r.insere (m) r.affiche ()
File: ecrit_2007_rattrapage.tex, line 372
centième cinquième deuxième mystère premier quatrième sixième troisième
File: ecrit_2007_rattrapage2.tex, line 32
s = 0 for i in range (1,101) : s = i + 100-i+1 s = s / 2
File: ecrit_2007_rattrapage2.tex, line 56
def fusion (l1,l2) : i,j = 0,0 r = [] while len (r) < len (l1) + len (l2) : if i < len (l1) and (j >= len (l2) or l1[i] < l2 [j]) : r.append (l1 [i]) i += 1 else : r.append (l2 [j]) j += 1 return r
File: ecrit_2007_rattrapage2.tex, line 101
class Noeud : def __init__ (self) : self.n1 = None self.n2 = None root = Noeud () root.n1 = Noeud () root.n2 = Noeud () root.n1.n1 = Noeud () root.n1.n2 = root
File: ecrit_2007_rattrapage2.tex, line 128
def compte_noeud (self, l = []) : if self not in l : l.append (self) if self.n1 != None : self.n1.compte_noeud (l) if self.n2 != None : self.n2.compte_noeud (l) return len (l)
File: ecrit_2007_rattrapage2.tex, line 150
%
File: ecrit_2009_rattrapage.tex, line 42
def numero_simple (nbimpair, nbpair) : im = [..... for i in range (1, nbimpair+1) ] pa = [..... for i in range (1, nbpair +1) ] return im,pa
File: ecrit_2009_rattrapage.tex, line 51
def numerotation (longueur, debut, moy) : res = [] for li in range (0, len (longueur)) : if len (res) == 0 : x1 = debut else : x1 = res [-1][1]+2 nb = longueur [li] / moy # c'est une division entière # ligne importante # pour la dernière question x2 = x1 + nb*2 res.append ( (x1,x2) ) debut = x2 + 2 return res def numero_deux (impair, pair) : moypair = sum (pair) / len (pair) # vaut 25 moyimpair = sum (impair) / len (impair) # vaut 41 im = numerotation (impair, 1, moyimpair) pa = numerotation (pair, 2, moypair) return im,pa impair = [20,70,35] pair = [20,20,40,35,10] im,pa = numero_deux (impair, pair) print im print pa
File: ecrit_2009_rattrapage.tex, line 83
[(1, 1), (3, 5), (7, 7)] [(2, 2), (4, 4), (6, 8), (10, 12), (14, 14)]
File: ecrit_2009_rattrapage.tex, line 108
a = [ None, [0] ] b = [ None, [0] ] c = [ None, [0] ] a [0] = b b [0] = c c [0] = a x = a for i in range (0, 9) : x [1][0] += 1 x = x [0] print "a [1][0] =", a [1][0] print "b [1][0] =", b [1][0] print "c [1][0] =", c [1][0]
File: ecrit_2009_rattrapage.tex, line 131
a = [ None, [0] ] b = [ None, [0] ] c = [ None, [0] ] a [0] = b b [0] = c c [0] = a import copy # ligne ajoutée a = copy.copy (a) # ligne ajoutée x = a for i in range (0, 9) : x [1][0] += 1 x = x [0] print "a [1][0] =", a [1][0] print "b [1][0] =", b [1][0] print "c [1][0] =", c [1][0]
File: ecrit_2009_rattrapage.tex, line 157
a = [ None, [0] ] b = [ None, [0] ] c = [ None, [0] ] a [0] = b b [0] = c c [0] = a import copy a = copy.deepcopy (a) # ligne modifiée x = a for i in range (0, 9) : x [1][0] += 1 x = x [0] print "a [1][0] =", a [1][0] print "b [1][0] =", b [1][0] print "c [1][0] =", c [1][0]
File: ellipse_fin_exo.tex, line 4
i = random.randint (0,n) # tire aléatoirement un nombre entier entre 0 et n inclus l.sort () # trie la liste l quel que soit son contenu
File: ellipse_fin_exo.tex, line 12
def permutation_aleatoire (l) : .... return ... print permutation_aleatoire ([1,2,3,4]) # affiche [3,1,4,2]
File: ellipse_fin_exo.tex, line 29
tab = ["zéro", "un", "deux"] # tableau à trier pos = [ (tab [i],i) for i in range (0, len (tab)) ] # tableau de couples pos.sort () # tri print pos # affiche [('deux', 2), ('un', 1), ('zéro', 0)]
File: ellipse_fin_exo.tex, line 38
from random import randint def permutation (liste) : alea = [ randint (0,len (liste)) for i in liste ] couple = [ (r,l) for r,l in zip (alea,liste) ] couple.sort () permutation = [ l[1] for l in couple ] return permutation liste = [ i*2 for i in range (0,10) ] permu = permutation (liste) print liste # affiche [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] print permu # affiche [2, 6, 16, 10, 8, 14, 0, 12, 18, 4]
File: conseil_ecrire_programme.tex, line 46
def somme_double (liste) : return 1.0 * sum(liste) def test_somme_double () : y = somme_double([ 1 ]) / 2 if y == 0 : raise Exception ("valeur > 0 attendue") if __name__ == "__main__" : test_somme_double()
File: conseil_ecrire_programme.tex, line 60
Traceback (most recent call last): File "conseil.py", line 10, in <module> test_somme_double() File "conseil.py", line 7, in test_somme_double if y == 0 : raise Exception ("valeur > 0 attendue") Exception: valeur > 0 attendue
File: resume_utile.tex, line 25
import sys print (sys.version)
File: resume_utile.tex, line 43
def fonction () : """fonction de démonstration""" return 0 help (fonction) # affiche fonction de # démonstration
File: resume_utile.tex, line 66
va = <valeur>
File: resume_utile.tex, line 83
t = () # tuple vide t = (2, "e") # tuple de deux éléments print (t[0]) # affiche le premier élément
File: resume_utile.tex, line 108
t [i:j] # correspond à un sous-ensemble allant des indices i à j exclu t [:j] # = t[0:j] t [i:] # = t [i: len (t)]
File: resume_utile.tex, line 116
st = "langage python" st = 'langage python' # idem st = 'un guillement "' # chaîne contenant un guillement st = "un guillement \"" # chaîne contenant un guillement, il faut ajouter \ # pour ne pas confondre avec l'autre guillement st = st.upper () # mise en lettres majuscules i = st.find ("PYTHON") # on cherche "PYTHON" dans st print (i) # affiche 8 Version 3.x, écrire print (i), # pour la version 2.x, écrire print i print (st.count ("PYTHON")) # affiche 1 Version 3.x : idem print (...) print (st.count ("PYTHON", 9)) # affiche 0 Version 3.x : idem print (...)
File: resume_utile.tex, line 189
x = 0.123456789 print ("%1.2f" % x) # donne 0.12 s = "%2.2e %s" % (3.14159, "est une approximation de pi") print (s) # Version 2.x : print s
File: resume_utile.tex, line 203
a = [1,2] b = a
File: resume_utile.tex, line 210
a = [1,2] import copy b = copy.copy (a)
File: resume_utile.tex, line 218
a = [1,2] import copy b = copy.deepcopy (a)
File: resume_utile.tex, line 231
x = [4,5] # création d'une liste composée de deux entiers x = ["un",1,"deux",2] # création d'une liste composée deux chaînes de caractères # et de deux entiers, l'ordre d'écriture est important x = [3,] # création d'une liste d'un élément, sans la virgule, # le résultat reste une liste x = [ ] # crée une liste vide x = list () # crée une liste vide
File: resume_utile.tex, line 368
x = range(0,5) # liste des entiers de 0 à 5 exclu # Version 3.x : range retourne un itérateur, il faut écrire # x = list(range(0,5)) y = [ i for i in x if i % 2 == 0] # sélection des éléments pairs print (y) # affiche [0,2,4] Version 2.x : écrire print y z = [ i+j for i in x for j in x] # construit tous les nombres i+j possibles print (z) # affiche [0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 3, # 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]
File: resume_utile.tex, line 385
x = { "cle1":"valeur1", "cle2":"valeur2" } print (x ["cle1"]) # affiche valeur1 Version 2.x : écrire print ... x [(0,1)] = "clé tuple" # ajoute une nouvelle valeur dont la clé est (0,1) # les parenthèses sont superflues y = { } # crée un dictionnaire vide z = dict () # crée aussi un dictionnaire vide
File: resume_utile.tex, line 490
import numpy a = numpy.array ( [0,1] )
File: resume_utile.tex, line 503
if x < 5 : x = x*2 ...
File: resume_utile.tex, line 511
if x < 5 : x = x*2 ... else : x = x*3 ...
File: resume_utile.tex, line 522
if x < 5 : x=x*2 else : x=x*3
File: resume_utile.tex, line 529
if x < 5 : x = x*2 elif x > 5 : x = x*3 else : x = x*6
File: resume_utile.tex, line 537
if 5 < x and x < 10 : # peut être écrit : if 5 < x < 10 : ...
File: resume_utile.tex, line 546
while condition : # lignes décalées # contenu de la boucle
File: resume_utile.tex, line 554
for i in range(0,n) : # parcourt tous les entiers de 0 à n-1 inclus for i in xrange(0,n) : # même chose mais en plus rapide # Version 3.x : la fonction xrange n'existe plus, # et range équivaut à xrange for i in range(n,0,-1) : # parcourt tous les entiers de n à 1 inclus # dans le sens décroissant for i in range(2,1000,3) : # parcourt tous les entiers de 2 à 1000 de 3 en 3 # (2,5,8,...) for e in li : # parcourt tous les éléments de la liste li for cle,valeur in di.items () : # parcourt tous les éléments du dictionnaire di
File: resume_utile.tex, line 573
l = [ 4, 5, 6 ] s = 0 for i in range(0,len(l)) : s += l[i]
File: resume_utile.tex, line 581
l = [ 4, 5, 6 ] s = 0 for i,x in enumerate(l) : s += x
File: resume_utile.tex, line 591
l = [ 4, 5, 6 ] g = [ 3,10,11 ] s = 0 for i in range(0,len(l)) : s += l[i] + g[i]
File: resume_utile.tex, line 600
l = [ 4, 5, 6 ] g = [ 3,10,11 ] s = 0 for x,y in zip(l,g) : s += x + y
File: resume_utile.tex, line 614
def fonction (x) : return x % 2 li = [ 3,4,5] li2 = map (fonction, li) print (list(li2)) # affiche [ 1, 0, 1 ]
File: resume_utile.tex, line 623
def fonction (x) : if x % 2 == 0 : yield x li = [ 3,4,5] li2 = map (fonction, li) print (list(li2)) # affiche [ 4 ]
File: resume_utile.tex, line 636
with random_matrix(1000,1000) as mat : # appelle mat.__enter__() ... # appelle mat.__exit__()
File: resume_utile.tex, line 652
def exemple_fonction (p1, p2, p3) : # code de la fonction return r1, r2 a,b = exemple_fonction (1,2,3) # exemple d'appel de la fonction
File: resume_utile.tex, line 662
def exemple_fonction (p1, p2 = 4, p3 = 7) : # code de la fonction return r1, r2 a,b = exemple_fonction (1) # = exemple_fonction (1,4,7) a,b = exemple_fonction (1,2,3) # = exemple_fonction (1,2,3) a,b = exemple_fonction (1,2) # = exemple_fonction (1,2,7) a,b = exemple_fonction (1,p3 = 2) # = exemple_fonction (1,4,2)
File: resume_utile.tex, line 675
def exemple_fonction (p1, p2 = 4, p3) : # code de la fonction return r1, r2 # affiche le message d'erreur : SyntaxError: non-default argument follows default argument
File: resume_utile.tex, line 684
def exemple_fonction (p1) : p1 = 3 a = 1 exemple_fonction (a) print (a) # affiche 1
File: resume_utile.tex, line 694
def exemple_fonction (p1) : p1[0] = 3 a = [1] exemple_fonction (a) print (a) # affiche [3] Version 2.x : print ...
File: resume_utile.tex, line 707
def fonction (x) : return x % 2 li = [ 3,4,5] li2 = map (fonction, li) print (list(li2)) # affiche [ 1, 0, 1 ]
File: resume_utile.tex, line 716
li = [ 3,4,5] li2 = map (lambda x : x%2, li) print (list(li2)) # affiche [ 1, 0, 1 ]
File: resume_utile.tex, line 724
li = [ 3,4,5] k = 2 li2 = map (lambda x,y=k : x%k, li) print (list(li2)) # affiche [ 1, 0, 1 ]
File: resume_utile.tex, line 736
def iterate_double_on_list(l) : for x in l : yield x*2 print (iterate_double_on_list( [4,5,6])) # affiche <generator object iterate_double_on_list at 0x025196C0>
File: resume_utile.tex, line 746
for x in iterate_double_on_list( [4,5,6]) : print (x)
File: resume_utile.tex, line 762
class ma_classe : def __init__ (self, att1, att2, att3) : self.att1 = att1 self.att2 = att2 self.att3 = att3 self.att4 = att1 * att2 * att3 a = ma_classe (-1,1,2) # déclare une variable de type ma_classe print (a.att1) # affiche -1 print (a.att2) # affiche 3 Version 2.x : print ... print (a.att3) # affiche 4 print (a.att4) # affiche -12
File: resume_utile.tex, line 779
class ma_classe : def __init__ (self, att1, att2, att3) : self.att1 = att1 self.att2 = att2 self.att3 = att3 self.att4 = self.calcule4 () def calcule4 (self) : return self.att1 * self.att2 * self.att3 a = ma_classe (-1,1,2) # déclare une variable de type ma_classe print (a.att1) # affiche -1 print (a.att2) # affiche 3 print (a.att3) # affiche 4 print (a.att4) # affiche -12
File: resume_utile.tex, line 804
class ma_classe : def __init__ (self, att1, att2, att3) : self.att1 = att1 # attribut self.att2 = att2 # attribut self.att3 = att3 # attribut self.att4 = att1 * att2 * att3 # attribut def calcule (self,x) : # méthode return self.att1 * self.att2 * self.att3 * x a = ma_classe (1,2,3) print (a.att1) # affiche 1 print (a.__dict__ ["att1"]) # affiche aussi 1, ligne équivalente à la précédente print (a.calcule(2)) # appel d'une méthode
File: resume_utile.tex, line 826
class ma_classe : def __init__ (self, att1, att2, att3) : # ... @staticmethod def calcule_static (x,y) : # méthode statique return x * y print (ma_classe.calcule_static(2,3)) # appel d'une méthode statique
File: resume_utile.tex, line 844
class ma_classe : def __init__ (self, att1, att2, att3) : self.att1 = att1 self.att2 = att2 self.att3 = att3 self.att4 = att1 * att2 * att3 def __add__ (self, a) : return ma_classe (self.att1 + a.att1, self.att2 + a.att2, \ self.att3 + a.att3, self.att4 + a.att4) a = ma_classe (1,2,3) b = ma_classe (4,5,6) c = a + b # n'a de sens que si l'opérateur __add__ a été redéfini
File: resume_utile.tex, line 868
class ma_classe : def __init__ (self, att1, att2, att3) : self.att1 = att1 self.att2 = att2 self.att3 = att3 self.att4 = att1 * att2 * att3 a = ma_classe (1,2,3) b = a b.att1 = -16 print (a.att1) # affiche -16 print (b.att1) # affiche -16
File: resume_utile.tex, line 885
class ma_classe : def __init__ (self, att1, att2, att3) : self.att1 = att1 self.att2 = att2 self.att3 = att3 self.att4 = att1 * att2 * att3 a = ma_classe (1,2,3) import copy b = copy.copy (a) b.att1 = -16 print (a.att1) # affiche 1 print (b.att1) # affiche -16
File: resume_utile.tex, line 910
class ma_classe : def __init__ (self, att1, att2, att3) : self.att1 = att1 self.att2 = att2 self.att3 = att3 self.att4 = att1 * att2 * att3 class ma_classe2 (ma_classe) : # héritage simple pass # pour dire que la classe est vide
File: resume_utile.tex, line 928
class ma_classe : def __init__ (self, att1) : self.att1 = att1 self.att2 = self.calcul () def calcul (self) : return self.att1 ** 2 class ma_classe2 (ma_classe) : def calcul (self) : # dans cette méthode, on change le comportement # de la méthode calcul tout en se servant de celui # de la classe mère return ma_classe.calcul (self) * self.att1 a = ma_classe (2) b = ma_classe2 (2) print (a.att2) # affiche 4 = 2 * 2 print (b.att2) # affiche 8 = (2*2) * 2
File: resume_utile.tex, line 955
def makebold(fn): def wrapped(): return "<b>" + fn() + "</b>" return wrapped def makeitalic(fn): def wrapped(): return "<i>" + fn() + "</i>" return wrapped @makebold @makeitalic def hello(): return "hello world" print (hello()) ## returns <b><i>hello world</i></b>
File: resume_utile.tex, line 976
class C(object): def __init__ (self) : self._p = 1 @property def p(self): return self._p @p.setter def p(self, val): self._p = val * 2 obj = C() print (obj.p) # utilise p_get, affiche 1 obj.p = 5 # utilise p_set print (obj.p) # utilise p_get affiche 10
File: resume_utile.tex, line 1003
f = open ("nom-fichier", "w") # ouverture en mode écriture "w" ou écriture ajout "a" f.write ( s ) # écriture de la chaîne de caractères s f.write ( s2 ) # écriture de la chaîne de caractères s2 ... f.close () # fermeture
File: resume_utile.tex, line 1022
with open ("nom-fichier", "w") as f : f.write ( s ) f.write ( s2 )
File: resume_utile.tex, line 1029
with open ("nom-fichier", "w", encoding = "utf8") as f : f.write ( s ) f.write ( s2 )
File: resume_utile.tex, line 1039
f = open ("essai.txt", "r") # ouverture du fichier en mode lecture l = f.readlines () # lecture de toutes les lignes, # elles sont placées dans une liste f.close () # fermeture du fichier for s in l : print (s) # on affiche les lignes à l'écran
File: resume_utile.tex, line 1053
f = open ("essai.txt", "r") # ouverture du fichier en mode lecture l = f.readlines () # lecture de toutes les lignes, # elles sont placées dans une liste placées dans une liste f.close () # fermeture du fichier l_net = [] # contiendra la liste nettoyée des lignes du fichier for s in l : s2 = s.replace ("\n", "") # on supprime le code de fin de ligne \n s2 = s2.replace ("\r", "") # on supprime le code de fin de ligne \r # (Windows uniquement) s2 = s2.strip("\r\n") # cette ligne est équivalente aux deux précédentes l_net.append (s2) # on ajoute le résultat à la liste nettoyée
File: resume_utile.tex, line 1072
nom ; prénom ; livre Hugo ; Victor ; Les misérables Kessel ; Joseph ; Le lion Woolf ; Virginia ; Mrs Dalloway Calvino ; Italo ; Le baron perché
File: resume_utile.tex, line 1082
f = open ("essai.txt", "r") # ouverture du fichier en mode lecture l = f.readlines () # lecture de toutes les lignes, placées dans une liste f.close () # fermeture du fichier for s in l : s2 = s.replace ("\n", "") # on supprime le code de fin de ligne \n s2 = s2.replace ("\r", "") # on supprime le code de fin de ligne \r (Windows uniquement) case = s2.split (";") if len (case) >= 3 : print (case [1], " ", case [0], " a écrit ", case [2]) # Version 2.x : print ...
File: resume_utile.tex, line 1102
# définition du module geometrie.py def carre (x) : return x ** 2 class point : def __init__ (self,x,y) : self.x, self.y = x,y def norme (self) : return (self.x ** 2 + self.y ** 2) ** 0.5
File: resume_utile.tex, line 1120
import geometrie print (geometrie.carre (1.5)) p = geometrie.point (1,2)
File: resume_utile.tex, line 1127
import geometrie as GEO # on donne un pseudonyme au module geometrie print (GEO.carre (1.5)) p = GEO.point (1,2)
File: resume_utile.tex, line 1134
from geometrie import * print (carre (1.5)) p = point (1,2)
File: resume_utile.tex, line 1144
if __name__ == "__main__" : # quelques instructions ici
File: resume_utile.tex, line 1160
def inverse (x): y = 1.0 / x return y b = inverse (0) print (b)
File: resume_utile.tex, line 1170
Traceback (most recent call last): File "cours.py", line 2, in ? y = 1.0 / x ZeroDivisionError: float division
File: resume_utile.tex, line 1179
def inverse (x): y = 1.0 / x return y try : b = inverse (0) # déclenche une exception print (b) except : print ("le programme a déclenché une erreur")
File: resume_utile.tex, line 1192
def inverse (x): y = 1.0 / x return y try : print (inverse (2)) print (inverse (0)) except Exception as exc: print ("exception de type ", exc.__class__) # affiche exception de type exceptions.ZeroDivisionError print ("message ", exc) # affiche le message associé à l'exception
File: resume_utile.tex, line 1208
def inverse (x): y = 1.0 / x return y try : print ((-2.1) ** 3.1) print (inverse (2)) print (inverse (0)) except ZeroDivisionError: print ("division par zéro") except Exception as exc: print ("erreur insoupçonnée : ", exc.__class__) print ("message ", exc)
File: resume_utile.tex, line 1225
class AucunChiffre (Exception) : """chaîne de caractères contenant aussi autre chose que des chiffres""" def __init__(self, s, f = "") : Exception.__init__(self, s) self.s = s self.f = f def __str__(self) : return """exception AucunChiffre, lancée depuis la fonction """ + self.f + \ " avec le paramètre " + self.s def conversion (s) : """conversion d'une chaîne de caractères en entier""" if not s.isdigit () : raise AucunChiffre, (s, "conversion") return int (s) try : s = "123a" i = conversion (s) print (s, " = ", i) except AucunChiffre as exc : print (AucunChiffre.__doc__, " : ", exc) print ("fonction : ", exc.f)
File: resume_utile.tex, line 1264
s = "abcdefghijklmnopqrstuvwxyz" print (s [4]) # affiche "e" print (s [4:6]) # affiche "ef"
File: resume_utile.tex, line 1276
l = [ un, deux, trois, quatre ] up = [] for i in range (0, len (l)) : up.append ( l [i].upper () )
File: resume_utile.tex, line 1295
l = [ "un", "deux", "trois", "quatre" ] up = [] for i in range (0, len (l)) : up.append ( l [i].upper () )
File: resume_utile.tex, line 1304
l = [ "un", "deux", "trois", "quatre" ] up = [] for m in l : up.append ( m.upper () )
File: resume_utile.tex, line 1322
l = [ "un", "deux", "trois", "quatre" ] s = "" for m in l : s += m # concaténation des mots en une seule chaîne de caractères
File: resume_utile.tex, line 1336
a = calcul1 (3) b = calcul2 (a) c = calcul3 (b) # c résultat souhaité et affiché
File: resume_utile.tex, line 1346
def calcul1(x) : return x+3 y = calcul1(4) print (y) # affiche None # car la fonction calcul1 ne retourne pas de résultat, elle l'affiche
File: resume_utile.tex, line 1356
def calcul1(x) : print (x+3) def calcul2(x) : return calcul1(x) + 5 y = calcul2(4) # affiche l'erreur # ported operand type(s) for +: 'NoneType' and 'int'
File: resume_utile.tex, line 1399
def somme_double (liste) : return 1.0 * sum(liste) def test_somme_double () : y = somme_double([ 1 ]) / 2 if y == 0 : raise Exception ("valeur > 0 attendue") if __name__ == "__main__" : test_somme_double()
File: resume_utile.tex, line 1413
Traceback (most recent call last): File "conseil.py", line 10, in <module> test_somme_double() File "conseil.py", line 7, in test_somme_double if y == 0 : raise Exception ("valeur > 0 attendue") Exception: valeur > 0 attendue
File: chapn_tools.tex, line 41
def run () : files = [".\\genchm.py", ".\\genhelp.py", "os", "sys"] res = genhelp.genhelp (files) print res # ['genchm.html', 'genhelp.html', 'os.html', 'sys.html'] genchm (res, "GenHelp") if __name__ == "__main__" : # écrit des informations relatives à l'exécution de la fonction # run () dans le fichier profile.txt import profile profile.run ('run()', "profile.txt") # récupère les informations stockées dans profile.txt # et construit le nombre de passages dans chaque # fonction et les temps d'exécution moyen import pstats p = pstats.Stats('profile.txt') p.strip_dirs().sort_stats(-1).print_stats()
File: chapn_tools.tex, line 62
Mon May 12 22:38:02 2008 profile.txt 77 function calls in 5.557 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 5 0.000 0.000 0.000 0.000 :0(append) 4 0.000 0.000 0.000 0.000 :0(close) 2 0.000 0.000 0.000 0.000 :0(len) 4 0.003 0.001 0.003 0.001 :0(open) 16 0.000 0.000 0.000 0.000 :0(replace) 1 0.001 0.001 0.001 0.001 :0(setprofile) 2 0.000 0.000 0.000 0.000 :0(split) 5 5.551 1.110 5.551 1.110 :0(system) 4 0.000 0.000 0.000 0.000 :0(write) 1 0.000 0.000 5.556 5.556 <string>:1(<module>) 1 0.000 0.000 2.562 2.562 genchm.py:102(genchm) 1 0.000 0.000 0.001 0.001 genchm.py:11(genhhp) 1 0.000 0.000 5.556 5.556 genchm.py:113(run) 1 0.000 0.000 0.001 0.001 genchm.py:42(gen_premierepage) 13 0.000 0.000 0.000 0.000 genchm.py:54(genhh_input) 1 0.000 0.000 0.001 0.001 genchm.py:61(genhhc) 8 0.000 0.000 0.000 0.000 genchm.py:7(g) 1 0.000 0.000 0.001 0.001 genchm.py:83(genhhk) 4 0.000 0.000 2.993 0.748 genhelp.py:17(generate_help_file) 1 0.000 0.000 2.994 2.994 genhelp.py:26(genhelp) 0 0.000 0.000 profile:0(profiler) 1 0.000 0.000 5.557 5.557 profile:0(run())
File: chapn_tools.tex, line 117
>>> addition ( [1,2], [3,-1]) [4, 1]
File: chapn_tools.tex, line 124
def _test(): import doctest print doctest.testmod()
File: chapn_tools.tex, line 130
File "testdoc1.py", line 6, in __main__.addition Failed example: addition ( [1,2], [3,-1]) Expected: [4, 1] Got: [4, 1] ********************************************************************** 1 items had failures: 1 of 2 in __main__.addition ***Test Failed*** 1 failures.
exemple de test avec \codesindex{doctest
# coding: latin-1 def addition (l1, l2): """cette fonction additionne deux listes >>> addition ( [], []) [] >>> addition ( [1,2], [3,-1]) [4, 1] """ res = [] for i in range (0, len (l1)) : res.append ( l1 [i] + l2 [i] ) return res def _test(): import doctest doctest.testmod() if __name__ == "__main__": _test()
File: chapn_tools.tex, line 148
Traceback (most recent call last): ... Exception: listes de tailles différentes
exemple de test plus complet avec \codesindex{doctest
# coding: latin-1 def addition (l1, l2): """cette fonction additionne deux listes >>> addition ( [], []) [] >>> addition ( [1,2], [3,-1]) [4, 1] >>> addition ( [1], [3,-1]) Traceback (most recent call last): ... Exception: listes de tailles différentes """ if len (l1) != len (l2) : raise Exception ("listes de tailles différentes") res = [] for i in range (0, len (l1)) : res.append ( l1 [i] + l2 [i] ) return res def _test(): import doctest doctest.testmod() if __name__ == "__main__": _test()
module à tester
# coding: latin-1 def addition (l1, l2): """cette fonction additionne deux listes""" if len (l1) != len (l2) : raise Exception ("listes de tailles différentes") res = [] for i in range (0, len (l1)) : res.append ( l1 [i] + l2 [i] ) return res
liste de tests avec \codesindex{unittest
# coding: latin-1 import unittest from testunit1 import * class TestCase_for_addition (unittest.TestCase): def test_addition_vide (self) : """test_addition_vide : on vérifie que l'addtion de deux listes retourne une liste vide""" assert [] == addition ( [], [] ) def test_addition (self) : """test_addition : test de [1,2] + [3,-1] != [4,1]""" l1 = [1,2] l2 = [3,-1] l = addition (l1, l2) assert l [0] == 4 and l [1] == 1 def test_exception (self) : """test_exception : on vérifie que l'addition de deux listes de tailles différentes génère une exception""" l1 = [1] l2 = [3,-1] try : l = addition (l1, l2) # la fonction doit lancer une exception assert False # si elle ne le fait pas, alors le test a achoué except Exception, e : # on vérifie que l'exception générée n'est pas due à l'instruction assert False assert str (e.__class__ .__name__) != "AssertionError" # on vérifie ici que le message de l'exception est celui attendu assert str (e) == "listes de tailles différentes" if __name__ == "__main__" : # on lance les tests unittest.main ()
File: chapn_tools.tex, line 187
====================================================================== ERROR: test_addition : test de [1,2] + [3,-1] != [4,1] ---------------------------------------------------------------------- Traceback (most recent call last): File "testunit2.py", line 16, in test_addition assert l [0] == 4 and l [1] == 1 IndexError: list index out of range
File: chapn_tools.tex, line 197
====================================================================== FAIL: on vérifie que l'addition de deux listes de tailles différentes génère une exception ---------------------------------------------------------------------- Traceback (most recent call last): File "testunit2.py", line 27, in test_exception assert str (e.__class__ .__name__) != "AssertionError" AssertionError
exécution de tests unitaires répartis sur plusieurs fichiers
# coding: latin-1 import unittest import os def get_test_file () : """retourne la liste de tous les fichiers *.py commençant par test_""" li = os.listdir (".") li = [ l for l in li if "test_" in l and ".py" in l and \ ".pyc" not in l and ".pyd" not in l] return li def import_files (li) : """pour un fichier test_*.py, cherche les classes Test... et crée une suite de test pour ses méthodes commençant par test..., retourne la suite de test""" allsuite = [] for l in li : fi = l.replace (".py", "") mo = __import__ (fi) cl = dir (mo) for c in cl : if len (c) < 5 or c [:4] != "Test" : continue # classe de test c testsuite = unittest.TestSuite () exec compile ("di = dir (mo." + c + ")", "", "exec") for d in di : if len (d) < 5 or d [:4] != "test" : continue # method d.c exec compile ("t = mo." + c + "(\"" + d + "\")", "", "exec") testsuite.addTest (t) allsuite.append ((testsuite, l)) return allsuite def main () : """crée puis lance les suites de textes définis dans des programmes test_*.py""" li = get_test_file () suite = import_files (li) runner = unittest.TextTestRunner() for s in suite : print "running test for ", s [1] runner.run (s [0]) if __name__ == "__main__" : main ()
File: chapn_tools.tex, line 221
# coding: cp1252 import glob import shutil def copie_repertoire (rep1, rep2) : """copie tous les fichiers d'un répertoire rep1 vers un autre rep2""" li = glob.glob (rep1 + "/*.*") for l in li : to = l.replace (rep1, rep2) # nom du fichier copié (on remplace rep1 par rep2) shutil.copy (l, to) copie_repertoire ("c:/original", "c:/backup")
File: chapn_tools.tex, line 235
c:\python25\python.exe synchro.py c:/original c:/backup
File: chapn_tools.tex, line 247
interpréteur_python programme_python argument1 argument2 ...
lancer un programme \pythons en ligne de commande
# coding: latin-1 import glob import shutil def copie_repertoire (rep1, rep2) : """copie tous les fichiers d'un répertoire rep1 vers un autre rep2""" li = glob.glob (rep1 + "/*.*") for l in li : to = l.replace (rep1, rep2) # nom du fichier copié # (on remplace rep1 par rep2) shutil.copy (l, to) import sys # sys.argv [0] --> nom du programme (ici, synchro.py) rep1 = sys.argv [1] # récupération du premier paramètre rep2 = sys.argv [2] # récupération du second paramètre copie_repertoire (rep1, rep2)
File: chapn_tools.tex, line 265
c:\python25\python.exe c:\batch\synchro.py "c:\Program Files\source" "c:\Program Files\backup"
File: chapn_tools.tex, line 276
os.system ("scite -open:fichier.txt")
File: chapn_tools.tex, line 282
import subprocess args = ["scite.exe", "-open:fichier.txt"] proc = subprocess.Popen(args) retcode = proc.wait() # on attend la fin de l'exécution if retcode!=0: # ici, traiter les erreurs
File: chapn_tools.tex, line 293
import subprocess args = ["scite.exe", "-open:fichier.txt", ">>output.txt"] proc = subprocess.Popen(args)
File: chapn_tools.tex, line 457
cd "répertoire d'installation de SVN\bin" svnadmin create c:\svnrepository
File: chapn_tools.tex, line 472
ping 127.0.0.1
File: chapn_tools.tex, line 480
http://127.0.0.1:81/
File: chapn_tools.tex, line 517
c:\python25\python c:\python25\lib\pydoc.py random c:\python25\python c:\python25\lib\pydoc.py .\mon_programme.py
File: chapn_tools.tex, line 522
import os os.system (r"c:\python25\python c:\python25\lib\pydoc.py .\mon_programme.py")
génération automatique de l'aide
# coding: latin-1 """genhelp.py : génération automatique de l'aide dans le répertoire d'exécution""" import os import sys python_path = r"c:\python25\python" # constante pydoc_path = r"c:\python25\lib\pydoc.py" # constante class ClassExemple : """classe vide, exemple d'aide""" def __init__ (self) : """constructeur""" pass def methode (self) : """unique méthode""" return 1 def generate_help_file (f, pyt = python_path, pyd = pydoc_path) : """génère l'aide associée à un fichier ou un module le nom de ce fichier peut apparaître sans son extension ou alors précédé de .\\ ou avec son chemin complet pyt est le répertoire de python pyd est l'emplacement de pydoc.py""" s = "call " + pyt + " " + pyd + " -w " + f os.system (s) def replace_firstpage (file, page) : """la génération de l'aide chm s'arrête avant la fin si le lien <a href=".">index</a> est laissé dans les pages générées par pydoc, on le remplace par une page comme index.html""" f = open (file, "r") li = f.readlines () f.close () f = open (file, "w") for l in li : f.write (l.replace ("""<a href=".">index</a>""", page)) f.close () def genhelp (files, pyt = python_path, pyd = pydoc_path, firstpage = "index.html") : """génère l'aide associée à des fichiers ou des modules, un fichier se distingue d'un module par son extension, retourne la liste des fichiers générés, pyt est le répertoire de python pyd est l'emplacement de pydoc.py firstpage voir fonction replace_firstpage""" res = [] for f in files : print "génération de l'aide de ", f if ".py" in f : # fichier generate_help_file (f, pyt, pyd) g = f.split ("\\") # ne garde que le nom de fichier et non son chemin page = g [ len (g)-1].replace (".py", ".html") else : # module generate_help_file (f, pyt, pyd) page = f + ".html" res.append (page) replace_firstpage (page, firstpage) return res if __name__ == "__main__" : import sys import os files = [".\\genchm.py", ".\\genhelp.py", "os", "sys"] res = genhelp (files) print res # ['genchm.html', 'genhelp.html', 'os.html', 'sys.html']
exemple de fichier \textit{hpp
[OPTIONS] Compatibility=1.1 Full-text search=Yes Contents file=help.hhc # fichier table des matières Default Window=main Default topic=index.html # page par défaut, première page à apparaître Index file=help.hhk # fichier index Language=0x40C French Binary TOC=YES Create CHI file=No Title="GenHelp" # titre [WINDOWS] # définition de la page principale, elle reprend des éléments cités ci-dessus main="GenHelp", "help.hhc", "help.hhk" , "index.html", "index.html",,,,,0x23520,,0x387e,,,,,,,,0 [FILES] # ici commence la liste des fichiers à insérer dans le projet genchm.html genhelp.html os.html sys.html index.html
File: chapn_tools.tex, line 568
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML><HEAD></HEAD><BODY>
File: chapn_tools.tex, line 572
</BODY></HTML>
File: chapn_tools.tex, line 576
<LI><OBJECT type="text/sitemap"> <param name="Name" value="intitule"> <param name="Local" value="page HTML correspondante"> <param name="ImageNumber" value="11"></OBJECT>
exemple de fichier \textit{hhk
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML><HEAD></HEAD><BODY> <OBJECT type="text/site properties">param name="GenHelp" value="right">OBJECT> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="GenHelp"> <param name="Local" value="index.html"> <param name="ImageNumber" value="11"></OBJECT> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="genchm"> <param name="Local" value="genchm.html"> <param name="ImageNumber" value="11"></OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="genhelp"> <param name="Local" value="genhelp.html"> <param name="ImageNumber" value="11"></OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="os"> <param name="Local" value="os.html"> <param name="ImageNumber" value="11"></OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="sys"> <param name="Local" value="sys.html"> <param name="ImageNumber" value="11"></OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="index"> <param name="Local" value="index.html"> <param name="ImageNumber" value="11"></OBJECT> </UL> </UL> </BODY></HTML>
génération automatique d'un fichier \textit{chm
# coding: latin-1 """genchm.py : génération automatique du fichier d'aide chm""" import genhelp import os htmlworkshop_path = "\"c:\\Program Files\\HTML Help Workshop\\hhc.exe\"" def g (s) : """ajoute des guillements autour d'une chaîne de caractères""" return "\"" + s + "\"" def genhhp (files, premierepage, titre, \ hhp = "help.hhp", hhc = "help.hhc", hhk = "help.hhk") : """génère le fichier hpp définissant le fichier d'aide chm, files est la liste des fichiers HTML premierepage est la page à afficher en premier titre est le titre de l'aide""" proj = """[OPTIONS] Compatibility=1.1 Full-text search=Yes Contents file=""" + hhc + """ Default Window=main Default topic=""" + premierepage + """ Index file=""" + hhk + """ Language=0x40C French Binary TOC=YES Create CHI file=No Title=""" + g (titre) + """ [WINDOWS] main=""" + g (titre) + """, """ + g (hhc) + """, """ + g (hhk) + """ , """ + \ g (premierepage) + """, """ + g (premierepage) + """,,,,,0x23520,,0x387e,,,,,,,,0 [FILES] """ for f in files : proj += f + "\n" f = open (hhp, "w") f.write (proj) f.close () def gen_premierepage (files, titre, res = "index.html") : """génère la première page de l'aide au format HTML""" s = """<HTML><head><title>""" + titre + """</title></head><BODY>\n""" s += "<H1>" + titre + "</H1>\n" for f in files : s += "<A HREF=\"" + f + "\">" + f.replace (".html", "") + "</A><BR>\n" s += "</BODY></HTML>\n" f = open (res, "w") f.write (s) f.close () def genhh_input (entree, page, link = True) : """retourne la chaîne de caractères associée à une entrée de la table des matières""" res = """<LI><OBJECT type="text/sitemap"><param name="Name" value=\"""" + entree + """\">""" if link : res += """<param name="Local" value=\"""" + page + """\">""" res += """<param name="ImageNumber" value="11"></OBJECT>\n""" return res def genhhc (files, premierepage, titre, hhc = "help.hhc") : """génère le fichier hhc, même paramètre que pour hhp""" res ="""<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML><HEAD></HEAD><BODY> <OBJECT type="text/site properties"> <param name=""" + g (titre) + """ value="right"> </OBJECT> <UL>""" res += genhh_input (titre, premierepage, False) res += "<UL>\n" res += genhh_input ("modules", premierepage, False) res += "<UL>\n" for f in files : res += genhh_input (f.replace (".html", ""), f) res += "</UL>\n" res += "</UL>\n" res += "</UL>\n" res += "</BODY></HTML>\n" f = open (hhc, "w") f.write (res) f.close () def genhhk (files, premierepage, titre, hhk = "help.hhk") : """génère le fichier hhk, même paramètre que pour hhp""" res ="""<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML><HEAD></HEAD><BODY> <OBJECT type="text/site properties"> <param name=""" + g (titre) + """ value="right"> </OBJECT> <UL>""" res += genhh_input (titre, premierepage) res += "<UL>\n" for f in files : res += genhh_input (f.replace (".html", ""), f) res += "</UL>\n" res += "</UL>\n" res += "</BODY></HTML>\n" f = open (hhk, "w") f.write (res) f.close () def genchm (files, titre, \ hhp = "help.hhp", hhc = "help.hhc", hhk = "help.hhk") : """génère le fichier d'aide complet""" premierepage = "index.html" # génère la page de garde gen_premierepage (files, titre, premierepage) files.append (premierepage) genhhp (files, premierepage, titre) # génère le fichier hhp genhhc (files, premierepage, titre) # génère le fichier hhc genhhk (files, premierepage, titre) # génère le fichier hhk os.system (htmlworkshop_path + " " + hhp) # appelle HTML WorkShop en ligne de commande if __name__ == "__main__" : files = [".\\genchm.py", ".\\genhelp.py", "os", "sys"] res = genhelp.genhelp (files) print res # ['genchm.html', 'genhelp.html', 'os.html', 'sys.html'] genchm (res, "GenHelp")
File: chapn_tools.tex, line 625
[Setup] ; nom de la section AppName=HalPython ; nom de l'application à installer AppVerName=HalPython 1.5.1162 ; numéro de version AppPublisher=Xavier Dupré ; auteur AppPublisherURL=http://www.xavierdupre.fr/ ; site web AppSupportURL=http://www.xavierdupre.fr/ ; site web, support AppUpdatesURL=http://www.xavierdupre.fr/ ; site web, mise à jour DefaultDirName={pf}/HalPython ; emplacement par défaut sur la machine utilisateur ; le code {pf} signife le répertoire \textit{Program Files} DefaultGroupName=HalPython ; nom par défaut du sous menu dans ; Démarrer / Tous les programmes OutputDir=c: ; répertoire où sera écrit l'installateur OutputBaseFilename=setup_HalPython_py25 ; nom de l'installateur ou setup Compression=lzma ; type de compression, ne pas changer SolidCompression=yes ; type de compression, ne pas changer VersionInfoVersion=1.0.0 ; version, ne pas changer
File: chapn_tools.tex, line 648
[Files] Source: "chemin_concepteur"; DestDir: "chemin_utilisateur" ; Source: "..\hal_dll.dll"; DestDir: "{app}\hal_python" ; autre exemple
File: chapn_tools.tex, line 660
[Run] Filename: "{win}\system32\msiexec.exe"; Parameters: "/i ""{app}\python-2.5.2.msi"" /qr ALLUSERS=1"; Filename: "{cmd}"; Parameters: "/c del python-2.5.2.msi"; WorkingDir: "{app}";
File: chapn_tools.tex, line 671
[Icons] ; liens vers diverses applications Name: "{group}\PyScripter"; Filename: "{app}\PyScripter.exe"; WorkingDir: "{app}" Name: "{group}\PyScripter Help"; Filename: "{app}\pyscripter.chm"; WorkingDir: "{app}" Name: "{group}\Help"; Filename: "{app}\hal_python.chm"; WorkingDir: "{app}" Name: "{group}\smallest sample with PyScripter"; Filename: "{app}\small_sample.bat"; WorkingDir: "{app}" ; hyperlien ou url vers un site Name: "{group}\Website"; Filename: "{app}\hal_python.url" ; lien vers le désinstalleur créé automatiquement par InnoSetup Name: "{group}\uninstall"; Filename: "{uninstallexe}"; WorkingDir: "{app}"
File: chapn_tools.tex, line 688
[InternetShortcut] URL=http://www.xavierdupre.fr/hal_python/hal_python_help_html/index.html
File: chapn_tools.tex, line 695
[Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkedonce
File: chapn_tools.tex, line 705
[Registry] Root: HKLM; Subkey: "SOFTWARE\HalPython\InstallPath"; ValueType: string; ValueName: ""; ValueData: "{app}"; Flags: uninsdeletekey Root: HKLM; Subkey: "SOFTWARE\HalPython\Version"; ValueType: string; ValueName: ""; ValueData: "1.5.1162"; Flags: uninsdeletekey
construction d'un installateur
; section non commentée [Setup] AppName=HalPython AppVerName=HalPython 1.5.1162 AppPublisher=Xavier Dupré AppPublisherURL=http://www.xavierdupre.fr/hal_python/hal_python_help_html/index.html AppSupportURL=http://www.xavierdupre.fr/hal_python/hal_python_help_html/index.html AppUpdatesURL=http://www.xavierdupre.fr/hal_python/hal_python_help_html/index.html DefaultDirName={pf}/HalPython DefaultGroupName=HalPython OutputDir=D:\Dupre\_data\site\hal_python\executable OutputBaseFilename=setup_HalPython_py25 Compression=lzma SolidCompression=yes VersionInfoVersion=1.0.0 [Code] ; cette fonction retourne le chemin d'installation de Python 2.5 ; le résultat est vide si celui-ci n'a pas été installé ; le chemin est celui stocké dans la clé de registre ; HKLM\Software\Python\PythonCore\2.5\InstallPath function GetPythonPath(Param: String): String; begin Result := ''; Result := ExpandConstant('{reg:HKLM\Software\Python\PythonCore\2.5\InstallPath,|}'); if Result <> '' then Result := Result + '\pythonw.exe'; end; ; cette fonction retourne {win}\system32\msiexec.exe ; si Python 2.5 a été installé, vide sinon function GetPythonPathExec(Param: String): String; begin Result := GetPythonPath () ; if Result <> '' then Result := ExpandConstant('{win}\system32\msiexec.exe') ; end; ; clés de registre ; mémorise le répertoire d'installation ; et le numéro de version [Registry] Root: HKLM; Subkey: "SOFTWARE\HalPython\InstallPath"; ValueType: string; ValueName: ""; ValueData: "{app}"; Flags: uninsdeletekey Root: HKLM; Subkey: "SOFTWARE\HalPython\Version"; ValueType: string; ValueName: ""; ValueData: "1.5.1162"; Flags: uninsdeletekey ; icône sur le bureau [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkedonce ; fichiers [Files] ; le module en question Source: "..\hal_dll.dll"; DestDir: "{app}\hal_python"; Source: "..\hal_dll_ext.dll"; DestDir: "{app}\hal_python"; Source: "..\hal_dll_model.dll"; DestDir: "{app}\hal_python"; Source: "..\hal_python.dll"; DestDir: "{app}\hal_python"; Source: "..\wxwindows_old.dll"; DestDir: "{app}\hal_python"; Source: "..\boost_python.dll"; DestDir: "{app}\hal_python"; Source: "..\_graphviz_draw.exe"; DestDir: "{app}\hal_python"; Source: "..\_hal_script.exe"; DestDir: "{app}\hal_python"; Source: "..\hal_python.py"; DestDir: "{app}\hal_python"; Source: "..\install\__init__.py"; DestDir: "{app}\hal_python"; Source: "..\install\setup.py"; DestDir: "{app}"; Source: "..\_test\temp\hal_python.chm"; DestDir: "{app}"; ; les fichiers annexes Source: "hal_python.url"; DestDir: "{app}"; URL de l'application Source: "pyscripter.chm"; DestDir: "{app}"; aide de l'éditeur PyScripter Source: "PyScripter.exe"; DestDir: "{app}"; éditeur PyScripter Source: "python-2.5.2.msi"; DestDir: "{app}"; installateur Python 2.5 Source: "sample.bat"; DestDir: "{app}"; fichier de commande Source: "sample.py"; DestDir: "{app}"; exemple de programme ; création des icônes [Icons] Name: "{group}\PyScripter"; Filename: "{app}\PyScripter.exe"; WorkingDir: "{app}" Name: "{group}\PyScripter Help"; Filename: "{app}\pyscripter.chm"; WorkingDir: "{app}" Name: "{group}\Help"; Filename: "{app}\hal_python.chm"; WorkingDir: "{app}" Name: "{group}\smallest sample with PyScripter"; Filename: "{app}\small_sample.bat"; WorkingDir: "{app}" Name: "{group}\Website"; Filename: "{app}\hal_python.url" Name: "{group}\uninstall"; Filename: "{uninstallexe}"; WorkingDir: "{app}" [Run] ; installe Python 2.5 si GetPythonPathExec retourne un résultat non vide ; passe à l'instruction suivante sinon Filename: "{code:GetPythonPathExec}"; Parameters: "/i ""{app}\python-2.5.2.msi"" /qr ALLUSERS=1"; StatusMsg: "Installing Python 2.5..."; Flags: skipifdoesntexist ; installe le module si GetPythonPath retourne un résultat non vide ; passe à l'instruction suivante sinon ; exécute en fait l'insttruction python setup.py install Filename: "{code:GetPythonPath}"; Parameters:"setup.py install"; WorkingDir: "{app}"; StatusMsg: "Installing HalPython for Python 2.5..." ; supprime l'installation de Python 2.5 Filename: "{cmd}"; Parameters: "/c del python-2.5.2.msi"; WorkingDir: "{app}";
File: chapn_tools.tex, line 730
PyScripter.exe sample.py
construction d'un installateur de mise à jour
; section non commentée [Setup] AppName=HalPython AppVerName=HalPython 1.5.1162 AppPublisher=Xavier Dupré AppPublisherURL=http://www.xavierdupre.fr/hal_python/hal_python_help_html/index.html AppSupportURL=http://www.xavierdupre.fr/hal_python/hal_python_help_html/index.html AppUpdatesURL=http://www.xavierdupre.fr/hal_python/hal_python_help_html/index.html DefaultDirName={pf}/HalPython DefaultGroupName=HalPython OutputDir=D:\Dupre\_data\site\hal_python\executable OutputBaseFilename=setup_HalPython_update_py25 Compression=lzma SolidCompression=yes VersionInfoVersion=1.0.0 [Code] function GetPythonPath(Param: String): String; begin Result := ''; Result := ExpandConstant('{reg:HKLM\Software\Python\PythonCore\2.5\InstallPath,|}'); if Result <> '' then Result := Result + '\pythonw.exe'; end; function GetHalPythonPath(Param: String): String; begin Result := ''; Result := ExpandConstant ('{reg:HKLM\Software\HalPython\InstallPath,|}') ; end; function InitializeSetup(): Boolean; begin Result := True ; MsgBox (GetPythonPath (''), mbConfirmation, MB_OK) ; MsgBox (GetHalPythonPath (''), mbConfirmation, MB_OK) ; if GetPythonPath ('') = '' then begin MsgBox('Python 2.5 has not been installed. You should download the complete Setup with Python 2.5 included instead of updating.', mbError, MB_OK) ; Result := False ; end else if GetHalPythonPath ('') = '' then begin MsgBox('HalPython for Python 2.5 has not been installed. You should download the complete Setup with Python 2.5 included instead of updating.', mbError, MB_OK) ; Result := False ; end end; [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkedonce [Files] Source: "..\hal_dll.dll"; DestDir: "{app}\hal_python"; Source: "..\hal_dll_ext.dll"; DestDir: "{app}\hal_python"; Source: "..\hal_dll_model.dll"; DestDir: "{app}\hal_python"; Source: "..\hal_python.dll"; DestDir: "{app}\hal_python"; Source: "..\wxwindows_old.dll"; DestDir: "{app}\hal_python"; Source: "..\boost_python.dll"; DestDir: "{app}\hal_python"; Source: "..\_graphviz_draw.exe"; DestDir: "{app}\hal_python"; Source: "..\_hal_script.exe"; DestDir: "{app}\hal_python"; Source: "..\hal_python.py"; DestDir: "{app}\hal_python"; Source: "..\install\__init__.py"; DestDir: "{app}\hal_python"; Source: "..\install\setup.py"; DestDir: "{app}"; Source: "hal_python.url"; DestDir: "{app}"; Source: "small_sample.bat"; DestDir: "{app}"; Source: "sample.py"; DestDir: "{app}"; Source: "..\_test\temp\hal_python.chm"; DestDir: "{app}"; [Registry] Root: HKLM; Subkey: "SOFTWARE\HalPython\InstallPath"; ValueType: string; ValueName: ""; ValueData: "{app}"; Flags: uninsdeletekey Root: HKLM; Subkey: "SOFTWARE\HalPython\Version"; ValueType: string; ValueName: ""; ValueData: "1.5.1162"; Flags: uninsdeletekey [Icons] Name: "{group}\PyScripter"; Filename: "{app}\PyScripter.exe"; WorkingDir: "{app}" Name: "{group}\PyScripter Help"; Filename: "{app}\pyscripter.chm"; WorkingDir: "{app}" Name: "{group}\Help"; Filename: "{app}\hal_python.chm"; WorkingDir: "{app}" Name: "{group}\smallest sample with PyScripter"; Filename: "{app}\small_sample.bat"; WorkingDir: "{app}" Name: "{group}\Website"; Filename: "{app}\hal_python.url" Name: "{group}\uninstall"; Filename: "{uninstallexe}"; WorkingDir: "{app}" [Run] Filename: "{code:GetPythonPath}"; Parameters:"setup.py install"; WorkingDir: "{app}"; StatusMsg: "Installing HalPython for Python 2.5..."
File: chapn_tools.tex, line 747
[Code] function GetLnkSciTE(Param:String): String; begin Result := CreateShellLink(ExpandConstant('{app}\SciTE sample.lnk'), 'Opens SciTE with a sample', ExpandConstant('{app}\wscite\scite.exe'), ExpandConstant('"{app}\sample.py"'), ExpandConstant('{app}'), '', 0, SW_SHOWNORMAL); end; [Icons] Name: "{group}\smallest sample with SciTE"; Filename: "{code:GetLnkSciTE}"; WorkingDir: "{app}"
File: chapn_tools.tex, line 769
def replace_string (file, s1, s2) : f = open (file, "r") li = f.readlines () f.close () f = open (file, "w") for l in li : s = l.replace (s1, s2) f.write (s) f.close () if __name__ == "__main__" : import sys file = sys.argv [1] # fichier à modifier s1 = sys.argv [2] # chaîne à remplacer s2 = sys.argv [3] # nouvelle chaîne replace_string (file, s1, s2)
File: chapn_tools.tex, line 790
[Code] ; retourne le chemin du programme pythonw.exe function GetPythonPathW(Param: String): String; begin Result := ''; Result := ExpandConstant('{reg:HKLM\Software\Python\PythonCore\2.5\InstallPath,|}'); if Result <> '' then Result := Result + '\pythonw'; end; ; construit les paramètres de la ligne de commande ; "c:\Program Files\HalPython\replace_conf.py" "=pythonw" "=c:\python25\pythonw" function GetReplaceConf(Param:String):String; begin Result := ExpandConstant ('"{app}\replace_conf.py"') Result := Result + ' ' + ExpandConstant ('"{app}\wscite\python.properties"') Result := Result + ' "=pythonw"' Result := Result + ' "=' + GetPythonPathW ('') + '"' ; end; [Run] ; exécution de la ligne de commande Filename: "{code:GetPythonPath}"; Parameters:"{code:GetReplaceConf}"; WorkingDir: "{app}";
File: chapn_tools.tex, line 818
c:\python25\pythonw "c:\Program Files\HalPython\replace_conf.py" "=pythonw" "=c:\python25\pythonw"
File: chapn_tools.tex, line 855
C: cd c:\TEMP\moin-1.6.3 C:\Python25\python setup.py install --record=install.log
File: chapn_tools.tex, line 864
cd C:\ md Moin md Moin\mywiki md Moin\mywiki\data md Moin\mywiki\underlay cd c:\Python25\share\moin xcopy data C:\Moin\mywiki\data /E xcopy underlay C:\Moin\mywiki\underlay /E copy config\*.* C:\Moin\mywiki\*.* copy server\*.* C:\Moin\mywiki\*.*
File: chapn_tools.tex, line 892
#!/usr/env/bin python
File: chapn_tools.tex, line 897
#!c:/Python25/python.exe
File: chapn_tools.tex, line 912
data_dir = r'C:\Moin\mywiki\data' data_underlay_dir = r'C:\Moin\mywiki\underlay'
File: chapn_tools.tex, line 919
actions_excluded = ['DeletePage', 'RenamePage', ]
File: chapn_tools.tex, line 925
superuser = [u"admin", ]
File: chapn_tools.tex, line 931
acl_rights_before = u"admin:read,write,delete,revert,admin"
File: chapn_tools.tex, line 940
sitename = u'NomSite' page_front_page = u"FirstPage"
File: chapn_tools.tex, line 948
language_default = 'fr'
File: chapn_tools.tex, line 986
acl_rights_default = u"dupre:read,write,delete,revert,admin All:read"
File: chapn_tools.tex, line 1008
theme_default = 'modern'
File: chapn_tools.tex, line 1040
<<TableOfContents(2)>> = Titre 1 = http://www.xavierdupre.fr/mywiki/XavierDupre == Titre 1 niveau 2 == = Titre 2 = Affichage d'une liste : * élément 1 * élément 2 * élement 3 : sous liste * sous élément 1 * sous élément 2 * dernier élément de la première liste ''italique'' '''gras''' __souligné__ une ligne ----
File: chapn_tools.tex, line 1079
http://www.xavierdupre.fr/mywiki/XavierDupre [[http://www.xavierdupre.fr/mywiki/XavierDupre|wiki de Xavier Dupré]]
File: chapn_tools.tex, line 1095
#acl dupre:read,write
File: chapn_tools.tex, line 1109
<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/python_cgi"> Options FollowSymLinks AllowOverride None Order deny,allow Allow from all </Directory> Alias /pycgih "C:/Program Files/Apache Software Foundation/Apache2.2/python_cgi" ScriptAlias /pycgi "C:/Program Files/Apache Software Foundation/Apache2.2/python_cgi"
File: chapn_tools.tex, line 1124
#!c:/Python25/python.exe # ligne 1 : emplacement de python (obligatoire) # ligne 2 : la page ne contiendra que du texte print "Content-Type: text/plain\n\n" # premier message au navigateur print "premier message\n"
File: chapn_tools.tex, line 1135
<html><body> <h1> Lien vers un script CGI écrit en Python </h1> <a href="/pycgi/hello.cgi">hello.cgi</a> </body></html>
File: chapn_tools.tex, line 1144
http://localhost/pycgih/index.html
File: chapn_tools.tex, line 1159
print "Content-Type: text/html\n\n"
File: chapn_tools.tex, line 1166
#!c:/Python25/python.exe # coding: cp1252 print "Content-Type: text/html\n\n" # premier message au navigateur, # les passages à la ligne \n sont sans effet à l'affichage print "<html><body>\n" print "<b>premier message en gras</b>\n" print "</body></html>"
File: chapn_tools.tex, line 1187
#!c:/Python25/python.exe # coding: cp1252 print "Content-Type: text/html\n\n" print "<html><body>\n" try: print "<b>premier message en gras</b>\n" print "<br>déclenchement d'une erreur (instruction inconnue)<br>" stop except: import sys import traceback print "<pre>" traceback.print_exc(file=sys.stdout) print "</pre>" print "</body></html>"
File: chapn_tools.tex, line 1207
Traceback (most recent call last): File "C:/Program Files/Apache Software Foundation/Apache2.2/python_cgi/hello4.cgi", line 8, in stop NameError: name 'stop' is not defined
File: chapn_tools.tex, line 1221
<balise> .... </balise>
File: chapn_tools.tex, line 1228
<html> <head> .... entête de la page, n'est pas affiché, il est possible d'y définir .... des feuilles de styles pour un affichage amélioré .... ou la définition de nouvelles balises .... la ligne <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> .... permet de définir un jeu de caractères incluant les accents français </head> <body> .... contenu de la page </body> </html>
File: chapn_tools.tex, line 1300
http://URL?param1=valeur1¶m2=valeur2&...
File: chapn_tools.tex, line 1307
#!c:/Python25/python.exe # coding: cp1252 print "Content-Type: text/html\n\n" print "<html><body>\n" import cgi par = cgi.FieldStorage() if len (par) == 0 : print "<b> aucun paramètre à cette page </b>" else : print "<b>liste des paramètres </b><br>" print """<table border="1">""" for p in par : print "<tr>" name = str (p) value = par.getvalue (name) print "<td>", name, "</td><td>", value, "</td>" print "</tr>" print "</table>" print "</body></html>"
File: chapn_tools.tex, line 1332
http://localhost/pycgi/pyform.cgi
File: chapn_tools.tex, line 1337
http://localhost/pycgi/pyform.cgi?nom=dupre&prenom=xavier
File: chapn_tools.tex, line 1351
#!c:/Python25/python.exe # coding: cp1252 print "Content-Type: text/html\n\n" print "<html><body>\n" def print_form () : # création du formulaire avec deux champs nom et et prenom print """ <FORM action="/pycgi/pyform.cgi" method=post> <P> <LABEL for="nom">Nom : </LABEL> <INPUT type="text" name="nom"><BR> <LABEL for="prenom">Prénom : </LABEL> <INPUT type="text" name="prenom"><BR> <INPUT type=submit value="Envoyer"> <INPUT type=reset value="Annuler"> </P> </FORM> """ import cgi par = cgi.FieldStorage () if len (par) == 0 : # s'il n'y a aucun paramètre, on affiche le formulaire print_form () else : # sinon, cela signifie que le formulaire a rappelé le script CGI # avec des paramètres et le traitement suit une direction différente # ici, cela consiste à afficher les informations reçues en gras nom = par.getvalue ("nom") prenom = par.getvalue ("prenom") print "Votre nom est <b>", nom, "</b> et votre prénom <b>", prenom, "</b>" print "</html></body>\n"
File: chapn_tools.tex, line 1423
SELECT codepays FROM PAYS WHERE pays = 'France'
File: chapn_tools.tex, line 1431
SELECT num,nom,prenom FROM ELEVE WHERE codepays IN ( SELECT codepays FROM PAYS WHERE pays = 'France' )
File: chapn_tools.tex, line 1476
SELECT nom,prenom,AVG(note) FROM ELEVE,NOTE WHERE num = nume and numm IN ( SELECT num FROM MATIERES WHERE matiere = 'français' ) GROUP BY nume
File: chapn_tools.tex, line 1490
CREATE TABLE ELEVE ( num integer primary key, nom varchar (30), prenom varchar (30), date date, adresse varchar (100), codepays integer, classe integer)
création d'une table avec \codesindex{sqlite3
import sqlite3 as SQL cx = SQL.connect("madatabase.db3") cur = cx.cursor() cur.execute (""" CREATE TABLE ELEVE ( num integer primary key, nom varchar (30), prenom varchar (30), date date, adresse varchar (100), codepays integer, classe integer) """)
File: chapn_tools.tex, line 1509
cur.execute ("CREATE TABLE NOTE (nume integer, numm integer, note double)") cur.execute ("CREATE TABLE MATIERES (num integer, matiere varchar (30))") cur.execute ("CREATE TABLE PAYS (codepays integer, pays varchar (30))")
insertion de valeurs dans une table \codesindex{sqlite3
import sqlite3 as SQL cx = SQL.connect("madatabase.db3") cur = cx.cursor() cur.execute (""" CREATE TABLE ELEVE ( num integer primary key, nom varchar (30), prenom varchar (30), date date, adresse varchar (100), codepays integer, classe integer) """)
File: chapn_tools.tex, line 1520
import sqlite3 as SQL cx = SQL.connect("madatabase.db3") cur = cx.cursor() cur.execute("select * from ELEVE") for row in cur.fetchall(): print row
File: chapn_tools.tex, line 1529
(1, u'dupre', u'xavier', u'11/08/1975', u'---- paris', 33, 19) (2, u'dupre', u'gilles', u'24/12/1946', u'---- charleville', 33, 56)
File: chapn_tools.tex, line 1537
cur.execute ("INSERT INTO PAYS (codepays, pays) VALUES (33, 'France')") cur.execute ("INSERT INTO PAYS (codepays, pays) VALUES (44, 'Royaume-Uni')") cur.execute ("INSERT INTO MATIERES (matiere, num) VALUES ('français', 1)") cur.execute ("INSERT INTO MATIERES (matiere, num) VALUES ('mathématiques', 2)") cx.commit ()
File: chapn_tools.tex, line 1547
note = [(1, 1, 12), (1, 1, 14), (1, 2, 16), (1, 2, 8), (1, 2, 12), \ (2, 1, 8), (2, 1, 9), (2, 2, 11), (2, 2, 8), (2, 2, 12)] for n in note : req = "INSERT INTO NOTE (nume,numm,note) VALUES " + str (n) cur.execute (req) cx.commit ()
File: chapn_tools.tex, line 1558
req = """ SELECT nom,prenom,AVG(note) FROM ELEVE,NOTE WHERE num = nume and numm IN ( SELECT num FROM MATIERES WHERE matiere = 'français' ) GROUP BY nume """ cur.execute (req) for row in cur.fetchall(): print row
File: chapn_tools.tex, line 1570
(u'dupre', u'xavier', 13.0) (u'dupre', u'gilles', 8.5)
File: chapn_tools.tex, line 1577
req = """ SELECT nom,prenom,AVG(note) FROM ELEVE,NOTE WHERE num = nume and numm IN ( SELECT num FROM MATIERES WHERE matiere = 'français' ) GROUP BY nume HAVING AVG(note) >= 10 """ cur.execute (req) for row in cur.fetchall(): print row
File: chapn_tools.tex, line 1634
CREATE DATABASE datatest ;
connexion ODBC, création d'une table
import odbc cx = odbc.odbc("mysqlperso") cur = cx.cursor() cur.execute (""" CREATE TABLE ELEVE ( num integer primary key, nom varchar (30), prenom varchar (30), date date, adresse varchar (100), codepays integer, classe integer) """)
connexion ODBC, ajout de données
import odbc cx = odbc.odbc("mysqlperso") cur = cx.cursor() cur.execute ("""INSERT INTO ELEVE (num, nom, prenom, date, adresse, codepays, classe) VALUES (1, 'dupre', 'xavier', '1975-08-11', '---- paris', 33, 19) ;""") cur.execute ("""INSERT INTO ELEVE (num, nom, prenom, date, adresse, codepays, classe) VALUES (2, 'dupre', 'gilles', '1946-12-24', '---- charleville', 33, 56) ;""") cx.commit ()
File: chapn_tools.tex, line 1709
import odbc cx = odbc.odbc("mysqlperso") cur = cx.cursor() cur.execute ("SELECT * from ELEVE") for row in cur.fetchall () : print row
File: chapn_tools.tex, line 1721
print [ str (r) for r in row ]
File: chapn_tools.tex, line 1737
import odbc cx = odbc.odbc("odbc_sql_server")
File: chapn_tools.tex, line 1744
dbi.operation-error: [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user ''. The user is not associated with a trusted SQL Server connection. in LOGIN
File: chapn_tools.tex, line 1751
import odbc cx = odbc.odbc("odbc_sql_server/login/password")
File: chapn_tools.tex, line 1757
cx = odbc.odbc("DSN=odbc_sql_server;UID=login;PWD=password")
File: chapn_tools.tex, line 1766
cd c:\Program Files\Apache Software Foundation\Apache2.2\bin httpd -k stop httpd
File: chapn_tools.tex, line 1840
import odbc cx = odbc.odbc("mysqlperso") cur = cx.cursor() cur.execute ("SELECT * from ELEVE") for row in cur.fetchall () : print row cur.close ()
File: chapn_tools.tex, line 1855
import MySQLdb cx = MySQLdb.connect('localhost','root', \ 'admin', 'datatest') cur = cx.cursor() cur.execute ("select * from ELEVE" ) for row in cur.fetchall() : print row cur.close() cx.close()
File: chapn_tools.tex, line 1874
import win32com.client connexion = win32com.client.gencache.EnsureDispatch('ADODB.Connection') connexion.Open("Provider='SQLOLEDB';Data Source='localhost';Initial Catalog='datatest';User ID='root';Password='admin';") recordset = connexion.Execute('select * from client')[0] while not recordset.EOF: for i in recordset.Fields : print i, print "<br>\n" recordset.MoveNext() connexion.Close()
extraction du texte d'un fichier \textit{pdf
from pdftools.pdffile import PDFDocument from pdftools.pdftext import Text def contents_to_text (contents): for item in contents: if isinstance (item, type ([])): for i in contents_to_text (item): yield i elif isinstance (item, Text): yield item.text doc = PDFDocument ("declaration.pdf") n_pages = doc.count_pages () text = [] for n_page in range (1, (n_pages+1)): print "Page", n_page page = doc.read_page (n_page) contents = page.read_contents ().contents text.extend (contents_to_text (contents)) print "".join (text) f = open ("ok.txt", "w") f.write ("".join (text)) f.close ()
graphiques avec GNUPlot
# coding: latin-1 import sys import os default_path = r"C:\Program Files\gp423win32\gnuplot\bin\pgnuplot.exe" default_temp_dir = "tempgnuplot" imagenumber = 0 def execute_script_gnuplot (scr) : global default_temp_dir global imagenumber global default_path if not os.path.exists (default_temp_dir) : os.mkdir (default_temp_dir) # avant scr = "set term png\n" + scr image = default_temp_dir + ("/image_%05d.png" % imagenumber) imagenumber += 1 scr = "set out \"" + image + "\"\n" + scr # après scr += "show out\n" scr += "exit\n" name = default_temp_dir + "/gnuscript.txt" f = open (name, "w") f.write (scr) f.close () line = default_path + " " + name os.system (line) return image def build_script_gnuplot (series, seriesname, title = None, \ xlabel = None, ylabel = None, histo = False) : global default_temp_dir global default_path if not os.path.exists (default_temp_dir) : os.mkdir (default_temp_dir) scr = "" if xlabel != None : scr += "set xlabel \"" + xlabel + "\"\n" if ylabel != None : scr += "set ylabel \"" + ylabel + "\"\n" if title != None : scr += "set title \"" + title + "\"\n" scr += "set grid\n" if histo : scr += "set style data histograms\n" else : scr += "set style data lines\n" scr += "plot " id = 0 for s,lab in zip (series, seriesname) : name = default_temp_dir + "/series%d.txt" % (id) id += 1 f = open (name, "w") for l in s : if histo : f.write ("%f\n" % (l [1])) else : f.write ("%f\t%f\n" % (l [0], l [1])) f.close () scr += "\"" + name + "\" title \"" + lab + "\", " scr = scr [:len (scr)-2] scr += "\n" return execute_script_gnuplot (scr) if __name__ == "__main__" : print "chemin pour gnuplot ", default_path series = [ [], [] ] for i in range (0, 100) : x = float (i) / 100 y = x ** 0.5 z = 1.0 - y series [0].append ( (x,y) ) series [1].append ( (x,z) ) image = build_script_gnuplot (series, ["serie 1", "serie 2"], \ xlabel="abscisses", ylabel="ordonnées", histo = False) print "image ", image image = build_script_gnuplot (series, ["serie 1", "serie 2"], \ xlabel="abscisses", ylabel="ordonnées", histo = True) print "image ", image
graphiques avec MatPlotLib
#coding:latin-1 def GraphOHLC (title, dates, ohlc, file, size = (800,400), t1 = 0, t2 = -1) : """dessine une série financière avec matplotlib - title est une titre - dates est une liste de date - ohlc est une liste de dictionnaire avec les clés ("Open", "High", "Low", "Close", "Volume") - file est un nom de fichier, le graphe y sera sauvegardé - size est la taille désirée pour le graphique - t1 est l'indice de la première date du graphique - t2 est l'indice de la dernière date du graphique """ # on coupe la série si besoin if t2 == -1 : t2 = len (dates) dates = dates [t1:t2] ohlc = ohlc [t1:t2] import pylab # on crée les labels pour les abscisses # sans afficher toutes les dates car elles deviennent illisibles sinon # on en affiche que 10 ind = pylab.arange (len (dates)) lab = ["" for i in ind] for i in range (0,len (dates),len(dates)/10) : lab [i] = dates [i] # on crée la figure fig = pylab.figure (figsize=(size [0]/100, size [1]/100)) ax = fig.add_subplot(111) # la première série à tracer est celle des volumes sous forme d'histogramme for i in range (0, len (ohlc)) : oh = ohlc [i] # l'histogramme est vert si c'est un jour de hausse # rouge si c'est un jour de baisse if i == 0 : co = (0.5,0.5,0.5) elif ohlc [i]["Close"] > ohlc [i-1]["Close"] : co = (0.0,1.0,0.0) else : co = (1.0,0.0,0.0) if len (dates) > 300 : pylab.plot ( [i, i], [0, oh ["Volume"]], "k", color = co) elif len (dates) > 100 : pylab.plot ( [i, i], [0, oh ["Volume"]], "k", \ linewidth = 2.0, color = co) else : pylab.plot ( [i, i], [0, oh ["Volume"]], "k", \ linewidth = 4.0, color = co) # on écrit la légende du volume v = [0.0 for i in ind] pylab.plot (ind, v, "c.") pylab.ylabel ("volume") # on construit un second axe au graphique pour la série des prix ymin, ymax = pylab.ylim() pylab.ylim (ymin, ymax*3) pylab.xticks (ind, lab, fontsize = "small", rotation = 13 ) ax2 = pylab.twinx() # puis un dessine les prix sur le graphique selon le même schéma, # la même série de points # (i-0.5, Open) (i,Open) (i,Low) (i,High) (i,Close) (i+0.5,Close) for i in range (0, len (dates)) : oh = ohlc [i] co = (0.0,0.0,1.0) pylab.plot ([i-0.5, i], [oh["Open"], oh["Open"]], "k", \ linewidth = 1.0, color = co) pylab.plot ([i, i], [oh["Low"], oh["High"]], "k", \ linewidth = 1.0, color = co) pylab.plot ([i, i+0.5], [oh["Close"], oh["Close"]], "k", \ linewidth = 1.0, color = co) # on termine par le titres, la légende du second axe et celles des abscisses pylab.title (title) pylab.ylabel ("euros") pylab.xticks (ind, lab, fontsize = "small", rotation = 13) pylab.xlabel ("dates") # il ne reste plus qu'à sauver la figure pylab.savefig (file, orientation='paysage')
File: chapn_tools.tex, line 1957
Listen 81
File: chapn_tools.tex, line 1972
LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /svn/> DAV svn SVNListParentPath on SVNParentPath "c:/svnrepository/" SVNPathAuthz on #AuthzSVNAccessFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/apachesvnauth AuthName "Subversion Repositories" AuthType Basic AuthBasicProvider file AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/apachesvnpasswd" require valid-user </Location>
File: chapn_tools.tex, line 1992
cd C:\Program Files\Apache Software Foundation\Apache2.2\bin htpasswd.exe -c apachesvnpasswd utilisateur
File: chapn_tools.tex, line 2012
ScriptAlias /mywiki "C:/Moin/mywiki/moin.cgi" Alias /moin_static163 "C:/Python25/share/moin/htdocs"
File: chapn_tools.tex, line 2019
<Directory "C:/Python25/share/moin/htdocs"> Order deny,allow Allow from all </Directory> <Directory "C:/Moin/mywiki"> Options FollowSymLinks AllowOverride None Order deny,allow Allow from all </Directory>
File: chapn_tools.tex, line 2033
#!c:/python25/python.exe
File: chapn_tools.tex, line 2037
#!/usr/bin/python
File: chapn_tools.tex, line 2042
ScriptInterpreterSource registry <Directory "C:/Python25"> # il faut également une section AllowOverride None # comme celle-ci définie Options ExecCGI # pour le répertoire contenant Order allow,deny # le script CGI Allow from all # </Directory> AddType application/x-httpd-py .py AddHandler cgi-script .py Action application/x-httpd-py "C:/python25/python.exe"
File: chapn_tools.tex, line 2069
netstat -ao
File: chapn_tools.tex, line 2075
httpd -k uninstall -n ApacheSecond # on désinstalle le service s'il existait httpd -f "new_conf.conf" -n ApacheSecond -k install # on installe à nouveau le service httpd -n ApacheSecond -k start # on démarre Apache
File: chapn_tools.tex, line 2089
(OS 10048)Only one usage of each socket address (protocol/network address/port) is normally permitted. : make_sock: could not bind to address 0.0.0.0:8084 no listening sockets available, shutting down Unable to open logs
File: chapn_tools.tex, line 2106
<Directory "C:/Python25"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "C:/_home/query-intent/projects/common_tools/cgi/"> AllowOverride None Options FollowSymLinks ExecCGI Order allow,deny Allow from all </Directory>
File: chapn_tools.tex, line 2123
<IfModule mime_module> TypesConfig conf/mime.types AddType application/x-httpd-py .py AddHandler cgi-script .py </IfModule> Action application/x-httpd-py "C:/python25/python.exe"
File: chapn_tools.tex, line 2134
ScriptAlias /py/ "C:/script_cgi_python/"
File: chapn_tools.tex, line 2140
header = """Content-type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>""" footer = """</body></html>""" print header print "<b>Script CGI</b><br>\n" print footer
File: chapn_tools.tex, line 2160
http://localhost:80/py/script.py
calcul d'une intégrale
# coding: cp1252 import math n = 2000 a = -2.0 b = 3.0 h = (b-a)/n sum = 0 for i in xrange (1,n): x = a + h * i sum += h * x * math.cos (x) print "intégrale : ", sum import scipy.integrate as integral # on importe le module d'intégration def fff(x): return x * math.cos (x) # on définit la fonction à intégrer sum = integral.quad (fff, a,b, args=()) [0] # on appelle la fonction d'intégration print "intégrale avec scipy : ", sum # on affiche le résultat
File: integrale.tex, line 47
import scipy.integrate as integral # on importe le module d'intégration def fff(x): return x * math.cos (x) # on définit la fonction à intégrer sum = integral.quad (fff, a,b, args=()) [0] # on appelle la fonction d'intégration print "intégrale avec scipy : ", sum # on affiche le résultat
File: integrale.tex, line 56
intégrale : -1.96640795695 intégrale avec scipy : -1.96908048953
File: tri.tex, line 13
x = [1,3,2,5,8,4,9,0,7,6] x.sort () print x
tri par sélection
# coding: cp1252 import random def construit_suite(n): """construit une liste de n nombres entiers compris entre 0 et 99""" l = [] for i in range(0,n): l.append (random.randint(0,100)) return l def tri_selection(l): """ tri une liste l, tri par sélection""" # première boucle, répétition des étapes A et B for i in range(0,len(l)): # recherche du maximum, on suppose pour commencer # qu'il est à la position 0 pos = 0 # boucle de l'étape A for j in range(1,len(l)-i): if l [pos] < l [j]: pos = j # échange de l'étape B # la position du maximum est conservé dans la variable pos # on fait l'échange avec l'élément à la position len(l)-i-1 k = len(l)-i-1 ech = l [k] l [k] = l [pos] l [pos] = ech l = construit_suite(8) # création d'une suite aléatoirement print "liste non triée :\t",l # affichage tri_selection (l) # tri print "liste triée :\t",l # affichage
tri fusion
# coding: cp1252 import random def construit_suite(n): """construit une liste de n nombres entiers compris entre 0 et 99""" l = [] for i in range(0,n): l.append (random.randint(0,100)) return l def fusion_liste (l1,l2): """fusionne deux listes l1 et l2 triées par ordre croissant de sorte que la liste résultante soit également triée""" i,j,k = 0,0,0 fin = len (l1) + len (l2) l = [] while k < fin : if j >= len (l2) or (i < len (l1) and l1 [i] < l2 [j]) : l.append (l1 [i]) k += 1 i += 1 else : l.append (l2 [j]) k += 1 j += 1 return l def tri_fusion(l): """ tri une liste l par fusion""" if len (l) <= 1 : return None # on élimine le cas simple n = 1 while n < len (l) : for i in xrange (0, len (l), 2*n): a = i m = min (len (l), a + n) b = min (len (l), a + 2 * n) if m < b: t = fusion_liste (l [a:m], l [m:b]) l [a:b] = t n *= 2 l = construit_suite(13) # création d'une suite aléatoirement print l [0:3] print "liste non triée :\t",l # affichage tri_fusion (l) # tri print "liste triée :\t",l # affichage
tri par insertion
# coding: cp1252 import random def construit_suite(n): """construit une liste de n nombres entiers compris entre 0 et 99""" l = [] for i in range(0,n): l.append (random.randint(0,100)) return l def recherche_dichotomique (l,x): """cherche l'élément x dans la liste l, la liste l est supposée être triée par ordre croissant""" a = 0 b = len(l)-1 while a <= b : m = (a+b) // 2 r = cmp (x, l[m]) if r == 0 : return m elif r == -1 : b = m-1 else : a = m + 1 return a def tri_insertion(l): """ tri une liste l par insertion dichotomique, on suppose que l est non vide""" lt = [] for x in l : if len (lt) == 0 : lt.append (x) continue m = recherche_dichotomique (lt, x) lt.insert (m, x) l [0:len (l)] = lt l = construit_suite(13) # création d'une suite aléatoirement print l [0:3] print "liste non triée :\t",l # affichage tri_insertion (l) # tri print "liste triée :\t",l # affichage
tri d'entiers
# coding: cp1252 import random def construit_suite(n): """construit une liste de n nombres entiers compris entre 0 et 99""" l = [] for i in range(0,n): l.append (random.randint(0,10)) return l def tri_entiers(l): """ tri une liste l, les éléments à trier sont entiers""" # première boucle, minimum, maximum m = l [0] M = l [0] for k in range(1,len(l)): if l [k] < m : m = l [k] if l [k] > M : M = l [k] # calcul du nombre d'occurrences p = [0 for i in range (m,M+1) ] for i in range (0, len (l)) : p [ l [i] - m ] += 1 # fonction de répartition P = [0 for i in range (m,M+1) ] P [0] = p [0] for k in range (1, len (p)) : P [k] = P [k-1] + p [k] # tri pos = 0 for i in range (1, len (l)) : while P [pos] < i : pos += 1 l [i-1] = pos + m l [len (l)-1] = M l = construit_suite(8) # création d'une suite aléatoirement print "liste non triée :\t",l # affichage tri_entiers (l) # tri print "liste triée :\t",l # affichage