Il fallait vraiment tester les instructions proposées une à une dans l'interpréteur, et ne surtout pas écrire un programme dans un IDE.
Le notebook jupyter
permet à la fois d'utiliser l'interpréteur, d'exécuter des programmes, et de rentrer du texte formaté en markdown. Il est donc idéal pour présenter des comptes rendus de TP.
On commence par une révision rapide de la syntaxe de base.
# ceci est un commentaire
print (2+2) # on affiche avec "print"
print("dro"+'madaire') # les chaînes peuvent être avec des " ou des ' et on peut les concaténer
"toto" # pas besoin de print ...
'toto'
print ("a"+2*"na"+"s") # on peut aussi multiplier les chaînes
print ("mignonne allons voir si la rose\netc.") # on peut mettre des \quelquechose
print ("ceci\test une tabulation, mais pas cela\\t.") # le caractére d'échappement est \
alphabet="abcdefghijklmnopqrstuvwxyz" # on définit une variable
print (alphabet) # ça affiche l'alphabet, pas de surprise
len(alphabet)
help(len)
alphabet.upper() # les chaînes ont des méthodes commodes
print(dir(alphabet)) # on en obtient la liste ainsi
help(dir)
print ((2**8)%100) # 2 puissance 8, le tout modulo 100 (ça fait 56)
print (1,end= ' ') # noter le end = '' qui permet de ne pas aller à la ligne
print (1,end=' '); print (2) # ... cette ligne affichera donc « 1 2 »
Les premiers exemples du TD rappellent l'existence de + et * pour les chaînes.
msg = 'coin coin'
s = '* '+msg+' *'
t = '*'*len(s)+'\n'
print (t+s+'\n'+t)
dir("")
permet de découvrir la méthode "center" ...
print ('*'*79+'\n*' + msg.center(77)+'*\n'+'*'*79)
... et aussi la méthode strip
:
message="*"*13+"\n* coin coin *\n"+"*"*13
print (message)
print (message.strip('* \n'))
daltons=["joe","jack","william","averell"]
print (daltons[0]) # les listes, ça commence à zéro
print (daltons[1:3]) # sous-liste de l'élément 1 inclus jusqu'au 3 exclus
print (daltons[-1]) # -N = Nième élément en partant de la fin
print (daltons[2:]) # sous-liste de l'élément 2 jusqu'à la fin
daltons.sort() # tri alphabétique en place
print (daltons) # affiche la liste triée
petit=daltons[0] # c'est "averell" vu qu'on a trié dans l'ordre alphabétique
print (petit[0]) # surprise : une chaîne, c'est une liste de caractères...
print (daltons[-2][3:]) # on peut faire ça ( remarque importante pour la suite !)
# Rien ... Pas d'erreur ? Pourtant,
daltons[-2]
# rien à la position 3
daltons[-2][3]
# Mais ...
daltons[-2][3:]
# Après une position inexistante, la chaîne vide ...
# Pour s'en rendre compte, il ne faut pas utiliser print
On s'autorise une instruction pour déterminer la longueur m de la plus courte ...
s1="abcdef"
s2="0123456789"
m=min(len(s1),len(s2))
# ... puis on combine "list comprehension" et tableaux (m:, :m etc)
print (''.join([s1[i]+s2[i] for i in range(m)])+s1[m:]+s2[m:])
# Autre version
print (''.join([x+y for x,y in zip(s1,s2)])+s1[m:]+s2[m:])
help(zip)
Ensuite, on peut récuperer les caractères d'indices pairs ou impairs :
s='a0b1c2d3e4f56789'
print (s[::2])
print (s[1::2])
# Une liste de dictionnaires
daltons=[{"nom":"joe","taille":140,"caractere":"teigneux"},
{"nom":"jack","taille":155,"caractere":"idiot"},
{"nom":"william","taille":170,"caractere":"stupide"},
{"nom":"averell","taille":185,"caractere":"abruti"}]
help(daltons.sort)
# la liste est triée en place
daltons.sort(key=lambda x:x['taille'])
daltons
daltons.sort(key=lambda x:x['nom'])
daltons
On commence par écrire une fonction qui cherche un mot dans le dictionnaire.
Le dictionnaire est codé en latin1
, il faut donc le passer en paramètre à la fonction open
.
On peut itérer sur un fichier ouvert, il est vu comme une liste de lignes (qui se terminent donc
par \n
.
Plutôt que de supprimer le \n
sur chaque ligne, il vaut mieux le rajouter au mot cherché.
def dico(w):
with open('liste.de.mots.francais.frgut.txt',encoding='latin1') as f: # "context manager", équivalent de open-close
if w+'\n' in f: print ("%s est dans le dictionnaire" % w)
else: print ("%s n'est pas dans le dictionnaire" % w)
dico('zythum')
dico('déjà')
dico('gabuzomeu')
Une fois au point, on l'incorpore dans un script (minimaliste).
#! /usr/bin/env python
import sys
def dico(w):
with open('liste.de.mots.francais.frgut.txt',encoding='latin1') as f:
if w+'\n' in f: print ("%s est dans le dictionnaire" % w)
else: print ("%s n'est pas dans le dictionnaire" % w)
if __name__ == '__main__': # cette clause permet d'utiliser le script comme module, les instructions
if len(sys.argv) < 2: # qui suivent ne seront exécutées que si le script est le programme principal
print ("dic prend au moins un argument")
sys.exit(1)
else:
for w in sys.argv[1:]: dico(w)
Résultat :
[jyt@scriabine M1]$ ./dico.py luke je suis ton père luke n'est pas dans le dictionnaire je est dans le dictionnaire suis est dans le dictionnaire ton est dans le dictionnaire père est dans le dictionnaire