En pratique : Différence entre versions

De TARENTINO
Aller à la navigationAller à la recherche
Ligne 877 : Ligne 877 :
 
* Sauvegarder les crontab.
 
* Sauvegarder les crontab.
 
== Shell / Python ==
 
== 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.....

Version du 27 mars 2020 à 09:08

Array

test


(Opérateurs:Magenta)
(Méthodes:Green)
(Fonctions:Red)

Accueil
Connexion
Déconnexion
Aide
Admin
Ft.png

En pratique

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

Infos utiles

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

Index des modules d'extension Python

Exercices

Python Niveau 1 (Dominique)

Sommes de 2 nombres

# PROGRAMME sommeNombres
#VAR
nombre1 : int
nombre2 : int
somme : int
#DEBUT
nombre1 = int(input("Saisir le premier nombre : "))
nombre2 = int(input("Saisir le deuxième nombre : "))
somme = nombre1 + nombre2
print("La somme des 2 nombres est : " , somme)
#FIN

Ascenceur 01

# Variables
PorteCabineEstOuverte:bool
lesEtagesEstES:[bool]=[true,
                       true,
                       false,
                       true]
#lesEtagesEstES[1]=false
EntrainementEtatDepl:str        # Arreté
EtageCourant:int
EtageAppel:int
# Debut
EntrainementEtatDepl="Arreté"
EtageCourant=1
#if (EntrainementEtatDepl=="Arreté") :
EtageAppel=int(input("De quel étage appelez vous ? "))
# si EtageCourant < EtageAppel And EntrainementEtatDepl=Arreté and PorteCabineEstOuverte=false
if (EtageAppel > EtageCourant) :
    # descente
    print("Faire monter l'entrainement de la cabine !")
    print("La cabine est en montée et ouverte False à l'étage ", EtageCourant)
else :
    if (EtageAppel < EtageCourant) :
        # si EtageCourant < EtageAppel And EntrainementEtatDepl=Arreté and PorteCabineEstOuverte=true
        # Montée
        print("Faire descendre l'entrainement de la cabine !")
        print("La cabine est en descente et ouverte False à l'étage ", EtageCourant)
    else :
        print("Déjà au bon étage !!!! Faire ouvrir les portes")
    # fin de si
# fin de si
print("La cabine est ",EntrainementEtatDepl, " et ouverte à l'étage ", EtageCourant)
# Fin

Ascenceur 02

""""
NAME        : ascenseur.py
Description : Programme de pilotage d'un ascenseur - V1
"""
# PROGRAMME ascenseur
#
# TYPES
# 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
#
# VAR
etatEntrainement : str = "ARRETE" 		# Déclaration d'une donnée variable de type string et initialisation
										# Un entrainement arrêté
porteCabineEstOuverte : bool = False	# Déclaration d'une donnée variable de type booléen et initialisation
										# Une porte de cabine ouverte
										
										
etageCourantCabine : int = 1			# Déclaration d'une donnée variable de type entier et initialisation
										# Une cabine est à l'étge 1
etageDAppel : int  = -1					# Déclaration d'une donnée
# variable de type entier et initialisation
										# Aucun étage appelé (valeur -1)
lesEtagesEstES : [bool]=[True,True,False,True]

n : int=0

#
# DEBUT
print("	Debut du programme 3")
while n<4 :
	print("L'etage " , n , " est " ,lesEtagesEstES[n])
	n=n+1
print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage", etageCourantCabine)

# L'usager appelle l'ascenseur
etageDAppel = int(input("De quel étage appelez-vous? "))
if (lesEtagesEstES[etageDAppel]==True) :

	if (etageDAppel > etageCourantCabine) :
		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
		etatEntrainement = "EN_MONTEE"
	else :
		if (etageDAppel < etageCourantCabine) :
			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
			etatEntrainement = "EN_DESCENTE"
		else :
			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir la porte
			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
			porteCabineEstOuverte = True
	print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage", etageCourantCabine)

	# Saisie de l'étage auquel arrive la cabine
	if ( etageCourantCabine != etageDAppel) :
		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
		if (etageCourantCabine == etageDAppel) :
			print("FAIRE ARRETER L'ENTRAINEMENT")
			etatEntrainement = "ARRETE"
			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
			porteCabineEstOuverte = True
			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
				  etageCourantCabine)

	# Saisie de l'étage auquel arrive la cabine
	if ( etageCourantCabine != etageDAppel) :
		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
		if (etageCourantCabine == etageDAppel) :
			print("FAIRE ARRETER L'ENTRAINEMENT")
			etatEntrainement = "ARRETE"
			print ("FAIRE OUVRIR LA PORTE DE LA CABINE")
			porteCabineEstOuverte = True
			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
				  etageCourantCabine)

	# Saisie de l'étage auquel arrive la cabine
	if ( etageCourantCabine != etageDAppel) :
		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
		if (etageCourantCabine == etageDAppel) :
			print("FAIRE ARRETER L'ENTRAINEMENT")
			etatEntrainement = "ARRETE"
			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
			porteCabineEstOuverte = True
			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
				  etageCourantCabine)
else :
	print("etage FERME")
print("	Fin du programme")
#
# FIN

Ascenceur 03

""""
NAME        : ascenseur.py
Description : Programme de pilotage d'un ascenseur - V2 - Tableaux, structures, boucles
"""
#
# PROGRAMME ascenseur
# TYPES
from enum import Enum # Truc syntaxique que l'on ne comprend pas encore
class EnumEtatEnt (Enum) :  # Définition d'un type énumération
	ARRETE = 1
	EN_MONTEE = 2
	EN_DESCENTE = 3

class EnumEtatPorte (Enum) :
	FERME = 1
	OUVERT = 2

class EtatCabine (Enum) :
	ARRETE_FERME = 1
	ARRETE_OUVERT = 2
	EN_DESCENTE_FERME = 3
	EN_MONTEE_FERME = 4

#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
#Constante NUM_PORTE_CABINE = 4 - Le numéro de la porte de cabine est 4 (les premiers numéros correspondent à des portes d'étage)

from dataclasses import dataclass # Truc syntaxique que l'on ne comprend pas encore
@dataclass                        # Autre truc syntaxique ...
class Cabine :                    # Définition d'un type structure Cabine
	etat : EtatCabine
	etageCourant : int
	numPorte: int

@dataclass
class Etage :                      # Définition d'un type structure Etage
	estES : bool
	estEteint : bool
	numPorte : int
#
# VAR

def init() :
	print("   L'entrainement est", etatEntrainement)
	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)

etatEntrainement : EnumEtatEnt = EnumEtatEnt.ARRETE 	# Déclaration d'une donnée variable de type énumération et initialisation -
																# 1 entrainement, arrêté
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
																												# 5 portes fermées - 4 portes d'étage et 1 porte de cabine (la dernière)
laCabine : Cabine = Cabine(EtatCabine.ARRETE_FERME, 1, 4)           	# Déclation d'une donnée variable de type structure et initialisation
															# 1 cabine, arrêté fermée, à l'étage 1 et avec la porte 4
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
																									   # 4 étages, chaque étage, en service, éteint, avec une porte de son numéro
etageDAppel : int  = -1 	# Déclaration d'une donnée variable de type entier et initialisation
							# Aucun étage appelé (valeur -1)
#
# DEBUT
print("   Début du programme 9")

# Affichage état de l'ascenseur
# Affichage état complet de la cabine
print("   L'entrainement est", etatEntrainement)
print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)

#Affichage état complet des étages
"""""
numEtage = 0
while numEtage < 4  :# NB_ETAGES
	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
		  "numéro de porte ", lesEtages[numEtage].numPorte,
		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
	numEtage = numEtage + 1
"""	
for numEtage in range(0,4) :
	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
		  "numéro de porte ", lesEtages[numEtage].numPorte,
		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
# L'usager appelle l'ascenseur
etageDAppel = int(input("De quel étage appelez-vous? "))
if lesEtages[etageDAppel].estES :
	if (etageDAppel > laCabine.etageCourant) :
		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
		etatEntrainement = EnumEtatEnt.EN_MONTEE
		laCabine.etat = EtatCabine.EN_MONTEE_FERME
	else :
		if (etageDAppel < laCabine.etageCourant) :
			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
			etatEntrainement = EnumEtatEnt.EN_DESCENTE
			laCabine.etat = EtatCabine.EN_DESCENTE_FERME
		else :
			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir les portes
			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
			laCabine.etat = EtatCabine.ARRETE_OUVERT
	# Affichage état complet de la cabine
	print("   L'entrainement est", etatEntrainement)
	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
	while ( laCabine.etageCourant != etageDAppel) : 	# La cabine n'est pas à l'étage d'appel
		# Saisie de l'étage auquel arrive la cabine
		laCabine.etageCourant = int(input("La cabine arrive à quel étage? "))
		if (laCabine.etageCourant == etageDAppel) :
			print("FAIRE ARRETER L'ENTRAINEMENT")
			etatEntrainement = EnumEtatEnt.ARRETE
			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
			laCabine.etat = EtatCabine.ARRETE_OUVERT
		# Affichage état complet de la cabine
		print("   L'entrainement est", etatEntrainement)
		print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
		print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
else :
	print("   L'appel ne peut être pris en compte car l'étage n'est pas en service")

print("   Fin du programme")
#
# FIN

Ascenceur 04

""""
NAME        : ascenseur.py
Description : Programme "ascenseur", programme de pilotage d'un ascenseur - V3 - Sous-programmes
"""
# PROGRAMME ascenseur
#
# TYPES
from enum import Enum # Truc syntaxique que l'on ne comprend pas encore
class EnumEtatEnt (Enum) :  # Définition d'un type énumération
	ARRETE = 1
	EN_MONTEE = 2
	EN_DESCENTE = 3

class EnumEtatPorte (Enum) :
	FERME = 1
	OUVERT = 2

class EtatCabine (Enum) :
	ARRETE_FERME = 1
	ARRETE_OUVERT = 2
	EN_DESCENTE_FERME = 3
	EN_MONTEE_FERME = 4

#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
#Constante NUM_PORTE_CABINE = 4 - Le numéro de la porte de cabine est 4 (les premiers numéros correspondent à des portes d'étage)

from dataclasses import dataclass # Truc syntaxique que l'on ne comprend pas encore
@dataclass                        # Autre truc syntaxique ...
class Cabine :                    # Définition d'un type structure Cabine
	etat : EtatCabine
	etageCourant : int
	numPorte: int

@dataclass
class Etage :                      # Définition d'un type structure Etage
	estES : bool
	estEteint : bool
	numPorte : int
#
# VAR
etatEntrainement : EnumEtatEnt = EnumEtatEnt.ARRETE 	# Déclaration d'une donnée variable de type énumération et initialisation -
																# 1 entrainement, arrêté
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
																												# 5 portes fermées - 4 portes d'étage et 1 porte de cabine (la dernière)
laCabine : Cabine = Cabine(EtatCabine.ARRETE_FERME, 1, 4)           	# Déclation d'une donnée variable de type structure et initialisation
															# 1 cabine, arrêté fermée, à l'étage 1 et avec la porte 4
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
																									   # 4 étages, chaque étage, en service, éteint, avec une porte de son numéro
etageDAppel : int  = -1 	# Déclaration d'une donnée variable de type entier et initialisation
							# Aucun étage appelé (valeur -1)
#
# SOUS-PROGRAMME afficherEtatCompletCabine
def afficherEtatCompletCabine() :
	# DEBUT
	print("   L'entrainement est", etatEntrainement)
	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
	# FIN
# FIN SOUS-PROGRAMME
#
# SOUS-PROGRAMME calculerEtatCabine - retourne une valeur de type EtatCabine
def calculerEtatCabine() :
	# VAR LOC
	result : EtatCabine
	# DEBUT
	if (etatEntrainement == EnumEtatEnt.ARRETE ) :
		if (lesEtatPortes[laCabine.numPorte] == EnumEtatPorte.FERME) :
			result = EtatCabine.ARRETE_FERME
		else :
			result = EtatCabine.ARRETE_OUVERT
	elif (etatEntrainement == EnumEtatEnt.EN_DESCENTE ) :
		result = EtatCabine.EN_DESCENTE_FERME
	else :
		result = EtatCabine.EN_MONTEE_FERME
	return result
	# FIN
# FIN SOUS-PROGRAMME

# DEBUT
print("   Début du programme 10")
# Affichage état de l'ascenseur
# Affichage état complet de la cabine
afficherEtatCompletCabine()
#Affichage état complet des étages
for numEtage in range(0,4) :
	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
		  "numéro de porte ", lesEtages[numEtage].numPorte,
		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
# L'usager appelle l'ascenseur
etageDAppel = int(input('De quel étage appelez-vous? '))
if lesEtages[etageDAppel].estES :
	if (etageDAppel > laCabine.etageCourant) :
		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
		etatEntrainement = EnumEtatEnt.EN_MONTEE
		laCabine.etat = calculerEtatCabine()
	else :
		if (etageDAppel < laCabine.etageCourant) :
			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
			etatEntrainement = EnumEtatEnt.EN_DESCENTE
			laCabine.etat = calculerEtatCabine()
		else :
			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir les portes
			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
			laCabine.etat = calculerEtatCabine()
	# Affichage état complet de la cabine
	afficherEtatCompletCabine()
	while ( laCabine.etageCourant != etageDAppel) : 	# La cabine n'est pas à l'étage d'appel
		# Saisie de l'étage auquel arrive la cabine
		laCabine.etageCourant = int(input('La cabine arrive à quel étage? '))
		if (laCabine.etageCourant == etageDAppel) :
			print("FAIRE ARRETER L'ENTRAINEMENT")
			etatEntrainement = EnumEtatEnt.ARRETE
			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
			laCabine.etat = calculerEtatCabine()
		# Affichage état complet de la cabine
		afficherEtatCompletCabine()
else :
	print("	l'appel ne peut être pris en compte car l'étage n'est pas en service")

print("   Fin du programme")
#
# FIN


Python Niveau 2 (Alex)

Exercice Hello Word

  • Sans commentaire, si tu n'y arrives pas alors laisses tomber Python....
#!/usr/bin/env python3
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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
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

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
nb_entier = 42
print(type(nb_entier))
nb_long = 300000000000
print(type(nb_long))
nb_complexe = 2+4j
print(type(nb_complexe))
# Changement dynamique de type
for nb in range(20):
    nb2 = nb ** nb
    print(nb2, type(nb2))
# Modulo
print("9 % 5 =", 9 % 5)
# Puissance
print("2 ** 4 =", 2 ** 4)
print('=' * 20)
# Constructeurs
nb = int("42")
print(nb, type(nb))
nb = float("42.123")
print(nb, type(nb))
nb = complex("2+5j")
print(nb, type(nb))
print('=' * 20)
print(hex(456))
print(oct(456))
print(bin(456))
print('=' * 20)
print(chr(65))
print(ord('A'))
  • Analyse:

Chaine

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
ch = "Une chaine double quote peut contenir des ' "
ch2 = 'Une chaine simple quote peut contenir des " '
ch3 = """Une chaine
qui s'etend
sur
plusieurs lignes"""
ch4 = "on peut mettre antislash pour afficher une \" dans une chaine double quote"
print(ch, type(ch))
print(ch2, type(ch2))
print(ch3, type(ch3))
print(ch4, type(ch4))
print('=' * 20)
# Unicode
ch_sans_unicode = "été"
ch_avec_unicode = "été"
print(ch_sans_unicode, type(ch_sans_unicode))
print(ch_avec_unicode, type(ch_avec_unicode))
print("Taille de la chaine ch_sans_unicode:", len(ch_sans_unicode))
print("Taille de la chaine ch_avec_unicode:", len(ch_avec_unicode))
print('=' * 20)
# Chaine raw
ch_sans_raw = 'une chaine\tavec\ndes caractères spéciaux'
ch_avec_raw = r'une chaine\tavec\ndes caractères spéciaux'
print(ch_sans_raw, type(ch_sans_raw))
print(ch_avec_raw, type(ch_avec_raw))
print('=' * 20)
ch = "bonjour tout le monde"
print("ch:", ch)
# Indicage
print("ch[2]:", ch[2])
print("ch[-2]:", ch[-2])
# Tranches de valeurs
print("ch[3:5]:", ch[3:5])
print("ch[-8:-2]:", ch[-8:-2])
print("ch[3:-2]:", ch[3:-2])
print("ch[3:]:", ch[3:])
print("ch[:-2]:", ch[:-2])
# Multiplication d'une chaine par un entier
ch2 = 'hello' * 4
print(ch2)
# On peut itérer sur une séquence
for car in ch:
    print(car)
# Concaténation
ch3 = ch + ch2
print(ch3)
# Appartenance
print("'xyz' in 'bonjour' ?", 'xyz' in 'bonjour')
print("'njo' in 'bonjour' ?", 'njo' in 'bonjour')
print('=' * 20)
# Masque d'affichage
notes = "Eleve: %-10s    Age: %2d   Note: %5.2f"
print("Masque:", notes)
print("Note Bart:", notes % ('Bart', 10, 5.55))
# Masque d'affectation
note_lisa = notes % ('Lisa', 12, 18.42)
print("note_lisa:", note_lisa)
print('=' * 20)
liste = [   ('Bart', 10, 1.23),
            ('Lisa', 12, 19.99),
            ('Homer', 42, 0.1)
        ]
for prenom, age, note in liste:
    print(notes % (prenom, age, note))
print('=' * 20)
for var in liste:
    print(var, type(var))
    #print(notes % (var[0], var[1], var[2]))
    print(notes % var)
# Test d'égalité : ==
ch = 'hello'
ch2 = 'hello'
print("ch == ch2 ?", ch == ch2)
# S'agit-il du même objet en mémoire : is
print("ch is ch2 ?", ch is ch2)
print('=' * 20)
# La classe chaine de caractères fournit un ensemble de méthodes
print("ch.upper():", ch.upper())
print("ch.center(40):", ch.center(40,'*'))
print('=' * 20)
# split
ch = "bonjour    tout  le          monde"
print("ch.split()", ch.split())
print("ch.split(' ')", ch.split(' '))
print("ch.split('o')", ch.split('o'))
print('=' * 20)
# replace
ch2 = ch.replace('o', 'X')
print("ch2:", ch2)
print("ch (non modifiée):", ch)
ch2 = ch.replace('jour', 'soir')
print("ch2:", ch2)
print('=' * 20)
# find
print("'ou' apparait a la position:", ch.find('ou'))
print('=' * 20)
# format
print("info: {0} {1} {2} {1} {0}".format('a', 'b', 'c'))
print('=' * 20)
# Espace de noms du programme principal
print(dir())
print('=' * 20)
# Attributs et méthodes d'une classe d'objet, ex. une chaine
print(dir(''))
print('=' * 20)
# Les chaines documentaires
def fct():
    "Ceci est la documentation de ma fonction"
    pass
print("Doc de la fonction fct():", fct.__doc__)
print('=' * 20)
print("Documentation de la classe str():", str.__doc__)
print('=' * 20)
print("Documentation de la méthode split de la classe str():", str.split.__doc__)
print('=' * 20)
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
# loto_01.py
import random
nb_boules=49
boules = [ x for x in range(1,nb_boules+1) ]
tirage = []
for boule in range(5):
    une_boule = boules[ random.randint(1,len( boules )) - 1 ]
    tirage.append( une_boule )
    boules.remove(une_boule)
chance = random.randint(1,10)
print(tirage, chance)
tirage.sort()
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.
# loto_02.py
# v2: on utilise une Classe
""" Un module pour gerer des tirages de Loto """
import random

class Loto:
    """ Permet d'instancier des tirages de Loto """
    nb_boules=49
    les_tirages = []

    def __init__(self, num_tirage):
        """ Cree un tirage [num, les 5 boules, numero change]) """
        tirage_5_boules = []
        boules = [ x for x in range(1,Loto.nb_boules+1) ]
        for boule in range(5):
            une_boule = boules[ random.randint(1,len( boules )) - 1 ]
            tirage_5_boules.append( une_boule )
            boules.remove(une_boule)

        chance = random.randint(1,10)
        tirage_5_boules .sort()
        self.num = num_tirage
        self.cinqBoules = tirage_5_boules
        self.chance = chance
        Loto.les_tirages.append( self )

    def __str__(self):
        """ conversion d'un tirage en chaine """
        ch = "Numero: " + str(self.num) + " ,5 boules: "
        for i in range(5): ch += str( self.cinqBoules[i] ) + " - "
        ch += " ,Numero chance: "+ str(self.chance)
        return ch

    @classmethod
    def getUnTirage(cls, num ):
        """ Exemple de methode de classe """
        for t in cls.les_tirages:
            if t.num == num: return t
    return None

    if __name__ == "__main__":
        num = 100
        for i in range(5):
            un_tirage = Loto(num+i)
        le_dernier_tirage = un_tirage
        for t in Loto.les_tirages:
            print( t.num, t.cinqBoules, t.chance)

        print("Dernier: %s\n" % (str(le_dernier_tirage) ))
        try:
            num = int( input("Numero de tirage ? ") )
        except:
            print("ERREUR: saisie incorrect")
        else:
            print("Tirage 103: %s\n" % (str( Loto.getUnTirage( num ) ) ) )

Probabilité course lièvre/tortue

  • Main
import lievre.py
nb_coup:int=1000000
i:int=0
while i < nb_coup:
    lievre.py
    i=i+1
  • lievre2.py
###### lievre2.py: le lievre et la tortue
from random import *
total= 0
unGagnant = False
gagnant = None
while not unGagnant:
    de = randint(1,6)
    print ("Valeur du lance: ", de )
    total = total + de
    if de == 6 :
        gagnant = "Lievre"
        unGagnant = True
    elif total >= 6:
        gagnant = "Tortue"
        unGagnant = True
print ("Gagnant: ", gagnant )
  • Tortue.py
from random import *
lievre:int=0
i:int=1000000
dep=i
r:int=0
def golievre():
    total= 0
    while True:
        de = randint(1,6)
        if de == 6 :
            r=1
            break
        total = total + de
        if total >= 6:
            r=0
            break
    return r
# START
while i > 0:
    retour=golievre()
    #print(retour)
    if retour==1:
        lievre+=1
    i-=1
lievre_gagne=lievre
tortue_gagne=dep-lievre
pourcent=100*lievre_gagne/(tortue_gagne+lievre_gagne)
print(lievre, 'sur 1000000', pourcent)
  • Analyse:

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.....