Formation Python
Formation Python
Programmation impérative
Thonny
Options
Editeur
Sélectionner l'interpréteur
rien.py structure
Terminal
abc
from turtle import * # Importation du module 'turtle'
def abc():
pass
>>>
Console
Structures de données
Types de base Les différents types : int, float, str, bool.
Le typage des données est dynamique : Il n'est pas déclaré mais défini ( ou redéfini ) par l'intéprèteur.
La fonction type() renvoie le type d'un objet.
longueur len(I)
max, min max(I) min(I)
somme sum(I) si les éléments s'y prêtent.
test d'appartenance élément in I
Structures de contrôle
Une condition est une expression booléenne.
Nb : Une structure vide, None et le nombre 0 ont comme valeur booléenne False : bool('') = bool(None) = False
les autres expressions sont interprétées comme True : bool('salut') = bool(3)=bool([False]) = True
Debut=2
for Exclu = 4 Debut=2 Exclu = 10
for Nb in range(Exclu): Exclu = 4 Pas = 3
print(Nb) => 0 1 2 3 for Nb in range( Debut, Exclu ): for Nb in range( Debut, Exclu, Pas ):
print(Nb) => 2 3 print(Nb) => 2 5 8
Imbrications de boucles
[ <Expression> for <Element_a> in <iterable_a> (optional if <Condition_a>) boucle principale
for <Element_b> in <Iterable_b> (optional if <Condition_b>)
... and so on ...]
multiplications = [i*n for i in range(1,4) for n in range(3)] #=> multiplications = [0,1,2,0,2,4,0,3,6]
matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ]
flatten = [n for row in matrix for n in row] # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
transpose = [[row[n] for row in matrix] for n in range(4)] # => [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Nom de la fonction ( verbe à l'infinitif )
Les fonctions Paramètres
Arguments par défaut
Définition et appel
def Ajouter(a=1, b=2): Définition d'une fonction
Somme=a+b
return Somme Valeur de retour
Appels de la fonction
print( Ajouter(4,5) ) # => 9
print( Ajouter(4) ) # => 6
print( Ajouter(b=8) ) # => 9
Passages des arguments
*args
def traitement(a_remplacer, remplacant, *args):
# empaquetage dans un tuple for idx, fichier in enumerate(args):
def MaFonction(*args): content = ""
print(args) # => (1,2) with open(fichier, 'r') as fichier_only:
#=================== for line in fichier_only.readlines():
MaFonction(1,2) line = line.replace(a_remplacer, remplacant)
content += line
def MaFonction(a,b): with open(fichier, 'w') as fichier_only:
print(a,b) # => 1 2 fichier_only.write(content)
#=================== #=====================================
rec=[1, 2] traitement('riri', 'fifi', 'fich1.txt')
# dépaquetage de la liste liste_fichiers=['fich3.txt', 'fich4.txt', 'fich5.txt']
MaFonction(*rec) traitement('fifi', 'loulou', *liste_fichiers)
[] délimiteur d'une classe de caractères : [abcd] n'importe qu'el caractère parmi la classe.
dans une classe les méta-caractères sont inactifs
- plage : [a-d] de 'a' à 'd'
^ placé en début = complément d'une classe: [^ab] ni 'a' ni 'b'
\ échappement d'un méta-caractère ou séquence
\d caractère numérique ; <=> [0-9]
\D caractère non numérique ; <=> [^0-9]
\s caractère « blanc » ; <=> [ \t\n\r\f\v]
\S caractère autre que « blanc » ; <=> [^ \t\n\r\f\v]
\w caractère alphanumérique ; <=> [a-zA-Z0-9_]
\W caractère non-alphanumérique ; <=> [^a-zA-Z0-9_]
* le caractère précédent peut être présent zéro, une ou plusieurs fois
cha*t => cht, chat, chaat, ... c[ha]*t => ct, cht, chht, cat, caat, chat, chaht, ...
+ le caractère précédent doit être présent une ou plusieurs fois
? le caractère précédent peut être présent zéro ou une fois
{m,n} le caractère précédent doit être présent au moins m fois et au plus n fois
| ou
^ début de ligne
\A début de chaîne
$ fin de ligne
\Z fin de chaîne
\b limite de mot
\B hors limite de mot
ex. @IPv4
Regex= r'(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}\b'
1 parmi 1 parmi
25 [0-5] 25 [0-5]
# coding: utf8
""" Spécifications : - argument(s) en entrée : - [type ] ; Description ; ex. :
- ...
- description du traitement :
- donnée(s) renvoyée(s) : - [type ] ; Description ; ex. :
- ...
Auteur : @Mail :
Date : 20/03/2018 Copyright : "copyleft" """
#=========================== Importation des modules ==========
# import module_interne
# import module_interne_2
# import module_externe
#=========================== Définition des fonctions ==========
Fonctions :
def Fonction1(): - Eviter les répétions de lignes de code
''' docstring ''' - Découper le programme de façon logique
pass ( Analyse fonctionnelle descendante )
#---------------------------------------- - Lisibilité
def Fonction2(): - Réinvestissement
''' docstring ''' - Séparer les interfaces du traitement
pass - Attention aux effets de bord
#----------------------------------------
def SaisirEntier(invite):
''' Spé : - Description : Attente d'un entier saisi par le client docstrings:
- pré-condition : str - invite client documentation
- post-condition : int accessible par
Auteur : Yves ''' help(SaisirEntier) :
Nommage des objets
Saisie=False
(donnez du sens ) Ne jamais
while not Saisie:
try: faire confiance
Reponse=int(input(invite)) à un utilisateur
Saisie=True
except:
print("Erreur de saisie; Veillez entrer un nombre entier")
nom du module return Reponse
durant l'exécution #=========================== Programme principal ============
du programme
if __name__ == '__main__': # Si le programme n'est pas appelé,
L'assertion: Vérification d'une hypothèse avant que le programme ne produise une erreur.
assert condition, "message" ex. assert a==0," valeur nulle interdite"
Ce mécanisme de détection d'erreur, est une aide au développement
et ne doit pas faire partie du code fonctionnel du programme.
Si 'assert' détecte une erreur, le programme doit être modifié.
TP - Exploitation d'une trame NMEA
1) Analyse d'un programme : Depuis une trame GPS jusqu'à un tracé de parcours sur une carte
Analyse du programme :
Suivre le flux des différents traitements depuis le fichier '.txt' jusqu'au fichier '.html'
A chaque étape, affichez le contenu et le type des différentes structures de données.
print(Structure," ",type(Structure)).
Consignez ces observations en commentaires dans le programme.
2) Amélioration du programme .
2) Le fichier 'RelevesGPS.txt' contient des trames GPS de type 'GGA' mais un autre type est également
très répandu: les trames 'RMC'. (v. https://fr.wikipedia.org/wiki/NMEA_0183 )
La bibliothèque 'GPS_Perso.py' devra prendre en compte les deux types de trame.
3) Les récepteurs GPS captent fréquemment des trames non valides qu'il convient
d'identifier et de supprimer.
Position des pièces vue du côté des blancs de la rangée 8 à la rangée 1. Reconstitution d'une partie d'échec
Le contenu de chaque rangée est décrit de la colonne 'a' à la colonne 'h'.
Nom des pièces : - 'R' ou 'r' : rook (tour),
- 'N' ou 'n' : knight (cavalier),
- 'B' ou 'b' : bishop (fou), 1 -Déterminez le code des
- 'Q' ou 'q' : queen (dame), positions des pièces
- 'K' ou 'k' : king (roi)
- 'P' ou 'p' : pawn (pion).
Couleur des pièces : - majuscules (« KQRBNP ») => blanc
- minuscules (« kqrbnp ») => noir.
Les nombres représentent le nombre de cases vides.
Une barre oblique « / » sépare les rangées.
Commentaires
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
3 - Etude de la fonction 'Ouvrir' L'instruction 'askopenfilename' permet la navigation dans l'arborescence d'un ordinateur et la sélection d'un fichier.
Mais que renvoie-t-elle ?
Dans la ligne de code "fichier = open(filename, "r") " que représente le paramètre 'r' ?
Dans le code "partie=fichier.readlines()", quelle est le type de 'partie' ?
Image matricielle sans compression Spécifications de la trame d'un fichier (.pbm, .pgm et .ppm)
"ascii"
codage
"brut" MaxVal Codage des pixels
P1 P4 PBM Portable BitMap monochrome (1 bit per pixel)
P2 P5 PGM Portable GreyMap 65536
P3 P6 PPM Portable PixMap 65536 triplet RougeVertBleu
Procédure magic
number TABs 09
A partir du logiciel 'GIMP', ouvrez le fichier 'voiture.png' LFs 0A
En-tête
et exportez le au format 'pgm' VT 0B
( Fichier Export as 'voiture.pgm' Formatage 'brut' des données ) 1 octet FF 0C
Fermez 'GIMP'. Whitespace CRs 0D
Space 20 décimal ASCII
En ouvrant ce fichier 'voiture.pgm' avec 'HxD' vous devriez obtenir séparées par
la figure 'voiture.pgm sous HxD'. un ou des
Width Matrice des pixels, WhiteSpace
Height de gauche à droite en hexa :
A partir de ce fichier et en vous appuyant sur les spécifications
Maxval et du haut en bas. si MaxVal < 256
de la trame du fichier,
- identifiez le 'magic number' : ASCII characters Codage : alors 1 octet
- en déduire - l'extension du fichier in decimal sinon 2 octets
- le type de codage
- identifiez la taille de l'image - hauteur : un "#" introduit des commentaires qui ne sont pas traités
- largeur : et qui finissent par un retour chariot ou saut de ligne.
Recherchez sur le net la table des codes ASCII puis en tenant compte voiture.pgm sous HxD
de la signification du code '0A', réécrivez l'en-tête du fichier.
Adresses Contenus Contenu
[hexadécimal] [hexadécimal] [en caractères ASCII]
.............................................................................................
00000000 50 35 0A 23 20 43 52 45 41 54 4F 52 3A 20 47 49 P5.# CREATOR: GI
............................................................................................. 00000010 4D 50 20 50 4E 4D 20 46 69 6C 74 65 72 20 56 65 MP PNM Filter Ve
............................................................................................. 00000020 72 73 69 6F 6E 20 31 2E 31 0A 31 36 20 31 36 0A rsion 1.1.16 16.
............................................................................................. 00000030 32 35 35 0A FF FF FF FF FF FF FF FF FF FF FF FF 255.ÿÿÿÿÿÿÿÿÿÿÿÿ
............................................................................................. 00000040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000050 FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 ÿÿÿÿÿÿÿÿÿÿ......
00000060 00 00 00 FF FF FF FF FF FF FF 00 FF FF 00 FF FF ...ÿÿÿÿÿÿÿ.ÿÿ.ÿÿ
Quelle est la taille en octets de - cet en-tête ? 00000070 FF FF 00 FF FF FF FF FF FF FF 00 FF FF 00 FF FF ÿÿ.ÿÿÿÿÿÿÿ.ÿÿ.ÿÿ
- de la matrice des pixels ? 00000080 FF FF 00 FF FF FF FF FF FF FF 00 FF FF 00 FF FF ÿÿ.ÿÿÿÿÿÿÿ.ÿÿ.ÿÿ
Sous Windows, déterminez la taille de ce fichier; Justifiez cette taille. 00000090 FF FF 00 FF FF FF FF FF FF FF 00 FF FF 00 FF FF ÿÿ.ÿÿÿÿÿÿÿ.ÿÿ.ÿÿ
000000A0 FF FF 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 ÿÿ.ÿÿ...........
Exprimez cette taille en hexadécimal puis commentez l'adresse du dernier 000000B0 00 00 00 FF FF 00 FF FF FF FF FF FF FF FF FF FF ...ÿÿ.ÿÿÿÿÿÿÿÿÿÿ
pixel. 000000C0 FF FF 00 FF FF 00 FF FF FF FF FF FF FF FF FF FF ÿÿ.ÿÿ.ÿÿÿÿÿÿÿÿÿÿ
Niveau de gris Code 000000D0 FF FF 00 FF FF 00 FF FF FF FF FF FF FF FF FF FF ÿÿ.ÿÿ.ÿÿÿÿÿÿÿÿÿÿ
Le niveau de gris des pixels est codé en Blanc Noir 000000E0 FF FF 00 FF FF 00 00 00 00 00 00 00 00 00 00 00 ÿÿ.ÿÿ...........
hexadécimal. 100% 0% FF 000000F0 00 00 00 FF FF FF FF 00 00 00 FF FF FF FF FF 00 ...ÿÿÿÿ...ÿÿÿÿÿ.
0% 100% 00 00000100 00 00 FF FF FF FF FF FF 00 FF FF FF FF FF FF FF ..ÿÿÿÿÿÿ.ÿÿÿÿÿÿÿ
Complétez la table de correspondance 00000110 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ci-contre. 50% 50%
00000120 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
75% 25% 00000130 FF FF FF FF ÿÿÿÿ
Permutation de pixels
( ou photomaton ) Commençons par la fin Visualisez l'image " lancelot.jpg" puis, avec IDLE de python, éditez
le fichiez "Permutation des pixels.py" et exécutez le puis observez
l'apparition progressive des fichiers "iteration1" , ... , "itération8". Visualisez-les.
Permutation Permutez les couleurs de l'image 'rose.jpg'; Les valeurs des composantes du rouge deviendront les valeurs pour le vert;
des couleurs Celles du vert deviendront celles du bleu et celles du bleu deviendront celles du rouge.
Fondu A partir de deux images de même dimension et qui se partagent de préférence le même cadrage,
enchaîné réalisez en 10 étapes, un fondu enchaîné de l'une vers l'autre.
Matrice de si le pixel ai,j ki-1,j-1 ki-1,j ki-1,j+1 Sous GIMP, ouvrir l'image 'rose.jpg' Détection Accen- filtre Proposez une matrice
convolution n'est pas au ki,j-1 ki,j ki,j+1 puis dans le menu 'Filtre' 'Générique' des bords tuation de Sobel qui décale l'image d'un
bord de l'image, ki+1,j-1 ki+1,j ki+1,j+1 'Matrice de convolution'. 0 1 0 0 -0.5 0 -1 0 1 pixel vers la droite
Tester les matrices ci-contre. 1 -4 1 -0.5 3 -0.5 -2 0 2
ai-1,j-1 ai-1,j ai-1,j+1 (i+1,j+1)
Stéganographie Ou cacher une information dans un support, par exemple des images Blablabla Message à
Le codage des pixels s'effectue généralement sur une échelle camoufler
allant de 0 à 255; c'est-à-dire sur 8 bits. ex.: 136 1 0 0 0 1 0 0 0 Codes ASCII
des caractères 42 6C 61 62 6C 61 62 6C 61
Les bits les plus à droite ont un faible impact sur l'image quasi
indécelable à l'oeil; Ils peuvent donc être utilisés pour dissimuler 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 ...
des informations. Cette technique, appelée tatouage est utilisée
notamment pour protéger des images par copyright.
... 10000100 1 0010010
Cette technique permet également
128 144
de cacher une image dans une autre. Image
... Codage
Un programme, permutant les quartets 1 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 ... dissimulant
pixels
( 4 bits ) de poids forts et de poids le message
faibles, permettra la visualisation 138 155
... Image
de l'une ou de l'autre image.
Pixels ...
Perte des 4 bits
... de poids faibles
def input(event):
if event.type == pygame.QUIT:
exit(0)
while True:
input(pygame.event.wait())s
Etant donnée une source 'X' produisant des symboles 'x i' choisis dans un ensemble fini avec une probabilité respective p(xi),
quel est le nombre minimal de bits nécessaires pour transmettre l’information que c’est le symbole 'x i0' qui a été produite. n > H(X) = - p(xi).log2 p(xi)
i
L’entropie d’une source discrète est donc la quantité moyenne d’information par symbole et est exprimée en bits par symbole.
Elle définit une borne inférieure sur le nombre moyen 'n' de bits nécessaires pour coder une source donnée.
Elle mesure l’incertitude dans la production d'unr source: l’entropie d’une source 'X' produisant 'N' symboles distincts est
- maximale, égale à log2N , si tous les symboles sont équiprobables
- minimale, égale à 0, si l’un des symboles est de probabilité 1 .
Supposons que l’on souhaite coder une image couleur ( 3x8 bits par pixel soit X = 224 valeurs distinctes) de 4 mégapixels (n = 4x2 20 pixels).
n n 20
Le nombre d'images possibles est N = X . L'entropie H(X ) de cette source est < log2 N = 24*4*2
20
Il est donc possible de coder ces images en moins de 24*4*2 bits en moyenne. Ceci suppose cependant de connaître la distribution de probabilités de la source
qui est inconnue. Il va donc falloir procéder sans connaître cette distribution.
Dictionnaire
Algorithme LZW (Lempel-Ziv-Welch) 24 caractères ASCII = 192 bits
T 'T' O TO 256
Chaine = Nul; TOBEORNOTTOBEORTOBEORNOT
O 'O' B OB 257
tant que (lecture d'un caractère Car ) faire 1 caractère Ascii => 8 bits
B 'B' E BE 258
si (Chaine + Car existe dans le dictionnaire) alors
E 'E' O EO 259
Chaine = Chaine + Car ;
O 'O' R OR 260
sinon
R 'R' N RN 261 16 codes de 9 bits => 144 bits
ajouter Chaine + Car au dictionnaire;
N 'N' O NO 262 T,O,B,E,O,R,N,O,T,256,258,260,265,259,261,263
écrire le code de Chaine;
O 'O' T OT 263
Chaine = Car ; 9 bits
T 'T' T TT 264
fin si
TO 256 B TOB 265
fin tant que 1) Sous python, proposez un programme de compression LZW sur 10bits
BE 258 O BEO 266
écrire le code de Chaine; 2) Utilisez votre programme pour compresser le fichier "Le Meunier,
OR 260 T ORT 267
NB: - Le symbole '+' représente la concaténation TOB 265 E TOBE 268 son Fils et l’Âne.txt"
- Le dictionnaire construit dynamiquement EO 259 R EOR 269 3) Déterminez le taux de compression obtenu.
d'après les motifs rencontrés. RN 261 O RNO 270 4) Rédigez un message de quelques lignes que vous compresserez et
[0;255] => codes Ascii OT 263 que vous donnerez à votre voisin pour qu'il le décompresse.