Académique Documents
Professionnel Documents
Culture Documents
Variables:notiondetypeetdevaleurdunevariable,typessimples.
Dmonstration:
>>>a=3
>>>print(a)
3
>>>print(type(a))
<type'int'>
>>>
>>>a=3.14
>>>print(a)
3.14
>>>print(type(a))
<type'float'>
>>>
>>>b=a
>>>print(b)
3.14
>>>a=4
>>>print(b)
3.14
>>>s='abc'
>>>print(s)
abc
>>>print(type(s))
<type'str'>
>>>
>>>s="abc"
>>>print(s)
abc
>>>print(type(s))
<type'str'>
>>>
1
>>>print(s[0])
a
>>>print(s[1])
b
>>>print(len(s))
3
>>>
>>>l=['a','b','c']
>>>print(l)
['a','b','c']
>>>print(type(l))
<type'list'>
>>>
>>>print(l[0])
a
>>>print(l[1])
b
>>>print(len(l))
3
Questions:
x=3
x=4
quevautx?
4
a=4
b=a
a=5
quevautb?
4
b=2
a=b
b=b+1
a=a
b=a
quevautb?
2
Exercice:inverserlecontenudedeuxvariables
2
>>>a
4
>>>b
3.14
>>>tmp=a
>>>a=b
>>>b=tmp
>>>a
3.14
>>>b
4
Expressionsetinstructionssimples:affectation,oprateursusuels,distinctionentre
expressionetinstruction.
Uneexpressionsvalueetaunevaleur
Unevaleurauntype
>>>a=2
>>>a=2
>>>b=a+3
>>>b
5
>>>"bon"+"jour"
'bonjour'
>>>b+max([4,2,8,5,7])
13
Uneinstructionnapasdevaleur
Cestunecommandequiestexcute
>>>a=2#estuneinstruction
>>>b=(a=2)#onnepeutpasmettresonrsultatdansune
variable
File"<stdin>",line1
b=(a=2)#onnepeutpasmettresonrsultatdansune
variable
^
SyntaxError:invalidsyntax
3
>>>print(a)#estuneinstruction
2
>>>type(print(a))#print(a)n'apasdevaleurnidetype
File"<stdin>",line1
type(print(a))#print(a)n'apasdevaleurnidetype
^
SyntaxError:invalidsyntax
Exercice:diffrencierlesexpressionsdesinstructions
a=2,a==2,l=[1,2,3],l=l+l,ifa>0:,a=b=3,ab>=0,x/2ifx%2==0else3*x+1
Instructionsconditionnelles:expressionsboolennesetoprateurslogiquessimples,
instructionif.Variantesavecalternative(else).
Exercice:crirelestermesdelasuitedeSyracuse.
Partantdunentierpositif,onledivisepar2silestpairetonlemultipliepar3etonajoute1
sinon.
Instructionsitratives:bouclesfor,bouclesconditionnelleswhile.
Fonctions:notiondefonction(ausensinformatique),dfinitiondanslelangageutilis,
paramtres(ouarguments)etrsultats,portedesvariables.
deff(x):returnx+1
f(3),f(f(3))
defg(x):x=x
Manipulationdequelquesstructuresdedonnes:chanesdecaractres(cration,accs
uncaractre,concatnation),listes(cration,ajoutdunlment,suppressiondunlment,
accsunlment,extractiondunepartiedeliste),tableauxuneouplusieursdimensions.
Fichiers:notiondechemindaccs,lectureetcriturededonnesnumriquesoudetype
chanedecaractresdepuisouversunfichier.
Algorithmique1
Exercice:recherchedansuneliste
Ecrireunefonctionindicequiprendunlmentetunelisteenparamtreetquiretournele
premierindicedellmentsiceluiciapparatdanslaliste.
#*coding:utf8*
defindice(x,liste):
"""Retournelapremierepositiondexdanslaliste.
Args:
x:l'elementcherch
liste:lalistedanslequelxestcherch
Returns:
l'indicedelapremiereoccurrencedexsurliste
Raises:
ValueErrorsil'lmentn'estpasprsent
>>>indice(5,[2,1,0,3,3,5,1])
5
>>>indice(0,[2,1,0,3,3,5,1])
2
>>>indice(2,[2,1,0,3,3,5,1])
0
>>>indice(3,[2,1,0,3,3,5,1])
3
>>>indice(9,[2,1,0,3,3,5,1])
Traceback(mostrecentcalllast):
...
ValueError:nontrouve
"""
index=0
foreinliste:
ifx==e:
returnindex
index=index+1
raiseValueError("nontrouve")
5
if__name__=="__main__":
importdoctest
doctest.testmod()
Exercice:recherchedumaximumdansunelistedenombres
#*coding:utf8*
defrecherche_max(liste):
"""Retournel'lmentmaximumd'unelisted'entiers.
Args:
liste:lalisted'entiers
Returns:
l'lmentmaximal
>>>recherche_max([2,1,0,3,3,5,1])
5
>>>recherche_max([3,4,7,12,100,52])
100
>>>recherche_max([3,7,12,53])
3
>>>recherche_max([])
Traceback(mostrecentcalllast):
...
ValueError:listevide
"""
iflen(liste)>0:
max=liste[0]
foreinliste:
ife>max:
max=e
returnmax
6
else:
raiseValueError("listevide")
if__name__=="__main__":
importdoctest
doctest.testmod()
Exercice:calculdelamoyenneetdelavariance.
#*coding:utf8*
defmoyenne(liste):
"""Retournelamoyennedeslmentsd'uneliste.
Args:
liste:lalisted'lments
Returns:
lamoyenne
>>>moyenne([1,2,3,4,5,6])
3.5
>>>moyenne([3,2,1,1,2,3])
0.0
>>>moyenne([3,2,1,1.0,2,3])
0.0
>>>moyenne([])
Traceback(mostrecentcalllast):
...
ValueError:listevide
"""
iflen(liste)>0:
returnsum(liste)/float(len(liste))
else:
raiseValueError("listevide")
7
defvariance(liste):
"""Retournelavariancedeslmentsd'uneliste.
Args:
liste:lalisted'lments
Returns:
lavariance
>>>variance([1,2,3,4,5,6])==sum((3.5i)**2foriin
range(1,6+1))/6
True
>>>variance([])
Traceback(mostrecentcalllast):
...
ValueError:listevide
"""
iflen(liste)>0:
moy=moyenne(liste)
somme=0.0
forxinliste:
somme=somme+(xmoy)**2
returnsomme/len(liste)
else:
raiseValueError("listevide")
if__name__=="__main__":
importdoctest
doctest.testmod()
Exercice:recherchepardichotomiedansuntableautri.
#*coding:utf8*
defest_dans(x,liste):
8
"""Retournevraisixestdanslaliste.
Args:
x:l'elementcherch
liste:lalistetriedanslequelxestcherch
Returns:
vraisixestdansliste
fauxsinon
>>>est_dans(0,[0,1,1,2,3,3,5])
True
>>>est_dans(1,[0,1,1,2,3,3,5])
True
>>>est_dans(2,[0,1,1,2,3,3,5])
True
>>>est_dans(3,[0,1,1,2,3,3,5])
True
>>>est_dans(4,[0,1,1,2,3,3,5])
False
>>>est_dans(5,[0,1,1,2,3,3,5])
True
>>>est_dans(5,[])
False
"""
bi=0
bs=len(liste)1
whilebi<=bs:
pivot=(bi+bs)/2
#print("bi=%s,bs=%s,pivot=%s")%(bi,bs,pivot)
ifliste[pivot]==x:
returnTrue
elifx<liste[pivot]:
bs=pivot1
9
else:
bi=pivot+1
returnFalse
if__name__=="__main__":
importdoctest
doctest.testmod()
Exercice:recherchepardichotomieduzrodunefonctioncontinueetmonotone.
#*coding:utf8*
defcherche_zero(f,bi,bs,epsilon):
"""Retournextelque|f(x)|<epsilon.
Args:
f:lafonctioncontinuemonotone
epsilon:lamarged'erreur
Returns:
xtelque|f(x)|<epsilon
>>>cherche_zero(lambdax:x,1.0,1.0,0.1)
0.0
>>>0.1<cherche_zero(lambdax:x2,5.0,5.0,0.1)2.0<
0.1
True
>>>cherche_zero(lambdax:x,2.0,3.0,0.1)
Traceback(mostrecentcalllast):
...
ValueError:pasdesolution
"""
whilebsbi>epsilon:
pivot=(bi+bs)/2.0
ifabs(f(pivot))<epsilon:
10
returnpivot
eliff(bi)*f(pivot)>=0:
bi=pivot
else:
bs=pivot
raiseValueError("pasdesolution")
if__name__=="__main__":
importdoctest
doctest.testmod()
Exercice:mthodesdesrectanglesetdestrapzespourlecalculapprochduneintgralesur
unsegment.
Exercice:recherchedunmotdansunechanedecaractres.
Onutiliserapourcelaunalgorithmenaf.Maisonpeutimaginerltudedesalgorithmesde
KnuthMorrisPratt,ouRabinKarpparexemple.
#*coding:utf8*
defest_prefix(mot,chaine):
"""Retournevraisimotestprefixdechaine.
Args:
mot:lemotcherch
chaine:lachainelaquellemotestcherch(entte)
Returns:
vraisimotestprefixdechaine
fauxsinon
>>>est_prefix('a','abc')
True
>>>est_prefix('b','abc')
False
11
>>>est_prefix('ab','abc')
True
>>>est_prefix('abc','abc')
True
>>>est_prefix('bc','abc')
False
>>>est_prefix('','')
True
>>>est_prefix('','abc')
True
>>>est_prefix('a','')
False
"""
iflen(mot)>len(chaine):
returnFalse
foriinxrange(len(mot)):
ifmot[i]!=chaine[i]:
returnFalse
returnTrue
defest_sous_chaine(mot,chaine):
"""Retournevraisimotapparaitdanschaine.
Args:
mot:lemotcherch
chaine:lachainedanslaquellemotestcherch
Returns:
vraisimotestdanschaine
fauxsinon
>>>est_sous_chaine('a','abc')
True
12
>>>est_sous_chaine('b','abc')
True
>>>est_sous_chaine('bb','abbc')
True
>>>est_sous_chaine('bc','abc')
True
>>>est_sous_chaine('','')
True
>>>est_sous_chaine('abc','')
False
"""
#onveutallerde0len(chaine)len(mot)inclus
foriinxrange(0,len(chaine)len(mot)+1):
ifest_prefix(mot,chaine[i:]):
returnTrue
returnFalse
if__name__=="__main__":
importdoctest
doctest.testmod()
Exercice:tantdonnuntableaudentiers,retourneruntableaucommenantaveclesentiers
pairsetseterminantaveclesentiersimpairs
#*coding:utf8*
defpair_a_gauche(t):
"""Retourneuntableauoleslmentspairssontgauche.
Args:
t:letableauclasser
Returns:
untableauoleslmentspairssontgauche
>>>pair_a_gauche([1,2,3,4,5])
13
[2,4,5,3,1]
>>>pair_a_gauche([2,3,4,5,6,7])
[2,4,6,7,5,3]
>>>pair_a_gauche([])
[]
"""
res=list(t)
x=0
y=len(t)1
foraint:
ifa%2==0:
res[x]=a
x=x+1
else:
res[y]=a
y=y1
returnres
if__name__=="__main__":
importdoctest
doctest.testmod()
Exercice:mmeexerciceenutilisantdescomprhensionsdeliste
#*coding:utf8*
defpair_a_gauche_comprehension(t):
"""Retourneuntableauoleslmentspairssontgauche.
Args:
t:letableauclasser
Returns:
untableauoleslmentspairssontgauche
>>>pair_a_gauche_comprehension([1,2,3,4,5])
[2,4,1,3,5]
14
>>>pair_a_gauche_comprehension([2,3,4,5,6,7])
[2,4,6,3,5,7]
>>>pair_a_gauche_comprehension([])
[]
"""
return[xforxintifx%2==0]+[xforxintifx%2==
1]
if__name__=="__main__":
importdoctest
doctest.testmod()
15
Algorithmique2
Piles
Exercice:Ecrireunefonctionquipermetdesavoirsiuneexpressiondeparenthseest
correcte.Exemple(()),()(),()(()),Contreexemple)()(,((),())),
Rcursivit
Exercice:Comptezlenombredemots(sur(et))delongueurnbienparenthss.
Exercice:Etantdonneunechanedecaractrescommedebarbouiller,calculezlalongueur
delapluslonguesoussuitecroissantecontenuedanscemot.Parexempleabillaune
longueur5.Lordredeslettresesta<b<c<.
Exercice:
Lejoueurcommenceunepositiona.Ilveutatteindrelapositionb>a.Sonpremierpasfaitune
unit,cequelonnoteP(1)=1.LepasP(n+1)vrifie|P(n+1)P(n)|1.Leslongueursdepas
sontdesentiers.Unexemple:
10123456
faitpasserdelaposition2laposition6entroistapes.Peutontoujoursatteindreuneposition
bpartirdunepositiona?Calculezlenombredepaslepluscourtpourpasserdeab.
Exercice:rsoudredescryptarithmes(SEND+MORE=MONEY)
Tris
Exercice:Tribulles.Onpartdesdeuxpremierslments,silssontinvers,onlespermute.
Onpasseaudeuxlmentssuivant.Silsontinverss,onlespermute,etcjusqulafindela
liste.Onrecommenceleprocessusn1foisonestlalongueurdelaliste
deftribulle(t):
"""
Trid'uneliste
16
Args:
t:listetrier
Returns:
t,trie
>>>tribulle([1,4,2,8,3])
[1,2,3,4,8]
>>>tribulle([5,3,4,4])
[3,4,4,5]
>>>tribulle([9,8,7,6,5,4,3,2,1])
[1,2,3,4,5,6,7,8,9]
"""
foriinrange(len(t)1):
forjinrange(len(t)i1):
ift[j]>t[j+1]:
(t[j],t[j+1])=(t[j+1],t[j])
returnt
Exercice:Triparinsertion.Ontrouvelepluspetitlmentdelaliste,etonlepermuteavecle
premierlmentdelaliste,oncontinueavecledeuximepluspetitmislaplacedudeuxime,
etcjusqulafindelaliste.
deftriinsertion(t):
"""
Trid'uneliste
Args:
t:listetrier
Returns
t(trie)
>>>tribulle([1,4,2,8,3])
[1,2,3,4,8]
>>>tribulle([5,3,4,4])
[3,4,4,5]
>>>tribulle([9,8,7,6,5,4,3,2,1])
[1,2,3,4,5,6,7,8,9]
"""
foriinrange(len(t)1):
(minimum,min_index)=(sys.maxint,0)
forjinrange(i,len(t)):
ifminimum>t[j]:
(minimum,min_index)=(t[j],j)
17
(t[min_index],t[i])=(t[i],t[min_index])
returnt
Exercice:TrouverllmentmdiandunelisteLdonneenargument.Onrappellequilsagitde
llmentxtelquelamoitideslmentsdeTestpluspetitquex,lautretantplusgrande.
defmedian(t):
"""
Calculel'lmentmdian
d'uneliste
Args:
t:laliste
Returns:
l'lmentmdian
Raises:
IndexErrorsitestvide
>>>median([1,5,3,3,5,
9])
5
>>>median([1,4,3,5,5])
4
"""
t.sort()
returnt[len(t)/2]
18
Programmation2
Classesetobjets
TDcomptebancaire
Interfacesgraphiques
Basesdedonnes
Exercice:comptebancaire
L'objectifdeceTDestdes'exercerlaspcificationetlaprogrammationdeclasses
lmentaires.Enparticulier,ils'agitpartird'unnoncd'identifieretdedfinirles
caractristiquesd'uneclassemodlisantunconceptdonn.[TDinspirdunexercicepropos
parPhilippeGenoud,UniversitdeGrenoble]
"Cahierdescharges"
Ils'agitdedfiniruneclassePythonCompteSimplepermettantdemodliserdescomptes
bancaires.
Lasommed'argentdisponiblesuruncompte,appelesolde,estexprimeenEuros.Le
soldeestunnombredcimalpositif,nuloungatif.Onditquelecompteestdcouvertlorsque
sonsoldeestngatif.
Enaucuncasledcouvertd'uncomptenepeuttresuprieurunevaleurfixe,appele
decouvert_autorise.Parexemplepouruncomptedontledcouvertmaximalautorisest
2000,lesoldenepourrajamaistreinfrieur2000.Ledcouvertmaximalautorispeut
varierd'uncompteunautre,ilestfixarbitrairementparlabanquelacrationducompteet
peuttreensuitervisselonlesmodificationsdesrevenusdutitulaireducompte.
Crditeruncompteconsisteajouterunmontantpositifausoldeducompte.
Dbiteruncompteconsisteretirerunmontantpositifausoldeducompte.Lesoldersultant
nedoitenaucuncastreinfrieuraudcouvertmaximalautorispourcecompte.
Lorsd'uneoprationderetrait,uncomptenepeuttredbitd'unmontantsuprieurune
valeurdsignesousletermededebit_maximalautoris.Commeledcouvertmaximal
autoris,ledbitmaximalautorispeutvarierd'uncompteunautreetestfixarbitrairement
parlabanquelacrationducompte.Ilpeuttreensuitervisselonlesmodificationsdes
revenusdutitulaireducompte.
Effectuerunvirementconsistedbiteruncompteauprofitd'unautrecomptequisera
crditdumontantdudbit.
Lorsdelacrationd'uncompte,enl'absencededptinitiallesoldeestfix0.Lesvaleurs
pardfautpourledcouvertmaximalautorisetledbitmaximalautorissontrespectivement
de0et500.
19
Travaildemand:
Apartirdu"cahierdescharges"prcdentlaborerunespcificationdelaclassePython
modlisantuncomptebancaire.
quellessontlesmthodesproposesparlaclasse?
quellessontlesvariablesdinstancesncessaires?
quelleestlasignatureduconstructeurdeclasse?
Raliseruneimplantationenprenantsoindedocumenterlecomportementduconstructeuret
desdiffrentesmthodes.
Scnariodetest:
creruncomptec1ayant1000commedpotinitial
afficherlesoldedececompte.Lersultatdoittredelaforme
1000
dbiter50dececompteetafficherlesoldecourant
creruncomptec2
transfrer200ducomptec1verslecomptec2.Afficherlesoldedesdeuxcomptes
transfrer2000ducomptec1verslecomptec2.Afficherlesoldedesdeuxcomptes
"Cahierdescharges"(suite)
Uncomptebancaireestassociunclienttitulaireducompte,ceclientestdcritparson
nomainsiqueparlalistedescomptesquilpossde.Touteslesinformationsrelativesun
clientdoiventpouvoirtreaffiches(nomduclient,listedesescomptesetsoldesrespectifs)
Travaildemand
raliseruneimplantationenlangagePythondelaclasseClient(constructeurprenanten
paramtrelenomduclientainsiquelalistedescomptesassocis)
laclasseclientdevrapermettredafficherlasituationfinanciredunclient.Parexemple:
Client:A
Compte1:0
Compte2:300
crer2clients(AetB).Lepremierpossde2comptes(lecomptec1cr
prcdemmentetunnouveaucompteinitialis50)etlesecondunseulcompte(le
comptec2crprcdemment).
affichezlasituationfinanciredecesclients.Laffichagedoittredelaforme
***situationinitiale
Client:A
Compte1:750
Compte2:50
Client:B
20
Compte1:200
ModifierlaclasseClientdesortequechaqueclientaitunnumrodeclientunique.
Modifierlamthodequiaffichelasituationfinancireduneclientdesortequelenumro
apparaisse.
#*coding:utf8*
classCompteSimple:
def__init__(self,depot_initial=0.0,decouvert=0.0,debit
=500.0):
self.solde=depot_initial
self.decouvert_autorise=decouvert
self.debit_maximal=debit
def__str__(self):
"""
Returns:
unechainereprsentantlesoldeducompte
>>>c1=CompteSimple(200)print(c1)
200
"""
returnstr(self.solde)+""
defcredit(self,montant):
"""
Args:
montant:lemontantpositifcrditer
>>>c1=CompteSimple(200)c1.credit(100)print(c1)
300
>>>c1=CompteSimple(200)c1.credit(100)print(c1)
Traceback(mostrecentcalllast):
...
ValueError:montantnegatif
"""
ifmontant<0:
raiseValueError("montantnegatif")
self.solde+=montant
21
defdebit(self,montant):
"""
Args:
montant:lemontantpositifdbiter
>>>c1=CompteSimple(200)c1.debit(100)print(c1)
100
>>>c1=CompteSimple(200,100)c1.debit(400)print(c1)
Traceback(mostrecentcalllast):
...
ValueError:decouvert
>>>c1=CompteSimple(200)c1.debit(100)print(c1)
Traceback(mostrecentcalllast):
...
ValueError:montantnegatif
"""
ifmontant<0:
raiseValueError("montantnegatif")
nouveau_solde=self.soldemontant
ifnouveau_solde<0andnouveau_solde>
self.decouvert_autorise:
raiseValueError("decouvert")
self.solde=nouveau_solde
defvirement(self,destinataire,montant):
self.debit(montant)
destinataire.credit(montant)
classClient():
numero=1
def__init__(self,nom,comptes=[]):
self.nom=nom
self.comptes=comptes
self.numero=Client.numero
Client.numero+=1
22
def__str__(self):
res="Client:"+self.nom
for(i,c)inenumerate(self.comptes):
res+="\nCompte%s(%s):%s"%(i+1,self.numero,c)
returnres
if__name__=="__main__":
importdoctest
doctest.testmod()
c1=CompteSimple(depot_initial=1000)
print("c1:%s"%c1)
c1.debit(50)
print("c1:%s"%c1)
c2=CompteSimple()
print("c2:%s"%c2)
c1.virement(c2,200)
print("c1:%s"%c1)
print("c2:%s"%c2)
try:
c1.virement(c2,2000)
exceptValueError:
print("oprationnoneffectue")
print("c1:%s"%c1)
print("c2:%s"%c2)
a=Client("A",[c1,CompteSimple()])
b=Client("B",[c2])
print(a)
print(b)
Scrabblenaif:
#*coding:utf8*
#motsdudictionnaire
23
mots=set()
deflecture_fichier(nom):
f=open(nom,'r')
forligneinf:
#enleverlecaracteredefindeligne
mot=ligne[:len(ligne)1]
iflen(mot)<=8:
mots.add(mot)
f.close()
defsousensemble(mot,tirage):
#retournevraisimotestunsousensembledutirage
liste=list(tirage)
forcinmot:
ifcinliste:
liste.remove(c)
else:
returnFalse
returnTrue
defmot_plus_long(l):
res=''
forminl:
if(len(m)>len(res)):
res=m
returnres
lecture_fichier('frenchssaccent.dic')
print('nombremots:%s'%len(mots))
lettres='tunie'
print('tirage=%s'%lettres)
solution=[mforminmotsifsousensemble(m,lettres)]
print('solution=%s'%solution)
print('meilleuresolution=%s'%mot_plus_long(solution))
24