En pratique

De TARENTINO
Aller à la navigationAller à la recherche
Array
Ft.png
(Opérateurs:Magenta)
(Méthodes:Green)
(Fonctions:Red)

7/03/2026


En pratique

  • Appliquons maintenant la théorie à la pratique.
  • Tout n'est pas encore intégré

Infos utiles

  • Connaitre la version de Python
1 import sys
2 print(sys.version_info)

Index des modules d'extension Python

Exercices

Python Niveau 1 (Dominique)

Sommes de 2 nombres

 1 # PROGRAMME sommeNombres
 2 #VAR
 3 nombre1 : int
 4 nombre2 : int
 5 somme : int
 6 #DEBUT
 7 nombre1 = int(input("Saisir le premier nombre : "))
 8 nombre2 = int(input("Saisir le deuxième nombre : "))
 9 somme = nombre1 + nombre2
10 print("La somme des 2 nombres est : " , somme)
11 #FIN

Ascenceur 01

 1 # Variables
 2 PorteCabineEstOuverte:bool
 3 lesEtagesEstES:[bool]=[true,
 4                        true,
 5                        false,
 6                        true]
 7 #lesEtagesEstES[1]=false
 8 EntrainementEtatDepl:str        # Arreté
 9 EtageCourant:int
10 EtageAppel:int
11 # Debut
12 EntrainementEtatDepl="Arreté"
13 EtageCourant=1
14 #if (EntrainementEtatDepl=="Arreté") :
15 EtageAppel=int(input("De quel étage appelez vous ? "))
16 # si EtageCourant < EtageAppel And EntrainementEtatDepl=Arreté and PorteCabineEstOuverte=false
17 if (EtageAppel > EtageCourant) :
18     # descente
19     print("Faire monter l'entrainement de la cabine !")
20     print("La cabine est en montée et ouverte False à l'étage ", EtageCourant)
21 else :
22     if (EtageAppel < EtageCourant) :
23         # si EtageCourant < EtageAppel And EntrainementEtatDepl=Arreté and PorteCabineEstOuverte=true
24         # Montée
25         print("Faire descendre l'entrainement de la cabine !")
26         print("La cabine est en descente et ouverte False à l'étage ", EtageCourant)
27     else :
28         print("Déjà au bon étage !!!! Faire ouvrir les portes")
29     # fin de si
30 # fin de si
31 print("La cabine est ",EntrainementEtatDepl, " et ouverte à l'étage ", EtageCourant)
32 # Fin

Ascenceur 02

 1 """"
 2 NAME        : ascenseur.py
 3 Description : Programme de pilotage d'un ascenseur - V1
 4 """
 5 # PROGRAMME ascenseur
 6 #
 7 # TYPES
 8 # Nous n'utilisons que des types natifs du langage (int, str ...), il n'est donc pas nécessaire de définir des types de données : ils existent
 9 #
10 # VAR
11 etatEntrainement : str = "ARRETE" 		# Déclaration d'une donnée variable de type string et initialisation
12 										# Un entrainement arrêté
13 porteCabineEstOuverte : bool = False	# Déclaration d'une donnée variable de type booléen et initialisation
14 										# Une porte de cabine ouverte
15 										
16 										
17 etageCourantCabine : int = 1			# Déclaration d'une donnée variable de type entier et initialisation
18 										# Une cabine est à l'étge 1
19 etageDAppel : int  = -1					# Déclaration d'une donnée
20 # variable de type entier et initialisation
21 										# Aucun étage appelé (valeur -1)
22 lesEtagesEstES : [bool]=[True,True,False,True]
23 
24 n : int=0
25 
26 #
27 # DEBUT
28 print("	Debut du programme 3")
29 while n<4 :
30 	print("L'etage " , n , " est " ,lesEtagesEstES[n])
31 	n=n+1
32 print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage", etageCourantCabine)
33 
34 # L'usager appelle l'ascenseur
35 etageDAppel = int(input("De quel étage appelez-vous? "))
36 if (lesEtagesEstES[etageDAppel]==True) :
37 
38 	if (etageDAppel > etageCourantCabine) :
39 		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
40 		etatEntrainement = "EN_MONTEE"
41 	else :
42 		if (etageDAppel < etageCourantCabine) :
43 			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
44 			etatEntrainement = "EN_DESCENTE"
45 		else :
46 			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir la porte
47 			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
48 			porteCabineEstOuverte = True
49 	print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage", etageCourantCabine)
50 
51 	# Saisie de l'étage auquel arrive la cabine
52 	if ( etageCourantCabine != etageDAppel) :
53 		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
54 		if (etageCourantCabine == etageDAppel) :
55 			print("FAIRE ARRETER L'ENTRAINEMENT")
56 			etatEntrainement = "ARRETE"
57 			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
58 			porteCabineEstOuverte = True
59 			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
60 				  etageCourantCabine)
61 
62 	# Saisie de l'étage auquel arrive la cabine
63 	if ( etageCourantCabine != etageDAppel) :
64 		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
65 		if (etageCourantCabine == etageDAppel) :
66 			print("FAIRE ARRETER L'ENTRAINEMENT")
67 			etatEntrainement = "ARRETE"
68 			print ("FAIRE OUVRIR LA PORTE DE LA CABINE")
69 			porteCabineEstOuverte = True
70 			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
71 				  etageCourantCabine)
72 
73 	# Saisie de l'étage auquel arrive la cabine
74 	if ( etageCourantCabine != etageDAppel) :
75 		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
76 		if (etageCourantCabine == etageDAppel) :
77 			print("FAIRE ARRETER L'ENTRAINEMENT")
78 			etatEntrainement = "ARRETE"
79 			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
80 			porteCabineEstOuverte = True
81 			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
82 				  etageCourantCabine)
83 else :
84 	print("etage FERME")
85 print("	Fin du programme")
86 #
87 # FIN

Ascenceur 03

  1 """"
  2 NAME        : ascenseur.py
  3 Description : Programme de pilotage d'un ascenseur - V2 - Tableaux, structures, boucles
  4 """
  5 #
  6 # PROGRAMME ascenseur
  7 # TYPES
  8 from enum import Enum # Truc syntaxique que l'on ne comprend pas encore
  9 class EnumEtatEnt (Enum) :  # Définition d'un type énumération
 10 	ARRETE = 1
 11 	EN_MONTEE = 2
 12 	EN_DESCENTE = 3
 13 
 14 class EnumEtatPorte (Enum) :
 15 	FERME = 1
 16 	OUVERT = 2
 17 
 18 class EtatCabine (Enum) :
 19 	ARRETE_FERME = 1
 20 	ARRETE_OUVERT = 2
 21 	EN_DESCENTE_FERME = 3
 22 	EN_MONTEE_FERME = 4
 23 
 24 #Constante NB_ETAGES = 4 - Le nombre d'étages de l'ascenseur est 4, RDC, étage 0, inclus - Il y a donc 3 étages proprement dits
 25 #Constante NUM_PORTE_CABINE = 4 - Le numéro de la porte de cabine est 4 (les premiers numéros correspondent à des portes d'étage)
 26 
 27 from dataclasses import dataclass # Truc syntaxique que l'on ne comprend pas encore
 28 @dataclass                        # Autre truc syntaxique ...
 29 class Cabine :                    # Définition d'un type structure Cabine
 30 	etat : EtatCabine
 31 	etageCourant : int
 32 	numPorte: int
 33 
 34 @dataclass
 35 class Etage :                      # Définition d'un type structure Etage
 36 	estES : bool
 37 	estEteint : bool
 38 	numPorte : int
 39 #
 40 # VAR
 41 
 42 def init() :
 43 	print("   L'entrainement est", etatEntrainement)
 44 	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
 45 	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
 46 
 47 etatEntrainement : EnumEtatEnt = EnumEtatEnt.ARRETE 	# Déclaration d'une donnée variable de type énumération et initialisation -
 48 																# 1 entrainement, arrêté
 49 lesEtatPortes : [EnumEtatPorte] = [EnumEtatPorte.FERME, EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME] 	# Déclaration d'une donnée variable de type tableau d'énumération et initialisation
 50 																												# 5 portes fermées - 4 portes d'étage et 1 porte de cabine (la dernière)
 51 laCabine : Cabine = Cabine(EtatCabine.ARRETE_FERME, 1, 4)           	# Déclation d'une donnée variable de type structure et initialisation
 52 															# 1 cabine, arrêté fermée, à l'étage 1 et avec la porte 4
 53 lesEtages : [Etage] = [Etage(True,True,0), Etage(True,True,1), Etage(False,True,2), Etage(True,True,3)]  # Déclaration d'une donnée variable de type tableau de 4 booléens et initialisation
 54 																									   # 4 étages, chaque étage, en service, éteint, avec une porte de son numéro
 55 etageDAppel : int  = -1 	# Déclaration d'une donnée variable de type entier et initialisation
 56 							# Aucun étage appelé (valeur -1)
 57 #
 58 # DEBUT
 59 print("   Début du programme 9")
 60 
 61 # Affichage état de l'ascenseur
 62 # Affichage état complet de la cabine
 63 print("   L'entrainement est", etatEntrainement)
 64 print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
 65 print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
 66 
 67 #Affichage état complet des étages
 68 """""
 69 numEtage = 0
 70 while numEtage < 4  :# NB_ETAGES
 71 	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
 72 		  "numéro de porte ", lesEtages[numEtage].numPorte,
 73 		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
 74 	numEtage = numEtage + 1
 75 """	
 76 for numEtage in range(0,4) :
 77 	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
 78 		  "numéro de porte ", lesEtages[numEtage].numPorte,
 79 		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
 80 # L'usager appelle l'ascenseur
 81 etageDAppel = int(input("De quel étage appelez-vous? "))
 82 if lesEtages[etageDAppel].estES :
 83 	if (etageDAppel > laCabine.etageCourant) :
 84 		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
 85 		etatEntrainement = EnumEtatEnt.EN_MONTEE
 86 		laCabine.etat = EtatCabine.EN_MONTEE_FERME
 87 	else :
 88 		if (etageDAppel < laCabine.etageCourant) :
 89 			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
 90 			etatEntrainement = EnumEtatEnt.EN_DESCENTE
 91 			laCabine.etat = EtatCabine.EN_DESCENTE_FERME
 92 		else :
 93 			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir les portes
 94 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
 95 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
 96 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
 97 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
 98 			laCabine.etat = EtatCabine.ARRETE_OUVERT
 99 	# Affichage état complet de la cabine
100 	print("   L'entrainement est", etatEntrainement)
101 	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
102 	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
103 	while ( laCabine.etageCourant != etageDAppel) : 	# La cabine n'est pas à l'étage d'appel
104 		# Saisie de l'étage auquel arrive la cabine
105 		laCabine.etageCourant = int(input("La cabine arrive à quel étage? "))
106 		if (laCabine.etageCourant == etageDAppel) :
107 			print("FAIRE ARRETER L'ENTRAINEMENT")
108 			etatEntrainement = EnumEtatEnt.ARRETE
109 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
110 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
111 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
112 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
113 			laCabine.etat = EtatCabine.ARRETE_OUVERT
114 		# Affichage état complet de la cabine
115 		print("   L'entrainement est", etatEntrainement)
116 		print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
117 		print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
118 else :
119 	print("   L'appel ne peut être pris en compte car l'étage n'est pas en service")
120 
121 print("   Fin du programme")
122 #
123 # FIN

Ascenceur 04

  1 """"
  2 NAME        : ascenseur.py
  3 Description : Programme "ascenseur", programme de pilotage d'un ascenseur - V3 - Sous-programmes
  4 """
  5 # PROGRAMME ascenseur
  6 #
  7 # TYPES
  8 from enum import Enum # Truc syntaxique que l'on ne comprend pas encore
  9 class EnumEtatEnt (Enum) :  # Définition d'un type énumération
 10 	ARRETE = 1
 11 	EN_MONTEE = 2
 12 	EN_DESCENTE = 3
 13 
 14 class EnumEtatPorte (Enum) :
 15 	FERME = 1
 16 	OUVERT = 2
 17 
 18 class EtatCabine (Enum) :
 19 	ARRETE_FERME = 1
 20 	ARRETE_OUVERT = 2
 21 	EN_DESCENTE_FERME = 3
 22 	EN_MONTEE_FERME = 4
 23 
 24 #Constante NB_ETAGES = 4 - Le nombre d'étages de l'ascenseur est 4, RDC, étage 0, inclus - Il y a donc 3 étages proprement dits
 25 #Constante NUM_PORTE_CABINE = 4 - Le numéro de la porte de cabine est 4 (les premiers numéros correspondent à des portes d'étage)
 26 
 27 from dataclasses import dataclass # Truc syntaxique que l'on ne comprend pas encore
 28 @dataclass                        # Autre truc syntaxique ...
 29 class Cabine :                    # Définition d'un type structure Cabine
 30 	etat : EtatCabine
 31 	etageCourant : int
 32 	numPorte: int
 33 
 34 @dataclass
 35 class Etage :                      # Définition d'un type structure Etage
 36 	estES : bool
 37 	estEteint : bool
 38 	numPorte : int
 39 #
 40 # VAR
 41 etatEntrainement : EnumEtatEnt = EnumEtatEnt.ARRETE 	# Déclaration d'une donnée variable de type énumération et initialisation -
 42 																# 1 entrainement, arrêté
 43 lesEtatPortes : [EnumEtatPorte] = [EnumEtatPorte.FERME, EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME] 	# Déclaration d'une donnée variable de type tableau d'énumération et initialisation
 44 																												# 5 portes fermées - 4 portes d'étage et 1 porte de cabine (la dernière)
 45 laCabine : Cabine = Cabine(EtatCabine.ARRETE_FERME, 1, 4)           	# Déclation d'une donnée variable de type structure et initialisation
 46 															# 1 cabine, arrêté fermée, à l'étage 1 et avec la porte 4
 47 lesEtages : [Etage] = [Etage(True,True,0), Etage(True,True,1), Etage(False,True,2), Etage(True,True,3)]  # Déclaration d'une donnée variable de type tableau de 4 booléens et initialisation
 48 																									   # 4 étages, chaque étage, en service, éteint, avec une porte de son numéro
 49 etageDAppel : int  = -1 	# Déclaration d'une donnée variable de type entier et initialisation
 50 							# Aucun étage appelé (valeur -1)
 51 #
 52 # SOUS-PROGRAMME afficherEtatCompletCabine
 53 def afficherEtatCompletCabine() :
 54 	# DEBUT
 55 	print("   L'entrainement est", etatEntrainement)
 56 	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
 57 	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
 58 	# FIN
 59 # FIN SOUS-PROGRAMME
 60 #
 61 # SOUS-PROGRAMME calculerEtatCabine - retourne une valeur de type EtatCabine
 62 def calculerEtatCabine() :
 63 	# VAR LOC
 64 	result : EtatCabine
 65 	# DEBUT
 66 	if (etatEntrainement == EnumEtatEnt.ARRETE ) :
 67 		if (lesEtatPortes[laCabine.numPorte] == EnumEtatPorte.FERME) :
 68 			result = EtatCabine.ARRETE_FERME
 69 		else :
 70 			result = EtatCabine.ARRETE_OUVERT
 71 	elif (etatEntrainement == EnumEtatEnt.EN_DESCENTE ) :
 72 		result = EtatCabine.EN_DESCENTE_FERME
 73 	else :
 74 		result = EtatCabine.EN_MONTEE_FERME
 75 	return result
 76 	# FIN
 77 # FIN SOUS-PROGRAMME
 78 
 79 # DEBUT
 80 print("   Début du programme 10")
 81 # Affichage état de l'ascenseur
 82 # Affichage état complet de la cabine
 83 afficherEtatCompletCabine()
 84 #Affichage état complet des étages
 85 for numEtage in range(0,4) :
 86 	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
 87 		  "numéro de porte ", lesEtages[numEtage].numPorte,
 88 		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
 89 # L'usager appelle l'ascenseur
 90 etageDAppel = int(input('De quel étage appelez-vous? '))
 91 if lesEtages[etageDAppel].estES :
 92 	if (etageDAppel > laCabine.etageCourant) :
 93 		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
 94 		etatEntrainement = EnumEtatEnt.EN_MONTEE
 95 		laCabine.etat = calculerEtatCabine()
 96 	else :
 97 		if (etageDAppel < laCabine.etageCourant) :
 98 			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
 99 			etatEntrainement = EnumEtatEnt.EN_DESCENTE
100 			laCabine.etat = calculerEtatCabine()
101 		else :
102 			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir les portes
103 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
104 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
105 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
106 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
107 			laCabine.etat = calculerEtatCabine()
108 	# Affichage état complet de la cabine
109 	afficherEtatCompletCabine()
110 	while ( laCabine.etageCourant != etageDAppel) : 	# La cabine n'est pas à l'étage d'appel
111 		# Saisie de l'étage auquel arrive la cabine
112 		laCabine.etageCourant = int(input('La cabine arrive à quel étage? '))
113 		if (laCabine.etageCourant == etageDAppel) :
114 			print("FAIRE ARRETER L'ENTRAINEMENT")
115 			etatEntrainement = EnumEtatEnt.ARRETE
116 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
117 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
118 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
119 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
120 			laCabine.etat = calculerEtatCabine()
121 		# Affichage état complet de la cabine
122 		afficherEtatCompletCabine()
123 else :
124 	print("	l'appel ne peut être pris en compte car l'étage n'est pas en service")
125 
126 print("   Fin du programme")
127 #
128 # FIN

Python Niveau 2 (Alex)

Exercice Hello Word

  • Sans commentaire, si tu n'y arrives pas alors laisses tomber Python....
1 #!/usr/bin/env python3
2 print("Hello, world ! bientôt l'été")
Hello, world ! bientôt l'été
  • Analyse:
    • Non trop facile !

Exercice Hello Word compatible Python 2 et Python 3

1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 from __future__ import print_function
4 print("hello, world ! bientôt l'été")
Hello, world ! bientôt l'été
  • Analyse:
    • Il existe plusieurs versions de Python, je ne parlerai ici que de la version 2 et 3 car elles ont de principales différences.
Print
  • Le changement le plus radical étant surement de transformer le print en fonction.
Python 2: print "bonjour"
Python 3: print("bonjour")
  • Mais aussi:
Python 2                            Python 3   
print "Bonjour"                 →   print("Bonjour")
print "Bonjour", variable1      →   print("Bonjour", variable1)
print "\n".join([x, y])         →   print(x, y, sep="\n")
print >> sys.stderr, "erreur"   →   print("Erreur", file=sys.stderr)
print "une ligne ",             →   print("une ligne", end="")
Exceptions
Python 2                          Python 3
raise IOError, "file error"   →   raise IOError("file error")
raise "Erreur 404"            →   raise Exception("Erreur 404!")
raise TypeError, msg, tb      →   raise TypeError.with_traceback(tb)
Changement de nom de modules
Python 2             Python 3
_builtin__       →   builtins
ConfigParser     →   configparser
copy_reg         →   copyreg
cPickle          →   pickle
Queue            →   queue
repr             →   reprlib
SocketServer     →   socketserver
Tkinter          →   tkinter
_winreg          →   winreg
thread           →   _thread
dummy_thread     →   _dummy_thread
markupbase       →   _markupbase
Réorganisation
Python 2                        Python 3
xrange()                    →   range()
reduce()                    →   functools.reduce()
intern()                    →   sys.intern()
unichr()                    →   chr()
basestring()	            →   str()
long()	                    →   int()
itertools.izip()            →   zip()
itertools.imap()            →   map()
itertools.ifilter()         →   filter()
itertools.ifilterfalse()    →   itertools.filterfalse()
cookielib                   →   http.cookiejar
Cookie	                    →   http.cookies
htmlentitydefs              →   html.entities
HTMLParser                  →   html.parser
httplib                     →   http.client
Dialog                      →   tkinter.dialog
FileDialog                  →   tkinter.FileDialog
ScrolledText                →   tkinter.scolledtext
SimpleDialog                →   tkinter.simpledialog
Tix                         →   tkinter.tix
Tkconstants                 →   tkinter.constants
Tkdnd                       →   tkinter.dnd
tkColorChooser              →   tkinter.colorchooser
tkCommonDialog              →   tkinter.commondialog
tkFileDialog                →   tkinter.filedialog
tkFont                      →   tkinter.font
tkMessageBox                →   tkinter.messagebox
tkSimpleDialog              →   tkinter.simpledialog
robotparser                 →   urllib.robotparser
urlparse                    →   urllib.parse
cStringIO.StringIO()        →   io.StringIO
UserString                  →   collections.UserString
UserList                    →   collections.UserList

Nombres

 1 #!/usr/bin/env python3
 2 # -*- coding: utf-8 -*-
 3 nb_entier = 42
 4 print(type(nb_entier))
 5 nb_long = 300000000000
 6 print(type(nb_long))
 7 nb_complexe = 2+4j
 8 print(type(nb_complexe))
 9 # Changement dynamique de type
10 for nb in range(20):
11     nb2 = nb ** nb
12     print(nb2, type(nb2))
13 # Modulo
14 print("9 % 5 =", 9 % 5)
15 # Puissance
16 print("2 ** 4 =", 2 ** 4)
17 print('=' * 20)
18 # Constructeurs
19 nb = int("42")
20 print(nb, type(nb))
21 nb = float("42.123")
22 print(nb, type(nb))
23 nb = complex("2+5j")
24 print(nb, type(nb))
25 print('=' * 20)
26 print(hex(456))
27 print(oct(456))
28 print(bin(456))
29 print('=' * 20)
30 print(chr(65))
31 print(ord('A'))
  • Analyse:

Chaine

  1 #!/usr/bin/env python3
  2 # -*- coding: utf-8 -*-
  3 ch = "Une chaine double quote peut contenir des ' "
  4 ch2 = 'Une chaine simple quote peut contenir des " '
  5 ch3 = """Une chaine
  6 qui s'etend
  7 sur
  8 plusieurs lignes"""
  9 ch4 = "on peut mettre antislash pour afficher une \" dans une chaine double quote"
 10 print(ch, type(ch))
 11 print(ch2, type(ch2))
 12 print(ch3, type(ch3))
 13 print(ch4, type(ch4))
 14 print('=' * 20)
 15 # Unicode
 16 ch_sans_unicode = "été"
 17 ch_avec_unicode = "été"
 18 print(ch_sans_unicode, type(ch_sans_unicode))
 19 print(ch_avec_unicode, type(ch_avec_unicode))
 20 print("Taille de la chaine ch_sans_unicode:", len(ch_sans_unicode))
 21 print("Taille de la chaine ch_avec_unicode:", len(ch_avec_unicode))
 22 print('=' * 20)
 23 # Chaine raw
 24 ch_sans_raw = 'une chaine\tavec\ndes caractères spéciaux'
 25 ch_avec_raw = r'une chaine\tavec\ndes caractères spéciaux'
 26 print(ch_sans_raw, type(ch_sans_raw))
 27 print(ch_avec_raw, type(ch_avec_raw))
 28 print('=' * 20)
 29 ch = "bonjour tout le monde"
 30 print("ch:", ch)
 31 # Indicage
 32 print("ch[2]:", ch[2])
 33 print("ch[-2]:", ch[-2])
 34 # Tranches de valeurs
 35 print("ch[3:5]:", ch[3:5])
 36 print("ch[-8:-2]:", ch[-8:-2])
 37 print("ch[3:-2]:", ch[3:-2])
 38 print("ch[3:]:", ch[3:])
 39 print("ch[:-2]:", ch[:-2])
 40 # Multiplication d'une chaine par un entier
 41 ch2 = 'hello' * 4
 42 print(ch2)
 43 # On peut itérer sur une séquence
 44 for car in ch:
 45     print(car)
 46 # Concaténation
 47 ch3 = ch + ch2
 48 print(ch3)
 49 # Appartenance
 50 print("'xyz' in 'bonjour' ?", 'xyz' in 'bonjour')
 51 print("'njo' in 'bonjour' ?", 'njo' in 'bonjour')
 52 print('=' * 20)
 53 # Masque d'affichage
 54 notes = "Eleve: %-10s    Age: %2d   Note: %5.2f"
 55 print("Masque:", notes)
 56 print("Note Bart:", notes % ('Bart', 10, 5.55))
 57 # Masque d'affectation
 58 note_lisa = notes % ('Lisa', 12, 18.42)
 59 print("note_lisa:", note_lisa)
 60 print('=' * 20)
 61 liste = [   ('Bart', 10, 1.23),
 62             ('Lisa', 12, 19.99),
 63             ('Homer', 42, 0.1)
 64         ]
 65 for prenom, age, note in liste:
 66     print(notes % (prenom, age, note))
 67 print('=' * 20)
 68 for var in liste:
 69     print(var, type(var))
 70     #print(notes % (var[0], var[1], var[2]))
 71     print(notes % var)
 72 # Test d'égalité : ==
 73 ch = 'hello'
 74 ch2 = 'hello'
 75 print("ch == ch2 ?", ch == ch2)
 76 # S'agit-il du même objet en mémoire : is
 77 print("ch is ch2 ?", ch is ch2)
 78 print('=' * 20)
 79 # La classe chaine de caractères fournit un ensemble de méthodes
 80 print("ch.upper():", ch.upper())
 81 print("ch.center(40):", ch.center(40,'*'))
 82 print('=' * 20)
 83 # split
 84 ch = "bonjour    tout  le          monde"
 85 print("ch.split()", ch.split())
 86 print("ch.split(' ')", ch.split(' '))
 87 print("ch.split('o')", ch.split('o'))
 88 print('=' * 20)
 89 # replace
 90 ch2 = ch.replace('o', 'X')
 91 print("ch2:", ch2)
 92 print("ch (non modifiée):", ch)
 93 ch2 = ch.replace('jour', 'soir')
 94 print("ch2:", ch2)
 95 print('=' * 20)
 96 # find
 97 print("'ou' apparait a la position:", ch.find('ou'))
 98 print('=' * 20)
 99 # format
100 print("info: {0} {1} {2} {1} {0}".format('a', 'b', 'c'))
101 print('=' * 20)
102 # Espace de noms du programme principal
103 print(dir())
104 print('=' * 20)
105 # Attributs et méthodes d'une classe d'objet, ex. une chaine
106 print(dir(''))
107 print('=' * 20)
108 # Les chaines documentaires
109 def fct():
110     "Ceci est la documentation de ma fonction"
111     pass
112 print("Doc de la fonction fct():", fct.__doc__)
113 print('=' * 20)
114 print("Documentation de la classe str():", str.__doc__)
115 print('=' * 20)
116 print("Documentation de la méthode split de la classe str():", str.split.__doc__)
117 print('=' * 20)
118 print("Documentation de la méthode find de la classe str():", str.find.__doc__)

Python Niveau 3 (Jean François)

Loto

  • Écrire un programme qui réalise un tirage de Loto. Ce dernier est composé de:
    • 5 boules parmi 49 boules numérotées de 1 à 49
    • 1 boule “chance” parmi 10 boules numérotées de 1 à 10
 1 # loto_01.py
 2 import random
 3 nb_boules=49
 4 boules = [ x for x in range(1,nb_boules+1) ]
 5 tirage = []
 6 for boule in range(5):
 7     une_boule = boules[ random.randint(1,len( boules )) - 1 ]
 8     tirage.append( une_boule )
 9     boules.remove(une_boule)
10 chance = random.randint(1,10)
11 print(tirage, chance)
12 tirage.sort()
13 print(tirage)
  • Reprendre le programme de Loto précédent.
    • Utiliser une Classe “Loto” avec un constructeur qui génère un tirage.
Un tirage est composé de :
- Un numéro de tirage
- Les 5 boules
- Le numéro Chance
    • Ajouter une variable de classe qui mémorise les tirages ainsi qu’une méthode qui renvoie un tirage en fonction du numéro du tirage.
    • Créer une référence au dernier tirage appelé “dernierTirage” (ce n’est donc pas une instanciation)
    • Ajouter de la documentation et afficher celle-ci dans la console (introspection)
    • Ajouter un morceau de code qui peut générer une exception:
  • On demande un numéro de tirage et on affiche le tirage correspondant.
 1 # loto_02.py
 2 # v2: on utilise une Classe
 3 """ Un module pour gerer des tirages de Loto """
 4 import random
 5 
 6 class Loto:
 7     """ Permet d'instancier des tirages de Loto """
 8     nb_boules=49
 9     les_tirages = []
10 
11     def __init__(self, num_tirage):
12         """ Cree un tirage [num, les 5 boules, numero change]) """
13         tirage_5_boules = []
14         boules = [ x for x in range(1,Loto.nb_boules+1) ]
15         for boule in range(5):
16             une_boule = boules[ random.randint(1,len( boules )) - 1 ]
17             tirage_5_boules.append( une_boule )
18             boules.remove(une_boule)
19 
20         chance = random.randint(1,10)
21         tirage_5_boules .sort()
22         self.num = num_tirage
23         self.cinqBoules = tirage_5_boules
24         self.chance = chance
25         Loto.les_tirages.append( self )
26 
27     def __str__(self):
28         """ conversion d'un tirage en chaine """
29         ch = "Numero: " + str(self.num) + " ,5 boules: "
30         for i in range(5): ch += str( self.cinqBoules[i] ) + " - "
31         ch += " ,Numero chance: "+ str(self.chance)
32         return ch
33 
34     @classmethod
35     def getUnTirage(cls, num ):
36         """ Exemple de methode de classe """
37         for t in cls.les_tirages:
38             if t.num == num: return t
39     return None
40 
41     if __name__ == "__main__":
42         num = 100
43         for i in range(5):
44             un_tirage = Loto(num+i)
45         le_dernier_tirage = un_tirage
46         for t in Loto.les_tirages:
47             print( t.num, t.cinqBoules, t.chance)
48 
49         print("Dernier: %s\n" % (str(le_dernier_tirage) ))
50         try:
51             num = int( input("Numero de tirage ? ") )
52         except:
53             print("ERREUR: saisie incorrect")
54         else:
55             print("Tirage 103: %s\n" % (str( Loto.getUnTirage( num ) ) ) )

Probabilité course lièvre/tortue

  • Main
1 import lievre.py
2 nb_coup:int=1000000
3 i:int=0
4 while i < nb_coup:
5     lievre.py
6     i=i+1
  • lievre2.py
 1 ###### lievre2.py: le lievre et la tortue
 2 from random import *
 3 total= 0
 4 unGagnant = False
 5 gagnant = None
 6 while not unGagnant:
 7     de = randint(1,6)
 8     print ("Valeur du lance: ", de )
 9     total = total + de
10     if de == 6 :
11         gagnant = "Lievre"
12         unGagnant = True
13     elif total >= 6:
14         gagnant = "Tortue"
15         unGagnant = True
16 print ("Gagnant: ", gagnant )
  • Tortue.py
 1 from random import *
 2 lievre:int=0
 3 i:int=1000000
 4 dep=i
 5 r:int=0
 6 def golievre():
 7     total= 0
 8     while True:
 9         de = randint(1,6)
10         if de == 6 :
11             r=1
12             break
13         total = total + de
14         if total >= 6:
15             r=0
16             break
17     return r
18 # START
19 while i > 0:
20     retour=golievre()
21     #print(retour)
22     if retour==1:
23         lievre+=1
24     i-=1
25 lievre_gagne=lievre
26 tortue_gagne=dep-lievre
27 pourcent=100*lievre_gagne/(tortue_gagne+lievre_gagne)
28 print(lievre, 'sur 1000000', pourcent)
  • Analyse:

Premiers programmes


Quizz

  • Python 2
Création d'un programme Quizz
  • Méthode split
  • Modules
  • Standard library
  • Module.fonction
  • Alias Fonction
  • Bonnes habitudes
  • from "module" import ....
  • module random, fonction choice
  • module string, fonction maketrans

Conversion en Python3

 1 #!/usr/bin/python3
 2 # -*- coding: utf-8 -*-
 3 from random import choice
 4 #from string import maketrans
 5 accents="éèçêàôùû"
 6 asciis="eeceaouu"
 7 conversion=str.maketrans(accents, asciis)
 8 adieu = ['fin', 'stop', 'bye', 'ciao']
 9 reponse = 'X'
10 questions=['Allemagne:Berlin',
11            'Autriche:Vienne',
12            'Belgique:Bruxelle',
13            'Bulgarie:Sofia',
14            'Chypre:Nicosie',
15            'Danemark:Copenhague']
16 print('Donner la capitale du pays....')
17 print('Répondre "fin", "bye", ou "ciao" pour arrêter')
18 while reponse not in adieu:
19     quest=choice(questions)
20     reponse=input(quest.split(':')[0]+'? ').lower()
21     if reponse not in adieu:
22         if reponse.translate(conversion)==quest.split(':')[1].lower():
23             print(':)')
24         else:
25             print("Faux, c'est",quest.split(':')[1])


Structures Conditionnelles

Déterminer si une année saisie par l'utilisateur est bissextile. Il s'agit d'un sujet très prisé des enseignants en informatique quand il s'agit d'expliquer les conditions. Mille pardons, donc, à ceux qui ont déjà fait cet exercice dans un autre langage mais je trouve que ce petit programme reprend assez de thèmes abordés dans ce chapitre pour être réellement intéressant.
Les règles qui déterminent si une année est bissextile ou non.
Une année est dite bissextile si c'est un multiple de 4, sauf si c'est un multiple de 100. Toutefois, elle est considérée comme bissextile si c'est un multiple de 400.
Si une année n'est pas multiple de 4, on s'arrête là, elle n'est pas bissextile.
Si elle est multiple de 4, on regarde si elle est multiple de 100.
Si c'est le cas, on regarde si elle est multiple de 400.
Si c'est le cas, l'année est bissextile.
Sinon, elle n'est pas bissextile.
Sinon, elle est bissextile.
Graphviz.jpg
 1 digraph G {
 2   subgraph cluster_0 {
 3     style=filled;
 4     color=lightgrey;
 5     node [style=filled,color=white];
 6     a0 -> test_multiple4
 7     test_multiple4 -> test_multiple100 [label="oui"]
 8     test_multiple100 -> end_no [label="non"; color="red"]
 9     test_multiple100 -> test_multiple400 [label="oui"]
10     test_multiple400 -> end_yes [label="oui"]
11     test_multiple400 -> end_no [label="non"; color="red"]
12     label = "algorythme";
13   }
14   subgraph cluster_1 {
15     node [style=filled]
16     label = "variables"
17     b0 -> int
18     var_multiple4 -> bool
19     var_multiple100 -> bool
20     var_multiple400 -> bool
21     on [label="O/N"]
22     on -> bool
23     var_multiple4 -> on [ color="blue" ]
24     var_multiple100 -> on [ color="blue" ]
25     var_multiple400 -> on [ color="blue" ]
26     color=blue
27   }
28   a0 [color=yellow; label="Demander l'année"]
29   b0 [label="annee"]
30   test_multiple4 [shape=Mdiamond; color=cyan; label="Est ce un multiple de 4?"]
31   test_multiple100 [shape=Mdiamond; color=cyan; label="Est ce un multiple de 100?"]
32   test_multiple400 [shape=Mdiamond; color=cyan; label="Est ce un multiple de 400?"]
33   var_multiple4 [label="multiple4"] 
34   start [style=filled; shape=Mdiamond; color=bisque; label="Déterminer si une année\nsaisie par l'utilisateur\nest bissextile."];
35   int [style=filled; shape=polygon; color="chocolate1"; label="int"]
36   bool [style=filled; shape=polygon; color="chocolate1"; label="boolean"]
37   end_no [style=filled; shape=Msquare; color=red; label="non"]
38   end_yes [style=filled; shape=Msquare; color=chartreuse; label="Oui"]
39   start -> a0
40   a0 -> b0 [color="blue"]
41   test_multiple4 -> var_multiple4 [color="blue"]
42   test_multiple100 -> var_multiple100 [color="blue"]
43   test_multiple400 -> var_multiple400 [color="blue"]
44   test_multiple4 -> end_no [label="non"; color="red"] 
45 }
  • Ma solution:
 1  #!/usr/bin/python3
 2  # -*- coding: utf-8 -*-
 3  # Variables
 4  annee:int
 5  var_multiple100:bool
 6  multiple4:bool
 7  var_multiple400:bool
 8  on:bool
 9  # Debut
10  annee=int(input("Saisir une année\n"))
11  multiple4 = annee % 4
12  multiple400 = annee % 400
13  multiple100 = annee % 100
14  if multiple4==0 and multiple100!=0 or multiple400==0:
15      print("Bisextile")
16  else:
17      print("Non Bisextile")
  • Correction:
 1  # Programme testant si une année, saisie par l'utilisateur,
 2  # est bissextile ou non
 3  annee = input("Saisissez une année : ") # On attend que l'utilisateur saisisse l'année qu'il désire tester
 4  annee = int(annee) # Risque d'erreur si l'utilisateur n'a pas saisi un nombre
 5  bissextile = False # On crée un booléen qui vaut vrai ou faux
 6                     # selon que l'année est bissextile ou non
 7  if annee % 400 == 0:
 8      bissextile = True
 9  elif annee % 100 == 0:
10      bissextile = False
11  elif annee % 4 == 0:
12      bissextile = True
13  else:
14      bissextile = False
15  if bissextile: # Si l'année est bissextile
16      print("L'année saisie est bissextile.")
17  else:
18      print("L'année saisie n'est pas bissextile.")


La modularité

  • Créer un module qui sera appellé dans un programme principal.
    • multiply.py (Module)
1  """module multiply contenant la fonction table"""
2  def table(nb, max=10):
3     """Fonction affichant la table de multiplication par nb de 1 * nb jusqu'à max * nb"""
4     i = 0
5     while i < max:
6         print(i + 1, "*", nb, "=", (i + 1) * nb)
7         i += 1
    • test.py (Programme principal)
1  #!/usr/bin/python3
2  # -*- coding: utf-8 -*-
3  import os, time
4  from multiply import table
5  # test de la fonction table
6  table(3, 20)
7  #os.system("pause")
8  time.sleep(10)
  • test.py
    • On envoie la valeur 3 dans nb de table
    • On envoie la valeur 20 dans max de table
      • si max n'a pas de valeur, il sera initialisé par défaut à 10
Lien: la modularite

Signature d'une fonction

  • On entend par « signature de fonction » les éléments qui permettent au langage d'identifier ladite fonction.
  • En Python comme vous avez pu le voir, on ne précise pas les types des paramètres.
  • La signature d'une fonction est tout simplement son nom.
  • On ne peut définir deux fonctions du même nom sinon l'ancienne définition est écrasée par la nouvelle.

L'instruction return

1  def carre(valeur):
2     return valeur * valeur
  • L'instruction return signifie qu'on va renvoyer la valeur, pour pouvoir la récupérer ensuite et la stocker dans une variable par exemple.
  • Cette instruction arrête le déroulement de la fonction, le code situé après le return ne s'exécutera pas.

Les fonctions lambda

  • mot-clé: lambda

exemple:

1  >>> lambda x: x * x
2  <function <lambda> at 0x00BA1B70>
3  >>>

Appeler une fonction lambda

1  >>> f = lambda x: x * x
2  >>> f(5)
3  25
4  >>> f(-18)
5  324
6  >>>

autre exemple:

1  >>> lambda x, y: x + y

Résumé

Une fonction est une portion de code contenant des instructions, que l'on va pouvoir réutiliser facilement.
Découper son programme en fonctions permet une meilleure organisation.
Les fonctions peuvent recevoir des informations en entrée et renvoyer une information grâce au mot-clé return.
Les fonctions se définissent de la façon suivante : def nom_fonction(parametre1, parametre2, parametreN):
  • Quelques règles:
    • On peut mettre un module dns le programme source avec def
    • On peut l'importer depuis un autre fichier contenu dans le même répertoire en précisant le nom du fichier (sans l'extension.py).
      • Python va lire (ou créer si il n'existe pas) un fichier.pyc.
      • À partir de la version 3.2, ce fichier se trouve dans un dossier__pycache__.
      • Ce fichier est généré par Python et contient le code compilé du module.

Rendre autonomes les modules appelés

  • Dans l'exemple sur la modularité, il y a deux programmes.
  • Un principal, et un qui contient une fonction.
  • Reprenons le module multiply.py
1  """module multiply contenant la fonction table"""
2  def table(nb, max=10):
3     """Fonction affichant la table de multiplication par nb de 1 * nb jusqu'à max * nb"""
4     i = 0
5     while i < max:
6         print(i + 1, "*", nb, "=", (i + 1) * nb)
7         i += 1
  • Ce module définit une seule fonction,table, qu'il pourrait être bon de tester.
  • Changement effectué:
 1  #!/usr/bin/python3
 2  """module multiply contenant la fonction table"""
 3 
 4  import os
 5 
 6  def table(nb, max=10):
 7     """Fonction affichant la table de multiplication par nb de 1 * nb jusqu'à max * nb"""
 8     i = 0
 9     while i < max:
10         print(i + 1, "*", nb, "=", (i + 1) * nb)
11         i += 1
12 
13  # test de la fonction table
14  if __name__ == "__main__":
15     table(4)
16     os.system("pause")
  • Explications:
    • Le module multiply.py est devenu indépendant avec la variable __name__

Les packages

  • Les modules sont un des moyens de regrouper plusieurs fonctions.
  • Les packages sont un moyen de regrouper plusieurs des modules.
Créer ses propres packages
  • Il faut commencez par créer, dans le même dossier que le programme Python, un répertoire portant le nom du package.
  • Dans le répertoire:
    • mettre les modules et les fichiers à l'extension.py
    • créer des sous-packages de la même façon, en créant un répertoire dans le package
    • __init__.py (Optionnel depuis la version 3.3 de python)

Création d'un programme

1  #!/usr/bin/python3
2  # -*- coding: utf-8 -*-
3  import os # On importe le module os qui dispose de variables 
4            # et de fonctions utiles pour dialoguer avec votre 
5            # système d'exploitation


Graphismes

TK1

 1 #!/usr/bin/python3
 2 # -*- coding: utf-8 -*-
 3 # script bonjour.py
 4 from tkinter import *
 5 # Création de la fenêtre principale (main window)
 6 Mafenetre = Tk()
 7 # Création d'un widget Label (texte 'Bonjour tout le monde !')
 8 Label1 = Label(Mafenetre, text = 'Bonjour tout le monde !', fg = 'red')
 9 # Positionnement du widget avec la méthode pack()
10 Label1.pack()
11 # Création d'un widget Button (bouton Quitter)
12 Bouton1 = Button(Mafenetre, text = 'Quitter', command = Mafenetre.destroy)
13 Bouton1.pack()
14 # Lancement du gestionnaire d'événements
15 Mafenetre.mainloop()
Tk01.jpg




TK2

 1 #!/usr/bin/python3
 2 # script de.py
 3 #(C) Fabrice Sincère
 4 from tkinter import *
 5 import random
 6 def NouveauLance():
 7     nb = random.randint(1,6)
 8     Texte.set('Résultat -> ' + str(nb))
 9 # Création de la fenêtre principale (main window)
10 Mafenetre = Tk()
11 Mafenetre.title('Dé à 6 faces')
12 Mafenetre.geometry('300x100+400+400')
13 # Création d'un widget Button (bouton Lancer)
14 BoutonLancer = Button(Mafenetre, text ='Lancer', command = NouveauLance)
15 # Positionnement du widget avec la méthode pack()
16 BoutonLancer.pack(side = LEFT, padx = 5, pady = 5)
17 # Création d'un widget Button (bouton Quitter)
18 BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)
19 BoutonQuitter.pack(side = LEFT, padx = 5, pady = 5)
20 Texte = StringVar()
21 NouveauLance()
22 # Création d'un widget Label (texte 'Résultat -> x')
23 LabelResultat = Label(Mafenetre, textvariable = Texte, fg ='red', bg ='white')
24 LabelResultat.pack(side = LEFT, padx = 5, pady = 5)
25 Mafenetre.mainloop()
Tk02.jpg






TK3

 1 #!/usr/bin/python3
 2 # script frames.py
 3 #(C) Fabrice Sincère
 4 from tkinter import *
 5 # Création de la fenêtre principale
 6 Mafenetre = Tk()
 7 Mafenetre.title('Frame widget')
 8 Mafenetre['bg']='bisque' # couleur de fond
 9 # création d'un widget Frame dans la fenêtre principale
10 Frame1 = Frame(Mafenetre,borderwidth=2,relief=GROOVE)
11 Frame1.pack(side=LEFT,padx=10,pady=10)
12 # création d'un second widget Frame dans la fenêtre principale
13 Frame2 = Frame(Mafenetre,borderwidth=2,relief=GROOVE)
14 Frame2.pack(side=LEFT,padx=10,pady=10)
15 # création d'un widget Frame... dans un widget Frame
16 # le widget Frame1 est le parent du widget Frame3
17 # le parent du widget Frame1 est le widget Mafenetre (fenêtre principale)
18 Frame3 = Frame(Frame1,bg="white",borderwidth=2,relief=GROOVE)
19 Frame3.pack(side=LEFT,padx=10,pady=10)
20 # création d'un widget Label et d'un widget Button dans un widget Frame
21 Label(Frame1,text="RDV dentiste samedi à 15h").pack(padx=10,pady=10)
22 Button(Frame1,text="Effacer",fg='navy',command=Frame1.destroy).pack(padx=10,pady=10)
23 Label(Frame2,text="Réviser le contrôle d'info").pack(padx=10,pady=10)
24 Button(Frame2,text="Effacer",fg='navy',command=Frame2.destroy).pack(padx=10,pady=10)
25 Label(Frame3,text="RDV dentiste à 10h",bg="white").pack(padx=10,pady=10)
26 Button(Frame3,text="Effacer",fg='navy',command=Frame3.destroy).pack(padx=10,pady=10)
27 Mafenetre.mainloop()
Tk03.jpg








TK4

 1 #!/usr/bin/python3
 2 # script mot_de_passe.py
 3 #(C) Fabrice Sincère
 4 from tkinter import *
 5 from tkinter.messagebox import * # boîte de dialogue
 6 def Verification():
 7     if Motdepasse.get() == 'python27':
 8         # le mot de passe est bon : on affiche une boîte de dialogue puis on ferme la fenêtre
 9         showinfo('Résultat','Mot de passe correct.\nAu revoir !')
10         Mafenetre.destroy()
11     else:
12         # le mot de passe est incorrect : on affiche une boîte de dialogue
13         showwarning('Résultat','Mot de passe incorrect.\nVeuillez recommencer !')
14         Motdepasse.set('')
15 # Création de la fenêtre principale (main window)
16 Mafenetre = Tk()
17 Mafenetre.title('Identification requise')
18 # Création d'un widget Label (texte 'Mot de passe')
19 Label1 = Label(Mafenetre, text = 'Mot de passe ')
20 Label1.pack(side = LEFT, padx = 5, pady = 5)
21 # Création d'un widget Entry (champ de saisie)
22 Motdepasse= StringVar()
23 Champ = Entry(Mafenetre, textvariable= Motdepasse, show='*', bg ='bisque', fg='maroon')
24 Champ.focus_set()
25 Champ.pack(side = LEFT, padx = 5, pady = 5)
26 # Création d'un widget Button (bouton Valider)
27 Bouton = Button(Mafenetre, text ='Valider', command = Verification)
28 Bouton.pack(side = LEFT, padx = 5, pady = 5)
29 Mafenetre.mainloop()
Tk04.jpg












TK5

 1 #!/usr/bin/python3
 2 # script spinbox.py
 3 #(C) Fabrice Sincère
 4 from tkinter import *
 5 def carre():
 6     """ Calcul du carré """
 7     Resultat.set("Carré = "+str(float(Valeur.get())**2))
 8 # Création de la fenêtre principale (main window)
 9 Mafenetre = Tk()
10 Mafenetre.title("Spinbox widget")
11 Valeur = StringVar()
12 Valeur.set(2.0)
13 # Création d'un widget Spinbox
14 boite = Spinbox(Mafenetre,from_=0,to=10,increment=0.5,textvariable=Valeur,width=5,command=carre)
15 boite.pack(padx=30,pady=10)
16 # Création d'un widget Label
17 Resultat = StringVar()
18 carre()
19 Label(Mafenetre,textvariable=Resultat).pack(padx=30,pady=10)
20 Mafenetre.mainloop()
Tk05.jpg








TK6

 1 #!/usr/bin/python3
 2 # script scale.py
 3 #(C) Fabrice Sincère
 4 from tkinter import *
 5 def maj(nouvelleValeur):
 6     # nouvelle valeur en argument
 7     print(nouvelleValeur)
 8 def plus():
 9     Valeur.set(str(int(Valeur.get())+10))
10     print(Valeur.get())
11 def moins():
12     Valeur.set(str(int(Valeur.get())-10))
13     print(Valeur.get())
14 # Création de la fenêtre principale (main window)
15 Mafenetre = Tk()
16 Mafenetre.title("Scale widget")
17 Valeur = StringVar()
18 Valeur.set(50)
19 # Création d'un widget Scale
20 echelle = Scale(Mafenetre,from_=-100,to=100,resolution=10,orient=HORIZONTAL,length=300,width=20,label="Offset",tickinterval=20,variable=Valeur,command=maj)
21 echelle.pack(padx=10,pady=10)
22 # Création d'un widget Button (bouton +)
23 Button(Mafenetre,text="+",command=plus).pack(padx=10,pady=10)
24 # Création d'un widget Button (bouton -)
25 Button(Mafenetre,text="-",command=moins).pack(padx=10,pady=10)
26 Mafenetre.mainloop()
Tk06.jpg
















TK7

 1 #!/usr/bin/python3
 2 # script cercle.py
 3 #(C) Fabrice Sincère
 4 from tkinter import *
 5 import random
 6 def Cercle():
 7     """ Dessine un cercle de centre (x,y) et de rayon r """
 8     x = random.randint(0,Largeur)
 9     y = random.randint(0,Hauteur)
10     r = 20
11     Canevas.create_oval(x-r, y-r, x+r, y+r, outline='blue', fill='blue')
12 def Effacer():
13     """ Efface la zone graphique """
14     Canevas.delete(ALL)
15 # Création de la fenêtre principale (main window)
16 Mafenetre = Tk()
17 Mafenetre.title('Cercle')
18 # Création d'un widget Canvas (zone graphique)
19 Largeur = 480
20 Hauteur = 320
21 Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ='white')
22 Canevas.pack(padx =5, pady =5)
23 # Création d'un widget Button (bouton Go)
24 BoutonGo = Button(Mafenetre, text ='Go', command = Cercle)
25 BoutonGo.pack(side = LEFT, padx = 10, pady = 10)
26 # Création d'un widget Button (bouton Effacer)
27 BoutonEffacer = Button(Mafenetre, text ='Effacer', command = Effacer)
28 BoutonEffacer.pack(side = LEFT, padx = 5, pady = 5)
29 # Création d'un widget Button (bouton Quitter)
30 BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)
31 BoutonQuitter.pack(side = LEFT, padx = 5, pady = 5)
32 Mafenetre.mainloop()
Tk07.jpg






















TK8

 1 #!/usr/bin/python3
 2 # script cible.py
 3 #(C) Fabrice Sincère
 4 from tkinter import *
 5 import random
 6 def Cercle():
 7     """ Dessine un cercle de centre (x,y) et de rayon r """
 8     x = random.randint(0,Largeur)
 9     y = random.randint(0,Hauteur)
10     r = 10
11     # on dessine un cercle dans la zone graphique
12     item = Canevas.create_oval(x-r, y-r, x+r, y+r, outline='black', fill='black')
13     print("Création du cercle (item" , item ,")")
14     # affichage de tous les items de Canevas
15     print(Canevas.find_all())
16 def Undo():
17     """ Efface le dernier cercle"""
18     if len(Canevas.find_all()) > 1:
19         item = Canevas.find_all()[-1]
20         # on efface le cercle
21         Canevas.delete(item)
22         print("Suppression du cercle (item" , item ,")")
23         # affichage de tous les items de Canevas
24         print(Canevas.find_all())
25 def EffacerTout():
26     """ Efface tous les cercles"""
27     while len(Canevas.find_all()) > 1:
28         Undo()
29 # Création de la fenêtre principale (main window)
30 Mafenetre = Tk()
31 Mafenetre.title('Cible')
32 # Image de fond
33 photo = PhotoImage(file="tk_cible.gif")
34 # Création d'un widget Canvas (zone graphique)
35 Largeur = 550
36 Hauteur = 550
37 Canevas = Canvas(Mafenetre,width = Largeur, height =Hauteur)
38 item = Canevas.create_image(0,0,anchor=NW, image=photo)
39 print("Image de fond (item",item,")")
40 Canevas.pack()
41 # Création d'un widget Button
42 BoutonGo = Button(Mafenetre, text ='Tirer', command = Cercle)
43 BoutonGo.pack(side = LEFT, padx = 10, pady = 10)
44 # Création d'un widget Button
45 BoutonEffacer = Button(Mafenetre, text ='Effacer le dernier tir', command = Undo)
46 BoutonEffacer.pack(side = LEFT, padx = 10, pady = 10)
47 # Création d'un widget Button
48 BoutonEffacerTout = Button(Mafenetre, text ='Effacer tout', command = EffacerTout)
49 BoutonEffacerTout.pack(side = LEFT, padx = 10, pady = 10)
50 # Création d'un widget Button (bouton Quitter)
51 BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)
52 BoutonQuitter.pack(side = LEFT, padx = 10, pady = 10)
53 Mafenetre.mainloop()
Tk08.jpg




Sauvegarde

  • Je travaille sur un système Linux, je réinstalle quelques fois mon système.
  • J'ai besoin pour cela de créer une sauvegarde.

Cahier des charges

  • En utilisant au maximum Python, et de façon sécurisée.
  • voici les différentes parties à sauvegarder sur un autre support:
    • /etc
    • /var
    • /home
    • /root
  • Établir la liste de tous les programmes installés pour les réinstaller.
  • Sauvegarder les crontab.

Shell / Python

  • J'ai créé au cours de toutes ces années Linux, plusieurs centaines de scripts shell, des plus rudimentaires aux plus complexes.
  • Un bon exercice sera de les retranscrire tous en Python.
  • Je commencerai par les plus simples, il y a du travail.....

Gestion Système

Intro

  • Le module os est une bibliothèque dédié aux besoins de gestion de fichiers et de dossiers.
  • Pour python un chemin (ou path ), c'est une chaine de caractères, il existe donc des méthodes pour la manipuler:
1 >>> import os.path
2 >>> help(os.path)
abspath(path)             →   Retourne un chemin absolu
basename(p)               →   Retourne le dernier élément d'un chemin
commonprefix(list)        →   Retourne le chemin commun le plus long d'une liste de chemins
dirname(p)                →   Retourne le dossier parent de l'élément
exists(path)              →   Test si un chemin existe
getaTime(filename)        →   Retourne la date du dernier accès au fichier [os.stat()]
getctime(filename)        →   Retourne la date du dernier changement de métadonnées du fichier
getmTime(filename)        →   Retourne la date de la dernière modification du fichier
getsize(filename)         →   Retourne la taille d'un fichier (en octets) 
isabs(s)                  →   Test si un chemin est absolu
isdir(s)                  →   Test si le chemin est un dossier
isfile(path)              →   Test si le chemin est un fichier régulier
islink(path)              →   Test si le chemin est un lien symbolique
ismount(path)             →   Test si le chemin est un point de montage
join(path, s)             →   Ajoute un élément au chemin passé en paramètre
normcase(s)               →   Normalise la casse d'un chemin
normpath(path)            →   Normalise le chemin, élimine les doubles barres obliques, etc.
realpath(filename)        →   Retourne le chemin canonique du nom de fichier spécifié (élimine les liens symboliques)
samefile(f1, f2)          →   Test si deux chemins font référence au même fichier réel
sameopenfile(f1, f2)      →   Test si deux objets de fichiers ouverts font référence au même fichier
split(p)                  →   Fractionne un chemin d'accès. Retourne un tuple
 1 >>> import os
 2 >>> path = "/home/olivier/scripts/cgi-bin/action.py"
 3 >>> os.path.dirname(path)
 4 '/home/olivier/scripts/cgi-bin'
 5 >>> os.path.basename(path)
 6 'action.py'
 7 >>> os.path.join(path, "func")
 8 '/home/olivier/scripts/cgi-bin/action.py/func'
 9 >>> os.path.split(path)
10 ('/home/olivier/scripts/cgi-bin', 'action.py')
11 >>> os.path.abspath(".")
12 '/home/olivier'

Fichiers

  • Commande Linux: ls -rtl
Linux Python
Nom: rtl Nom: rtl.py
#!/bin/sh #!/usr/bin/python3.8
ls -rtl --color import os
os.system('ls -rtl --color')