Cours-Gratuit
  • Accueil
  • Blog
  • Cours informatique
home icon Cours gratuits » Cours informatique » Cours programmation » Cours Python

Cours pour apprendre Python

Cours pour apprendre Python
Participez au vote ☆☆☆☆☆★★★★★

Chapitre 1 - Variables, types et opérateurs

Une variable est un espace mémoire dans lequel il est possible de stocker une valeur (une donnée).

Ouvrir IDLE :

Démarrer → Programmes → Python → IDLE (Python GUI)

 

0- Noms de variables

Le nom d'une variable s'écrit avec des lettres (non accentuées), des chiffres ou bien l'underscore _

Le nom d'une variable ne doit pas commencer par un chiffre.

En langage Python, l'usage est de ne pas utiliser de lettres majuscules pour nommer les variables (celles-ci sont réservées pour nommer les classes).

Exemple : age, mon_age, temperature1

A éviter : Age, AGE, MonAge, monAge, Temperature1

1- Le type int (integer : nombres entiers)

Pour affecter (on dit aussi assigner) la valeur 17 à la variable nommée age :

>>> age = 17

La fonction print() affiche la valeur de la variable :

>>> print(age)

17

La fonction type() retourne le type de la variable :

>>> print(type(age))

<class 'int'>

int est le type des nombres entiers.

>>> # ceci est un commentaire

>>> age = age + 1    # en plus court : age += 1

>>> print(age)

18

>>> age = age - 3    # en plus court : age -= 3

>>> print(age)

15

>>> age = age*2      # en plus court : age *= 2

>>> print(age)

30

>>> a = 6*3 - 20

>>> print(a)

-2

>>> b = 25

>>> c = a + 2*b

>>> print(b, c)          # ne pas oublier la virgule 25 48

L'opérateur // donne la division entière :

>>> tour = 450//360

>>> print(tour)

1

L'opérateur % donne le reste de la division (opération modulo) :

>>> angle = 450%360

>>> print(angle)

90

L'opérateur ** donne la puissance :

>>> mo = 2**20

>>> print(mo)

1048576

>>> racine2 = 2**0.5

>>> print(racine2)

1.41421356237

2- Le type float (nombres en virgule flottante)

>>> b = 17.0 # le séparateur décimal est un point (et non une virgule)

>>> print(b)

17.0

>>> print(type(b))

<class 'float'>

>>> c = 14.0/3.0

>>> print(c)

4.66666666667

>>> c = 14.0//3.0    # division entière

>>> print(c)

4.0

Attention : avec des nombres entiers, l'opérateur / fait une division classique et retourne un type float :

>>> c = 14/3 >>> print(c)

4.66666666667

Notation scientifique :

>>> a = -1.784892e4

>>> print(a)

-17848.92

Les fonctions mathématiques

Pour utiliser les fonctions mathématiques, il faut commencer par importer le module math :

>>> import math

La fonction dir() retourne la liste des fonctions et données d'un module :

>>> dir(math)

['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan',

'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf',

'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum',

'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p',

'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

Pour appeler une fonction d'un module, la syntaxe est la suivante : module.fonction(arguments)

Pour accéder à une donnée d'un module :

>>> print()   # donnée pi du module math (nombre pi)

3.14159265359

>>> print(()) # fonction sin() du module math (sinus)

0.707106781187

>>> print((2.0)) # fonction sqrt() du module math (racine carrée)

1.41421356237

>>> print((-5.0))

Traceback (most recent call last):

    print (-5.0) ValueError: math domain error

>>> print((-3.0)) # fonction exp() du module math (exponentielle)

0.0497870683679

>>> print((math.e)) # fonction log() du module math (logarithme népérien)

1.0

3- Le type str (string : chaîne de caractères)

>>> nom = 'Dupont' # entre apostrophes

>>> print(nom)

Dupont

>>> print(type(nom))

<class 'str'>

>>> prenom = "Pierre"    # on peut aussi utiliser les guillemets >>> print(prenom)

Pierre

>>> print(nom, prenom)   # ne pas oublier la virgule Dupont Pierre

La concaténation désigne la mise bout à bout de plusieurs chaînes de caractères.

La concaténation utilise l'opérateur +

>>> chaine = nom + prenom # concaténation de deux chaînes de caractères

>>> print(chaine)

DupontPierre

>>> chaine = prenom + nom # concaténation de deux chaînes de caractères

>>> print(chaine)

PierreDupont

>>> chaine = prenom + ' ' + nom

>>> print(chaine)

Pierre Dupont

>>> chaine = chaine + ' 18 ans'# en plus court : chaine += ' 18 ans'

>>> print(chaine)

Pierre Dupont 18 ans

La fonction len() retourne la longueur (length) de la chaîne de caractères :

>>> print(len(chaine))

20

Indexage et slicing :

>>> print(chaine[0])     # premier caractère (indice 0)

P

>>> print(chaine[1]) # deuxième caractère (indice

1) i

>>> print(chaine[1:4])   # slicing ier

>>> print(chaine[2:])    # slicing erre Dupont 18 ans

>>> print(chaine[-1])      # dernier caractère

(indice -1) s

>>> print(chaine[-6:])    # slicing

18 ans

En résumé :

 +---+---+---+---+---+---+

 | M | u | r | i | e | l |

 +---+---+---+---+---+---+

 0   1   2   3   4   5   6

-6  -5  -4  -3  -2  -1

>>> chaine = 'Aujourd'

SyntaxError: invalid syntax

hui

'

 

>>> chaine  = 'Aujourd\'hui' d'échappement \'

>>> print(chaine)

Aujourd'hui

>>> chaine  = "Aujourd'hui"

>>> print(chaine)

Aujourd'hui

# séquence

       

La séquence d'échappement \n représente un saut ligne :

>>> chaine = 'Première ligne\nDeuxième ligne'

>>> print(chaine)

Première ligne

Deuxième ligne

Plus simplement, on peut utiliser les triples guillemets (ou les triples apostrophes) pour encadrer une chaîne définie sur plusieurs lignes :

>>> chaine = """Première ligne

Deuxième ligne""" >>> print(chaine)

Première ligne

Deuxième ligne

On ne peut pas mélanger les serviettes et les torchons (ici type str et type int) :

>>> chaine = '17.45'

>>> print(type(chaine)) <class 'str'>

>>> chaine = chaine + 2

TypeError: Can't convert 'int' object to str implicitly

La fonction float() permet de convertir un type str en type float

>>> nombre = float(chaine)

>>> print(nombre)

17.45

>>> print(type(nombre)) <class 'float'>

>>> nombre = nombre + 2 nombre += 2 >>> print(nombre)

19.45

# en plus court :

La fonction input() lance une invite de commande (en anglais : prompt) pour saisir une chaîne de caractères.

>>> # saisir une chaîne de caractères et valider avec la touche Enter

>>> chaine = input("Entrer un nombre : ")

Entrer un nombre : 14.56

>>> print(chaine)

14.56

>>> print(type(chaine))

<class 'str'>

>>> nombre = float(chaine)# conversion de type

>>> print(nombre**2)

211.9936

4- Le type list (liste)

Une liste est une structure de données.

Le premier élément d'une liste possède l'indice (l'index) 0.

Dans une liste, on peut avoir des éléments de plusieurs types.

>>> infoperso = ['Pierre', 'Dupont', 17, 1.75,

72.5]

>>> # la liste infoperso contient 5 éléments de types str, str, int, float et float

>>> print(type(infoperso))

<class 'list'>

>>> print(infoperso)

['Pierre', 'Dupont', 17, 1.75, 72.5]

>>> print('Prénom : ', infoperso[0])

#

premier élément (indice 0)

Prénom :  Pierre

>>> print('Age : ', infoperso[2])

# le

troisième élément a l'indice 2

Age :  17

>>> print('Taille : ', infoperso[3]) quatrième élément a l'indice 3

Taille :  1.75

# le

La fonction range() crée une liste d'entiers régulièrement espacés :

>>> maliste = range(10)

>>> print(list(maliste))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> print(type(maliste))

<class 'range'>

>>> maliste = range(1,10,2)

# range(début,fin

non comprise,intervalle) >>> print(list(maliste))

[1, 3, 5, 7, 9]

>>> print(maliste[2]) élément a l'indice 2

5

# le troisième

On peut créer une liste de listes, qui s'apparente à un tableau à 2 dimensions (ligne, colonne) :

 0  1  2

10 11 12

20 21 22

>>> maliste = [[0, 1, 2], [10, 11, 12], [20, 21, 22]]

>>> print(maliste[0])

[0, 1, 2]

>>> print(maliste[0][0])

>>> print(maliste[2][1]) # élément à la troisième ligne et deuxième colonne

21

>>> maliste[2][1] = 69   # nouvelle affectation >>> print(maliste)

[[0, 1, 2], [10, 11, 12], [20, 69, 22]]

5- Le type bool (booléen)

Deux valeurs sont possibles : True et False

>>> choix = True

>>> print(type(choix))

<class 'bool'>

Les opérateurs de comparaison :

Opérateu

r

Signification

Remarques

< 

strictement inférieur

 

<=

inférieur ou égal

 

> 

strictement supérieur

 

>=

supérieur ou égal

 

==

égal

Attention : deux signes ==

!=

différent

 

>>> b = 10

>>> print(b > 8)

True

>>> print(b == 5)

False

>>> print(b != 10)

False

>>> print(0 <= b <= 20)

True

Les opérateurs logiques : and, or, not

>>> note = 13.0

>>> mention_ab = note >= 12.0 and note < 14.0 # ou bien : mention_ab = 12.0 <= note < 14.0

>>> print(mention_ab)

True

>>> print(not mention_ab)

False

>>> print(note == 20.0 or note == 0.0)

False

L'opérateur in s'utilise avec des chaînes (type str) ou des listes (type list) :

>>> chaine = 'Bonsoir'

>>> # la sous-chaîne 'soir' fait-elle partie de la chaîne 'Bonsoir' ?

>>> resultat = 'soir' in chaine

>>> print(resultat)

True

>>> print('b' in chaine) False

>>> maliste = [4, 8, 15]

>>> # le nombre entier 9 est-il dans la liste ?

>>> print(9 in maliste)

False

>>> print(8 in maliste)

True

>>> print(14 not in maliste)

True

6- Le type dict (dictionnaire)

Un dictionnaire stocke des données sous la forme clé ⇒ valeur

Une clé est unique et n'est pas nécessairement un entier (comme c'est le cas de l'indice d'une liste).

>>> moyennes = {'math': 12.5, 'anglais': 15.8} # entre accolades

>>> print(type(moyennes))

<class 'dict'>

>>> print(moyennes['anglais'])   # entre crochets

15.8

>>> moyennes['anglais'] = 14.3   # nouvelle affectation >>> print(moyennes)

{'anglais': 14.3, 'math': 12.5}

>>> moyennes['sport'] = 11.0 # nouvelle entrée

>>> print(moyennes)

{'sport': 11.0, 'anglais': 14.3, 'math': 12.5}

7- Autres types

Nous avons vu les types les plus courants. Il en existe bien d'autres :

§  complex (nombres complexes, par exemple 1+2.5j)

§  tuple (structure de données)

§  set (structure de données)

§  file (fichiers)

§ 

8- Programmation Orientée Objet (POO)

Python est un langage de programmation orienté objet (comme les langages C++, Java, PHP, Ruby ).

Une variable est en fait un objet d'une certaine classe.

Par exemple, la variable amis est un objet de la classe list.

On dit aussi que la variable amis est une instance de la classe list. L'instanciation (action d'instancier) est la création d'un objet à partir d'une classe (syntaxe : NouvelObjet = NomdelaClasse(arguments)) :

>>> # instanciation de l'objet amis de la classe list

>>> amis = ['Nicolas', 'Julie']# ou bien : amis = list(['Nicolas', 'Julie'])

>>> print(type(amis))

<class 'list'>

Une classe possède des fonctions que l'on appelle méthodes et des données que l'on appelle attributs.

La méthode append() de la classe list ajoute un nouvel élément en fin de liste :

>>> # instanciation d'une liste vide

>>> amis = []              # ou bien : amis = list()

>>> amis.append('Nicolas')# synthase générale : objet.méthode(arguments)

>>> print(amis)

['Nicolas']

>>> amis.append('Julie') # ou bien : amis = amis + ['Julie']

>>> print(amis)

['Nicolas', 'Julie']

>>> amis.append('Pauline')

>>> print(amis)

['Nicolas', 'Julie', 'Pauline']

>>> ()  # la méthode sort() trie les éléments >>> print(amis)

['Julie', 'Nicolas', 'Pauline']

>>> amis.reverse()   # la méthode reverse() inverse la liste des éléments

>>> print(amis)

['Pauline', 'Nicolas', 'Julie']

La méthode lower() de la classe str retourne la chaîne de caractères en casse minuscule :

>>> # la variable chaine est une instance de la classe str

>>> chaine = "BONJOUR"   # ou bien : chaine = str("BONJOUR")

>>> chaine2 = chaine.lower() # on applique la méthode lower() à l'objet chaine

>>> print(chaine2) bonjour

>>> print(chaine)

BONJOUR

La méthode pop() de la classe dict supprime une clé :

>>> # instanciation de l'objet moyennes de la classe dict

>>> moyennes = {'sport': 11.0, 'anglais': 14.3, 'math': 12.5}

>>> # ou : moyennes = dict({'sport': 11.0,

'anglais': 14.3, 'math': 12.5})

>>> ('anglais')

14.3

>>> print(moyennes)

{'sport': 11.0, 'math': 12.5}

>>> print(())   # la méthode keys() retourne la liste des clés dict_keys(['sport', 'math'])

>>> print(moyennes.values()) # la méthode values() retourne la liste des valeurs dict_values([11.0, 12.5])

Exercices

Exercice 1.1 ☆ Afficher la taille en octets et en bits d'un fichier de 536 ko.

On donne : 1 ko (1 kilooctet) = 210 octets !!!

1 octet = 1 byte = 8 bits

Exercice 1.2 ★ Le numéro de sécurité sociale est constitué de 13 chiffres auquel s'ajoute la clé de contrôle (2 chiffres).

Exemple : 1 89 11 26 108 268 91

La clé de contrôle est calculée par la formule : 97 - (numéro de sécurité sociale modulo 97)

Retrouver la clé de contrôle de votre numéro de sécurité sociale. Quel est l'intérêt de la clé de contrôle ?

Exercice 1.3 ★ Afficher la valeur numérique de √(4,63 - 15/16) Comparer avec votre calculette.

Exercice 1.4 ★ A partir des deux variables prenom et nom, afficher les initiales (par exemple LM pour Léa Martin).

Exercice 1.5 ★☆ L'identifiant d'accès au réseau du lycée est construit de la manière suivante : initiale du prénom puis les 8 premiers caractères du nom (le tout en minuscule).

Exemple : Alexandre Lecouturier → alecoutur

A partir des deux variables prenom et nom, construire l'identifiant.

Exercice 1.6 ★★ On donne un extrait des logins d'accès au réseau du lycée :

alecoutur  Huz4 lmartin    monty fsincere   gnugpl

1)  Créer une variable de type dict qui contient les couples identifiant - mot de passe ci-dessus.

2)  La saisie du login fournit deux

variables identifiant et motdepasse : une pour l'identifiant et l'autre pour le mot de passe.

Construire une variable booléenne qui donne True en cas d'identification correcte, et False dans le cas contraire :

lmartin monty → True alecoutur fqsdf → False

martin monty → False (ce cas est plus compliqué à traiter)

Chapitre 2 - Les conditions

L'instruction if

 

Syntaxe

if expression:

# ne pas oublier le signe

de ponctuation ':'

# attention à

bloc d'instructions

l'indentation # suite du programme

 

Si l'expression est vraie (True) alors le bloc d'instructions est exécuté. Si l'expression est fausse (False) on passe directement à la suite du programme.

Premier script

Nous allons commencer par créer le script :

Ouvrir IDLE :

Démarrer → Programmes → Python → IDLE (Python GUI)

File → New Window

Copier puis coller le code source ci-dessous :

# script

chaine = input("Note sur 20 : ") note = float(chaine) if note >= 10.0:

    # ce bloc est exécuté si l'expression (note >=

10.0) est vraie     print("J'ai la moyenne") print("Fin du programme")

File → Save As

Répertoire : C:\PythonXX

Nom du fichier :

Pour exécuter le script :

Run → Run Module (ou touche F5) :

>>> 

Note sur 20 : 16 J'ai la moyenne

Fin du programme

>>> 

Note sur 20 : 5 Fin du programme

L'instruction else

Une instruction else est toujours associée à une instruction if

Syntaxe

if expression:

# attention à

bloc d'instructions 1

l'indentation

 

else:

# else est au même niveau

que if

# attention à

bloc d'instructions 2

l'indentation # suite du programme

 
       

Si l'expression est vraie (True) alors le bloc d'instructions 1 est exécuté. Si l'expression est fausse (False) alors c'est le bloc d'instructions 2 qui est

exécuté.

# script

chaine = input("Note sur 20 : ") note = float(chaine) if note >= 10.0:

    # ce bloc est exécuté si l'expression (note >=

10.0) est vraie     print("J'ai la moyenne") else:

    # ce bloc est exécuté si l'expression (note >=

10.0) est fausse     print("C'est en dessous de la moyenne") print("Fin du programme")

>>> 

Note sur 20 : 15 J'ai la moyenne

Fin du programme

>>> 

Note sur 20 : 8.5

C'est en dessous de la moyenne

Fin du programme >>>

Note sur 20 : 56

J'ai la moyenne

Fin du programme

Pour traiter le cas des notes invalides (<0 ou >20), on peut imbriquer des instructions conditionnelles :

# script

chaine = input("Note sur 20 : ") note = float(chaine) if note > 20.0 or note < 0.0:

    # ce bloc est exécuté si l'expression (note >

20.0 or note < 0.0) est vraie     print("Note invalide !") else:

    # ce bloc est exécuté si l'expression (note >

20.0 or note < 0.0) est fausse     if note >= 10.0:

        # ce bloc est exécuté si l'expression (note

>= 10.0) est vraie         print("J'ai la moyenne")     else:

        # ce bloc est exécuté si l'expression (note

>= 10.0) est fausse         print("C'est en dessous de la moyenne") print("Fin du programme")

>>> 

Note sur 20 : 56 Note invalide !

Fin du programme

>>> 

Note sur 20 : 14.6

J'ai la moyenne

Fin du programme

On ajoute encore un niveau d'imbrication pour traiter les cas particuliers 0 et 20 :

# script

chaine = input("Note sur 20 : ") note = float(chaine) if note > 20.0 or note < 0.0:     print("Note invalide !") else:     if note >= 10.0:

        print("J'ai la moyenne")         if note == 20.0:

            # ce bloc est exécuté si l'expression

(note == 20.0) est vraie             print("C'est même excellent !")     else:

        print("C'est en dessous de la moyenne")         if note == 0.0:

            # ce bloc est exécuté si l'expression

(note == 0.0) est vraie             print(" lamentable !") print("Fin du programme")

>>> 

Note sur 20 : 20

J'ai la moyenne

C'est même excellent !

Fin du programme

>>> 

Note sur 20 : 3

C'est en dessous de la moyenne

Fin du programme

L'instruction elif

Une instruction elif (contraction de else if) est toujours associée à une instruction if

Syntaxe

if expression 1:

bloc d'instructions 1  expression 2:

bloc d'instructions 2  expression 3:

bloc d'instructions 3 # ici deux instructions

f, mais il n'y a pas de limitation

: bloc d'instructions 4

# suite du programme

elif

elif

eli else

 

Si l'expression 1 est vraie alors le bloc d'instructions 1 est exécuté, et on passe à la suite du programme.

Si l'expression 1 est fausse alors on teste l'expression 2 :

§  si l'expression 2 est vraie on exécute le bloc d'instructions 2, et on passe à la suite du programme.

§  si l'expression 2 est fausse alors on teste l'expression 3, etc.

Le bloc d'instructions 4 est donc exécuté si toutes les expressions sont fausses (c'est le bloc "par défaut").

Parfois il n'y a rien à faire.

Dans ce cas, on peut omettre l'instruction else :

if expression 1:

bloc d'instructions 1  expression 2:

bloc d'instructions 2  expression 3:

bloc d'instructions 3

# suite du programme

elif

elif

 

L'instruction elif évite souvent l'utilisation de conditions imbriquées (et souvent compliquées).

Exemple

# script

# ce script fait la même chose que

note = float(input("Note sur 20 : ")) if note == 0.0:

    print("C'est en dessous de la moyenne")     print(" lamentable !") elif note == 20.0:

    print("J'ai la moyenne")     print("C'est même excellent !") elif note < 10.0 and note > 0.0: # ou bien : elif 0.0 < note < 10.0:

    print("C'est en dessous de la moyenne") elif note >= 10.0 and note < 20.0: # ou bien : elif 10.0 <= note < 20.0:     print("J'ai la moyenne") else:

    print("Note invalide !") print("Fin du programme")

>>> 

Note sur 20 : 20

J'ai la moyenne

C'est même excellent !

Fin du programme

>>> 

Note sur 20 : 3

C'est en dessous de la moyenne

Fin du programme

>>> 

Note sur 20 : 77 Note invalide !

Fin du programme

Exercices

Exercice 2.1 ★ Le numéro de sécurité sociale est constitué de 13 chiffres auquel s'ajoute la clé de contrôle (2 chiffres).

La clé de contrôle est calculée par la formule : 97 - (numéro de sécurité sociale modulo 97)

Ecrire un script qui contrôle la validité d'un numéro de sécurité sociale. On pourra utiliser la fonction int()pour convertir le type str en type int.

Exemple :

>>> 

Entrer votre numéro de sécurité sociale (13 chiffres) --> 1891126108268

Entrer votre clé de contrôle (2 chiffres)

--------------> 91

Votre numéro de sécurité sociale est valide. >>>

Entrer votre numéro de sécurité sociale (13 chiffres) --> 2891126108268

Entrer votre clé de contrôle (2 chiffres)

--------------> 91

Votre numéro de sécurité sociale est INVALIDE !

>>> 

Exercice 2.2 ★ Nombre entier non signé et signé

Dans un octet, on peut stocker un nombre entier compris entre

0b00000000 = 0 et 0b11111111 = 255 (entier non signé, en numération binaire naturel).

On peut aussi stocker un entier compris entre -128 et +127 (entier signé, représentation dite en complément à deux).

En complément à deux, les nombres négatifs sont codés de la manière suivante :

-1  correspond à 255 en binaire naturel

-2  correspond à 254 en binaire naturel

-127  correspond à 129 en binaire naturel

-128  correspond à 128 en binaire naturel

1)     Ecrire un script qui donne la correspondance entre entier signé et entiernon signé. Par exemple :

>>> 

Entrer un entier signé en complément à deux (-128 à +127): 25

La représentation en binaire naturel est : 25

>>> 

Entrer un entier signé en complément à deux (-128 à +127): -15

La représentation en binaire naturel est : 241

2)     Ecrire un script qui donne la correspondance entre entier non signé et entier signé. Par exemple :

>>> 

Entrer un nombre entier (0 à 255): 250

Cela représente l'entier signé : -6

Exercice 2.3 ★ Ecrire un script qui demande la note au bac et qui affiche la mention correspondante. Par exemple :

>>> 

Note au bac (sur 20) : 13.5 Bac avec mention Assez Bien >>>

Note au bac (sur 20) : 10.9

Bac avec mention Passable

>>> 

Note au bac (sur 20) : 4

Recalé

>>> 

Exercice 2.4 ★ Ecrire un script qui calcule l'indice de masse corporelle (IMC) d'un adulte et qui en donne l'interprétation (corpulence normale, surpoids ).

Par exemple :

>>> 

Votre taille en cm ? 170

Votre masse en kg ? 68.5

IMC = 23.70 kg/m²

Interprétation : corpulence normale

>>> 

Exercice 2.5 ★★ Ecrire un script qui résout l'équation du second degré : ax² + bx + c = 0 Par exemple :

>>> 

Résolution de l'équation du second degré : ax² + bx + c = 0

Coefficient a ? 1

Coefficient b ? -0.9

Coefficient c ? 0.056 Discriminant :  0.586 Deux solutions :

0.0672468158199

0.83275318418

>>> 

Résolution de l'équation du second degré : ax² + bx + c = 0

Coefficient a ? 2

Coefficient b ? 1.5

Coefficient c ? 4 Discriminant :  -29.75

Il n'y a pas de solution.

Chapitre 3 - Les boucles

Une boucle permet d'exécuter une portion de code plusieurs fois de suite.

L'instruction while

 

Syntaxe

while expression:

# ne pas oublier le signe

de ponctuation ':'

# attention à

bloc d'instructions

l'indentation # suite du programme

 

Si l'expression est vraie (True) le bloc d'instructions est exécuté, puis l'expression est à nouveau évaluée.

Le cycle continue jusqu'à ce que l'expression soit fausse (False) : on passe alors à la suite du programme.

Exemple : un script qui compte de 1 à 4

# script

# initialisation de la variable de comptage

compteur = 1 while compteur < 5:

    # ce bloc est exécuté tant que la condition

(compteur < 5) est vraie     print(compteur, compteur < 5)     compteur += 1    # incrémentation du compteur, compteur = compteur + 1 print(compteur < 5) print("Fin de la boucle")

>>> 

1   True

2   True

3   True

4   True

False

Fin de la boucle

Table de multiplication par 8

# script

compteur = 1 # initialisation de la variable de comptage while compteur <= 10:

    # ce bloc est exécuté tant que la condition

(compteur <= 10) est vraie     print(compteur, '* 8 =', compteur*8)     compteur += 1    # incrémentation du compteur, compteur = compteur + 1 print("Et voilà !")

>>> 

1   * 8 = 8

2   * 8 = 16

3   * 8 = 24

4   * 8 = 32

5   * 8 = 40

6   * 8 = 48

7   * 8 = 56

8   * 8 = 64

9   * 8 = 72

10   * 8 = 80 Et voilà !

Affichage de l'heure courante

# script

import time     # importation du module time quitter = 'n'   # initialisation while quitter != 'o':

    # ce bloc est exécuté tant que la condition est vraie

    # strftime() est une fonction du module time     print('Heure courante ', time.strftime('%H:%M:

%S'))     quitter = input("Voulez-vous quitter le programme (o/n) ? ") print("A bientôt")

>>> 

Heure courante  09:48:54

Voulez-vous quitter le programme (o/n) ? n Heure courante  09:48:58

Voulez-vous quitter le programme (o/n) ? o

A bientôt

L'instruction for

Syntaxe

for élément in séquence :

bloc d'instructions

# suite du programme

 

Les éléments de la séquence sont issus d'une chaîne de caractères ou bien d'une liste.

Exemple avec une séquence de caractères

# script

chaine = 'Bonsoir' for lettre in chaine: variable d'itération     print(lettre) print("Fin de la boucle")

# lettre est la

La variable lettre est initialisée avec le premier élément de la séquence ('B').

Le bloc d'instructions est alors exécuté.

Puis la variable lettre est mise à jour avec le second élément de la séquence ('o') et le bloc d'instructions à nouveau exécuté Le bloc d'instructions est exécuté une dernière fois lorsqu'on arrive au dernier élément de la séquence ('r') :

>>> B o n s o i r

Fin de la boucle

Exemple avec les éléments d'une liste

# script

maliste = ['Pierre', 67.5, 18] for element in maliste:     print(element) print("Fin de la boucle")

Là, on affiche dans l'ordre les éléments de la liste :

>>> 

Pierre

67.5

18

Fin de la boucle

Fonction range()

L'association avec la fonction range() est très utile pour créer des séquences automatiques de nombres entiers :

# script print(list(range(1,5)))

for i in range(1,5):

    print(i) print("Fin de la boucle")

>>> 

[1, 2, 3, 4]

1

2

3

4

Fin de la boucle

Table de multiplication

La création d'une table de multiplication paraît plus simple avec une boucle for qu'avec une boucle while :

# script

for compteur in range(1,11):

    print(compteur, '* 9 =', compteur*9) print("Et voilà !")

>>> 

1     * 9 = 9

2     * 9 = 18

3     * 9 = 27

4     * 9 = 36

5     * 9 = 45

6     * 9 = 54

7     * 9 = 63

8     * 9 = 72

9     * 9 = 81

10  * 9 = 90 Et voilà !

L'instruction break

L'instruction break provoque une sortie immédiate d'une boucle while ou d'une boucle for.

Dans l'exemple suivant, l'expression True est toujours vraie : on a une boucle sans fin.

L'instruction break est donc le seul moyen de sortir de la boucle.

Affichage de l'heure courante

# script

import time     # importation du module time while True:

    # strftime() est une fonction du module time     print('Heure courante ', time.strftime('%H:%M:

%S'))

    quitter = input('Voulez-vous quitter le programme (o/n) ? ')     if quitter == 'o':

        break print("A bientôt")

>>> 

Heure courante  14:25:12

Voulez-vous quitter le programme (o/n) ? n Heure courante  14:25:20

Voulez-vous quitter le programme (o/n) ? o

A bientôt

Astuce

Si vous connaissez le nombre de boucles à effectuer, utiliser une boucle for.

Autrement, utiliser une boucle while (notamment pour faire des boucles sans fin).

Exercices

Exercice 3.1 ★ Ecrire un script qui affiche toutes les tables de multiplication (de 1 à 10).

Exercice 3.2 ★ Ecrire un script qui calcule la moyenne d'une série de notes.

On pourra utiliser une variable qui contient la somme intermédiaire des notes.

>>> 

Nombre de notes ? 3

-->  15

-->  11.5

-->  14

Moyenne : 13.5

>>> 

Exercice 3.3 ★

1)     Avec une boucle for, écrire un script qui compte le nombre de lettres z dans une chaîne de caractères. Par exemple :

>>> 

Entrer la chaîne : Zinedine Zidane

Résultat : 2

2)     Faire la même chose, directement avec la méthode count() de la classe str.

Pour obtenir de l'aide sur cette méthode :

>>> help(str.count)

Exercice 3.4 ★ Avec une boucle while, écrire un script qui affiche l'heure courante avec une actualisation chaque seconde.

On utilisera la fonction sleep() du module time. Pour obtenir de l'aide sur cette fonction :

>>> import time >>> help(time.sleep)

Par exemple :

>>> # Taper CTRL + C pour arrêter le programme.

>>> 

Heure courante  12:40:59

Heure courante  12:41:00

Heure courante  12:41:01

Heure courante  12:41:02

KeyboardInterrupt

>>> 

Remarque : il est vilain de forcer l'arrêt d'un programme avec CTRL + C Nous verrons comment interrompre proprement un programme dans le chapitreGestion des exceptions.

Exercice 3.5 ★☆

1)  Ecrire le script du jeu de devinette suivant :

>>> 

Le jeu consiste à deviner un nombre entre 1 et 100 :

--->   50 trop petit ! --->   75 trop petit ! --->   87 trop grand ! --->   81 trop petit ! --->   84 trop petit !

--->   85

Gagné en 6 coups !

2)  Quelle est la stratégie la plus efficace ?

3)  Montrer que l'on peut deviner un nombre en 7 coups maximum.

Bibliographie :La dichotomie

Remarque : pour créer un nombre entier aléatoire entre 1 et 100 :

import random

nombre = random.randint(1,100)

Exercice 3.6 ★★ Code de César

En cryptographie, le code de César est une technique de chiffrement élémentaire qui consiste à décaler une lettre de 3 rangs vers la droite :

A  → D

B  → E

Z → C

1)     Ecrire le script de ce exemple :

>>> 

Message à coder ? abcdefghijklmnopqrstuvwxyz defghijklmnopqrstuvwxyzabc

>>> 

Message à coder ? Monty Python's Flying Circus prqwb sbwkrq'v ioblqj flufxv

On pourra utiliser la chaîne 'abcdefghijklmnopqrstuvwxyz' et la méthode find() de la classe str.

Pour obtenir de l'aide sur cette méthode :

>>> help()

2)     Ecrire le script du dé exemple :

>>> 

Message à décoder ? prqwb sbwkrq'v ioblqj flufxv monty python's flying circus

Exercice 3.7 ★★ Ecrire un script qui donne l'évolution de la suite convergente : un+1 = un/2 + 1/un Par exemple :

>>> 

Valeur initiale ? 20

Jusqu'à quel rang ? 10

0  20.0

1  10.05

2  5.12450248756

3  2.75739213842

4  1.74135758045

5  1.44494338196

6  1.41454033013

7  1.41421360012

8  1.41421356237

9  1.41421356237

10   1.41421356237

>>> 

Exercice 3.8 ★★ Fraction continue infinie

Estimer la valeur numérique de la fraction continue suivante :

 

Comparer avec la valeur exacte : (1 + √5)/2

Exercice 3.9

1) ★ Ecrire un script qui détermine si un nombre entier est premier ou pas. Par exemple :

>>> 

Nombre ? 17

17 est un nombre premier

2) ★★ Ecrire un script qui décompose un nombre entier en un produit de facteurs premiers.

>>> 

Nombre à décomposer ? 2142

Chapitre 4 - Les fonctions

Nous avons déjà vu beaucoup de fonctions : print(), type(), len(), input(), range()

Ce sont des fonctions pré-définies (built-in functions).

Nous avons aussi la possibilité de créer nos propres fonctions !

Intérêt des fonctions

Une fonction est une portion de code que l'on peut appeler au besoin (c'est une sorte de sous-programme).

L'utilisation des fonctions évite des redondances dans le code : on obtient ainsi des programmes plus courts et plus lisibles.

Par exemple, nous avons besoin de convertir à plusieurs reprises des degrés Celsius en degrés Fahrenheit :

>>> print(100.0*9.0/5.0 + 32.0)

212.0

>>> print(37.0*9.0/5.0 + 32.0)

98.6

>>> print(233.0*9.0/5.0 + 32.0)

451.4

La même chose en utilisant une fonction :

>>> def fahrenheit(degre_celsius):

        """ Conversion degré Celsius en degré Fahrenheit """         print(degre_celsius*9.0/5.0 + 32.0)

>>> fahrenheit(100)

212.0

>>> fahrenheit(37)

98.6

>>> temperature = 233

>>> fahrenheit(temperature)

451.4

Rien ne vous oblige à définir des fonctions dans vos scripts, mais cela est tellement pratique qu'il serait improductif de s'en passer !

L'instruction def

Syntaxe

def nom_de_la_fonction(parametre1, parametre2, parametre3, ):

""" Documentation on peut écrire  plusieurs lignes """ # docstring entouré de 3 llemets (ou apostrophes)

bloc d'instructions  # attention à ndentation

return resultat        # la fonction retourne le

contenu de la variable resultat

qu' sur gui

l'i

 

Exemple n°1

# script

def mapremierefonction(): # cette fonction n'a pas de paramètre

    """ Cette fonction affiche 'Bonjour' """     print("Bonjour")     return  # cette fonction ne retourne rien ('None')

# l'instruction return est ici

facultative

Une fois la fonction définie, nous pouvons l'appeler :

>>> mapremierefonction() parenthèses ()

Bonjour

# ne pas oublier les

L'accès à la documentation se fait avec la fonction pré-définie help() :

>>> help(mapremierefonction) # affichage de la documentation

Help on function mapremierefonction in module __main__:

mapremierefonction()

    Cette fonction affiche 'Bonjour'

Exemple n°2

La fonction suivante simule le comportement d'un dé à 6 faces.

Pour cela, on utilise la fonction randint() du modulerandom.

# script

def tirage_de():

    """ Retourne un nombre entier aléatoire entre 1 et 6 """     import random     valeur = random.randint(1, 6)     return valeur >>> print(tirage_de()) 3

>>> print(tirage_de())

6

>>> resultat = tirage_de()

>>> print(resultat)

1

Exemple n°3

# script

# définition des fonctions def info():

    """ Informations """     print("Touche q pour quitter")     print("Touche Enter pour continuer")

def tirage_de():

    """ Retourne un nombre entier aléatoire entre 1 et 6 """     import random     valeur = random.randint(1, 6)     return valeur

# début du programme info() while True:

    choix = input()     if choix == 'q':

        break     print("Tirage :", tirage_de())

>>> 

Touche q pour quitter

Touche Enter pour continuer

Tirage : 5

Tirage : 6 q >>>

Exemple n°4

Une fonction avec deux paramètres :

# script

# définition de fonction def tirage_de2(valeur_min, valeur_max):

    """ Retourne un nombre entier aléatoire entre valeur_min et valeur_max """     import random     return random.randint(valeur_min, valeur_max)

# début du programme for i in range(5):

    print(tirage_de2(1, 10)) # appel de la fonction avec les arguments 1 et 10

>>> 

6

7

1

10

2

>>> 

Exemple n°5

Une fonction qui retourne une liste :

# script

# définition de fonction def tirage_multiple_de(nombretirage):

    """ Retourne une liste de nombres entiers aléatoires entre 1 et 6 """     import random     resultat = [random.randint(1, 6) for i in range(nombretirage)] # compréhension de listes (Cf. annexe)     return resultat

# début du programme print(tirage_multiple_de(10))

>>> 

[4, 1, 3, 3, 2, 1, 6, 6, 2, 5]

>>> help(tirage_multiple_de)

Help on function tirage_multiple_de in module __main__:

tirage_multiple_de(nombretirage)

    Retourne une liste de nombres entiers aléatoires entre 1 et 6

Exemple n°6

Une fonction qui affiche la parité d'un nombre entier.

Il peut y avoir plusieurs instructions return dans une fonction.

L'instruction return provoque le retour immédiat de la fonction.

# script

# définition de fonction def parite(nombre):

    """ Affiche la parité d'un nombre entier """     if nombre%2 == 1:   # L'opérateur % donne le reste d'une division

        print(nombre, 'est impair')         return     if nombre%2 == 0:

        print(nombre, 'est pair')         return >>> parite(13) 13 est impair

>>> parite(24)

24 est pair

Portée de variables : variables globales et locales

La portée d'une variable est l'endroit du programme où on peut accéder à la variable.

Observons le script suivant :

a = 10          # variable globale au programme

def mafonction():

    a = 20# variable locale à la fonction     print(a)     return

>>> print(a) # nous sommmes dans l'espace global du programme

10

>>> mafonction() # nous sommes dans l'espace local de la fonction

20

>>> print(a) # de retour dans l'espace global

10

Nous avons deux variables différentes qui portent le même nom a

Une variable a de valeur 20 est créée dans la fonction : c'est une variable locale à la fonction.

Elle est détruite dès que l'on sort de la fonction.

global

L'instruction global rend une variable globale :

a = 10          # variable globale

def mafonction():

    global a # la variable est maintenant globale     a = 20     print(a)     return >>> print(a)

10

>>> mafonction()

20

>>> print(a)

20

Remarque : il est préférable d'éviter l'utilisation de l'instruction global car c'est une source d'erreurs (on peut ainsi modifier le contenu d'une variable globale en croyant agir sur une variable locale). La sagesse recommande donc de suivre la règle suivante :

§ ne jamais affecter dans un bloc de code local une variable de même nom qu'une variable globale

Annexe : la compréhension de listes

La compréhension de listes est une structure syntaxique disponible dans un certain nombre de langages de programmation, dont Python. C'est une manière de créer efficacement des listes.

Revenons sur l'exemple vu dans le script :

resultat = [random.randint(1, 6) for i in range(10) ]

>>> print(resultat)

[3, 1, 5, 6, 4, 2, 1, 1, 3, 1]

Autre exemple : liste de carrés

carres = [i*i for i in range(11)]

>>> print(carres)

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

La compréhension de listes évite donc d'écrire le code "classique" suivant :

carres = [] for i in range(11):     carres.append(i*i)

Exercices

Exercice 4.1 ☆

1)  Ecrire une fonction carre() qui retourne le carré d'un nombre :

>>> print(carre(11.11111))

123.4567654321

2)  Avec une boucle while et la fonction carre(), écrire un script qui affiche le carré des nombres entiers de 1 à 100 :

>>> 

1² = 1

2² = 4

3² = 9

99² = 9801

100² = 10000

Fin du programme

Exercice 4.2 ☆

1)  Ecrire une fonction qui retourne l'aire de la surface d'un disque de rayon R. Exemple :

>>> print(airedisque(2.5))

19.6349540849

2)  Ajouter un paramètre qui précise l'unité de mesure :

>>> print(airedisque2(4.2, 'cm'))

55.4176944093 cm²

Exercice 4.3 ★

1)  Ecrire une fonction qui retourne la factorielle d'un nombre entier N.

On rappelle que : N ! = 1×2× ×(N-1)×N Exemple :

>>> print(factorielle(50))

304140932017133780436126081660647688443776415689605 12000000000000

2)  Comparez avec le résultat de la fonctionfactorial() du module math.

Exercice 4.4 ★

1)  A l'aide de la fonction randint() du module random, écrire une fonction qui retourne un mot de passe de longueur N (chiffres, lettres minuscules ou majuscules). On donne :

chaine =

'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn opqrstuvwxyz'

>>> print(password(10)) mHVeC5rs8P

>>> print(password(6))

PYthoN

2)  Reprendre la question 1) avec la fonction choice() du module random.

Pour obtenir de l'aide sur cette fonction :

>>> import random

>>> help(random.choice)

3)  Quel est le nombre de combinaisons possibles ?

4)  Quelle durée faut-il pour casser le mot de passe avec un logiciel capable de générer 1 million de combinaisons par seconde ? Lien utile

Exercice 4.5 ★ Ecrire une fonction qui retourne une carte (au hasard) d'un jeu de Poker à 52 cartes.

On utilisera la fonction choice() ou randint() du module random.

On donne :

ListeCarte =

['2s','2h','2d','2c','3s','3h','3d','3c','4s','4h',

'4d','4c','5s','5h','5d','5c',

'6s','6h','6d','6c','7s','7h','7d','7c','8s','8h','

8d','8c','9s','9h','9d','9c',

'Ts','Th','Td','Tc','Js','Jh','Jd','Jc','Qs','Qh','

Qd','Qc','Ks','Kh','Kd','Kc','As','Ah','Ad','Ac'] >>> print(tiragecarte()) 7s

>>> print(tiragecarte())

Kd

Exercice 4.6 ★★

1)     Ecrire une fonction qui retourne une liste de N cartes différentes d'un jeu de Poker à 52 cartes.

Noter qu'une fonction peut appeler une fonction : on peut donc réutiliser la fonction tiragecarte() de l'exercice précédent. Exemple :

>>> print(tirage_n_carte(2))

['As', 'Ah']

>>> print(tirage_n_carte(25))

['Jc', 'Jh', 'Tc', '2d', '3h', 'Qc', '8d', '7c', 'As', 'Td', '8h', '9c', 'Ad', 'Qh',

'Kc', '6s', '5h', 'Qd', 'Kh', '9h', '5d', 'Js', 'Ks', '5c', 'Th']

2)     Simplifier le script avec la fonction shuffle() ou sample() du module random.

Exercice 4.7 ★ Ecrire une fonction qui retourne une grille de numéros du jeu Euro Millions.

On utilisera la fonction sample() du module random.

 

>>> print(euromillions())

[37, 23, 9, 11, 49, 2, 11]

>>> print(euromillions()) [16, 32, 8, 30, 40, 6, 4]

Exercice 4.8 ★★

1)  Ecrire une fonction qui retourne la valeur de la fonction mathématique f(x)= 27x3 -27x2 -18x +8 :

>>> print(f(0), f(1), f(0.5), f(0.25), f(0.375))

8.0 -10.0 -4.375 2.234375 -1.123046875

2)  On se propose de chercher les zéros de cette fonction par laméthode .

Ecrire le script correspondant.

>>> 

Recherche d'un zéro dans l'intervalle [a,b] a? 0 b? 1

Précision ? 1e-12

0.5

0.25

0.375

0.3125

0.34375

0.328125

0.3359375

0.33203125

0.333984375

0.3330078125

0.33349609375

0.333251953125

0.333333333333

>>> 

3)  Chercher tous les zéros de cette fonction.

Annexe : représentation graphique de la fonction f(x)= 27x3 -27x2 -

18x +8 (graphique réalisé avec la librairiematplotlib de Python)

 

Chapitre 5 - Gestion des exceptions

Intéressons-nous au script suivant :

# script chaine = input('Entrer un nombre : ') nombre = float(chaine) inverse = 1.0/nombre

print("L'inverse de", nombre, "est :", inverse)

Ce script vous demande de saisir un nombre, puis il calcule et affiche son inverse.

Les exceptions

Quand vous entrez un nombre, tout se déroule normalement :

>>> 

Entrer un nombre : 10

L'inverse de 10.0 est : 0.1

>>> 

Mais que se passe-t-il autrement ?

>>> 

Entrer un nombre : bonjour

Traceback (most recent call last):   File "", line 3, in <module>     nombre = float(chaine)

ValueError: could not convert string to float: bonjour

>>> 

>>> 

Entrer un nombre : 0

Traceback (most recent call last):   File "", line 4, in <module>     inverse = 1.0/nombre

ZeroDivisionError: float division by zero

>>> 

Python a détecté une erreur : une exception est levée.

Ici nous avons une exception de type ZeroDivisionError (division par 0) et une exception de type ValueError.

Une exception arrête l'exécution normale d'un programme.

Gestion des exceptions

Heureusement, il est possible de gérer les exceptions pour éviter l'arrêt brutal du programme.

Par cela, on utilise conjointement les instructions try et except. L'instruction else est optionnelle :

try:

    chaine = input('Entrer un nombre : ')     nombre = float(chaine)     inverse = 1.0/nombre except:

    #ce bloc est exécuté si une exception est levée dans le bloc try     print("Erreur !") else:

    #on arrive ici si aucune exception n'est levée dans le bloc try     print("L'inverse de", nombre, "est :", inverse)

>>> 

Entrer un nombre : 56

L'inverse de 56.0 est : 0.0178571428571

>>> 

Entrer un nombre : 0 Erreur !

>>> 

On peut distinguer les différents types d'exceptions :

try:

    chaine = input('Entrer un nombre : ')     nombre = float(chaine)     inverse = 1.0/nombre except ValueError:

    #ce bloc est exécuté si une exception de type ValueError est levée dans le bloc try     print(chaine, "n'est pas un nombre !") except ZeroDivisionError:

    #ce bloc est exécuté si une exception de type ZeroDivisionError est levée dans le bloc try     print("Division par zéro !")

else:

    #on arrive ici si aucune exception n'est levée dans le bloc try     print("L'inverse de", nombre, "est :", inverse)

>>> 

Entrer un nombre : 0 Division par zéro !

>>> 

Entrer un nombre : bonjour bonjour n'est pas un nombre !

>>> 

N'oubliez pas : un programme bien écrit doit gérer proprement les exceptions.

Exercices

Exercice 5.1

1)     Compléter le script précédent de manière à ressaisir le nombre en cas d'erreur. Par exemple :

>>> 

Entrer un nombre : salut ! salut ! n'est pas un nombre !

Entrer un nombre : 2,3

2,3 n'est pas un nombre !

Entrer un nombre : 2.3

L'inverse de 2.3 est : 0.434782608696

>>> 

2)     Compléter le script de manière à accepter la virgule comme séparateur décimal. Par exemple :

>>> 

Entrer un nombre : 2,3

L'inverse de 2.3 est : 0.434782608696

>>> 

On pourra utiliser la méthode replace() de la classe str

Exercice 5.2 Ecrire un script qui calcule la racine carrée d'un nombre, avec gestion des exceptions. Par exemple :

>>> 

Entrer un nombre : go go n'est pas un nombre valide !

Entrer un nombre : -5.26

-5.26 n'est pas un nombre valide ! Entrer un nombre : 16

La racine carrée de 16.0 est : 4.0

>>> 

Exercice 5.3 Soit le script :

i = 0 while True:     i += 1     print(i)

Il s'agit d'une boucle sans fin.

Pour arrêter ce programme, il faut appuyer sur les touches CTRL + C, ce qui lève une exception de type KeyboardInterrupt :

>>> 

1

1216

1217

1218

1219

1220

Traceback (most recent call last):

    raise KeyboardInterrupt

KeyboardInterrupt

>>> 

Compléter le script pour gérer proprement l'exception :

>>> 

1

966

967

968

Fin du programme

>>> 

Chapitre 6 - Classes et modules

La classe est un concept de base de la programmation orientée objet. En langage Python, vous pouvez très bien écrire un script sans définir de classes (c'est ce que nous avons fait jusqu'à présent).

Cependant, vous manipulez forcément des objets (ou instances de classes) : une variable entière est une instance de la classe int, une chaîne de caractères est une instance de la classe str

Le module Tkinter (que nous aborderons dans lechapitre 7) sert à créer des interfaces graphiques : ce module fournit une bibliothèque de classes.

Il est donc important d'étudier les classes notamment pour bien comprendre comment les utiliser (pour un débutant, c'est déroutant !).

Ce chapitre est difficile : je vous conseille de relire ce que l'on a vu dans lechapitre 1.

Définition d'une classe

Voici un exemple de script qui utilise une classe définie par l'utilisateur.

Nous allons commencer par créer le fichier source (on parlera par la suite du module CompteBancaire) :

Ouvrir IDLE :

Démarrer → Programmes → Python → IDLE (Python GUI)

File → New Window

Copier puis coller le code source ci-dessous :

# -*- coding: utf-8 -*-

 

#

# définition de la classe Compte

class Compte:

   """Un exemple de classe :    gestion d'un compte bancaire"""

   # définition de la méthode spéciale __init__    def __init__(self, soldeInitial):

      """Initialisation du compte avec la valeur soldeInitial."""

      # assignation de l'attribut d'instance solde       self.solde = float(soldeInitial)

   # définition de la méthode NouveauSolde()    def NouveauSolde(self, somme):

      """Nouveau solde de compte avec la valeur somme."""       self.solde = float(somme)

   # définition de la méthode Solde()    def Solde(self):

      """Retourne le solde."""       return self.solde

   # définition de la méthode Credit()    def Credit(self, somme):

      """Crédite le compte de la valeur somme. Retourne le solde."""       self.solde += somme

 

      return self.solde

   # définition de la méthode Debit()    def Debit(self, somme):

      """Débite le compte de la valeur somme. Retourne le solde."""       self.solde -= somme       return self.solde

   # définition de la méthode spéciale __add__

(surcharge de l'opérateur +)    def __add__(self, somme):

      """x.__add__(somme) <=> x+somme

      Crédite le compte de la valeur somme.       Affiche 'Nouveau solde : somme'"""       self.solde += somme       print("Nouveau solde : {:+.2f}

€".format(self.solde))            return self

   # définition de la méthode spéciale __sub__

(surcharge de l'opérateur -)    def __sub__(self, somme):

      """x.__sub_(somme) <=> x-somme

      Débite le compte de la valeur somme.       Affiche 'Nouveau solde : somme'"""       self.solde -= somme       print("Nouveau solde : {:+.2f}

€".format(self.solde))       return self

if __name__ == '__main__':

   # Ce bloc d'instructions est exécuté si le module est lancé en tant que programme autonome

   # Instanciation de l'objet cb1 de la classe Compte    cb1 = Compte(1000)

   # formatage des données pour afficher deux chiffres après la virgule et le signe    print("{:+.2f}".format(cb1.Solde()))    print("{:+.2f}".format(cb1.Credit(200)))    print("{:+.2f}".format(cb1.Debit(50.23)))    print("{:+.2f}".format(cb1.Solde()))    cb1.NouveauSolde(5100)    print("{:+.2f}".format(cb1.Solde()))    cb1+253.2    cb1-1000+100    cb1-cb1.Solde()

File → Save As

Répertoire : C:\PythonXX

Nom du fichier :

Puis exécuter le module :

Run → Run Module (ou touche F5) :

>>> 

+1000.00

+1200.00

+1149.77

+1149.77

+5100.00

Nouveau solde : +5353.20 €

Nouveau solde : +4353.20 €

Nouveau solde : +4453.20 €

Nouveau solde : +0.00 €

>>> 

L'instruction class

Pour définir la nouvelle classe Compte, on utilise l'instruction class. Une classe possède des fonctions que l'on appelle méthodes et des données que l'on appelle attributs.

Une méthode se définit de la même manière qu'une fonction (on commence par l'instruction def).

Une méthode possède au moins un paramètre qui s'appelle self. Le paramètre self désigne toutes les instances qui seront créées par cette classe.

7 méthodes sont ainsi définies.

Un seul attribut d'instance est utilisé dans cette classe : solde (à ne pas confondre avec la méthode Solde()).

La méthode spéciale __init__()

La méthode spéciale __init__() est exécutée automatiquement lorsque l'on instancie (crée) un nouvel objet de la classe. Cette méthode s'apparente à un constructeur.

Autres méthodes spéciales

Deux autres méthodes spéciales sont utilisées : __add__() et __sub__().

L'écriture cb1+253.2 est équivalente à cb1.__add__(253.2) L'opérateur + représente ici une addition sur le solde. L'écriture cb1-1000 est équivalente à cb1.__sub__(1000) L'opérateur - représente ici une soustraction sur le solde.

>>> cb1.NouveauSolde(500)

>>> print(cb1.Solde())

500.0

>>> cb1.__add__(1000)

Nouveau solde : +1500.00 €

>>> cb1+2000    # cette écriture est très pratique !

Nouveau solde : +3500.00 €

>>> 

L'instruction if __name__ == '__main__':

Ici, le module est exécuté en tant que programme principal : les instructions qui suivent sont donc exécutées.

Dans le cas où ce module est importé dans un autre programme, cette partie du code est sans effet.

Documentation

La fonction help() est très utile.

On comprend ici l'intérêt de bien documenter ses programmes avec les """docstrings""" :

>>> help(cb1)

Help on instance of Compte in module __main__:

class Compte

 |  Un exemple de classe :

 |  gestion d'un compte bancaire

 |

 |  Methods defined here:

 |

 |  Credit(self, somme)

 |      Crédite le compte de la valeur somme. Retourne le solde.

 |

 |  Debit(self, somme)

 |      Débite le compte de la valeur somme. Retourne le solde.

 |

 |  NouveauSolde(self, somme)

 |      Nouveau solde de compte avec la valeur somme.

 |

 |  Solde(self)

 |      Retourne le solde.

 |

 |  __add__(self, somme)

 |      x.__add__(somme) <=> x+somme

 |      Crédite le compte de la valeur somme.

 |      Affiche 'Nouveau solde : somme'

 |

 |  __init__(self, soldeInitial)

 |      Initialisation du compte avec la valeur soldeInitial.

 |

 |  __sub__(self, somme)

 |      x.__sub_(somme) <=> x-somme

 |      Débite le compte de la valeur somme.

 |      Affiche 'Nouveau solde : somme'

>>> 

La fonction dir() retourne la liste des méthodes et attributs :

>>> dir(cb1)

['Credit', 'Debit', 'NouveauSolde', 'Solde', '__add__',

'__doc__', '__init__', '__module__', '__sub__', 'solde']

Remarques

On peut instancier plusieurs objets d'une même classe :

>>> cb2 = Compte(10000)

>>> print(cb2.Credit(500))

10500.0

>>> cb3 = Compte(6000)    # et encore un !

>>> cb3-500

Nouveau solde : +5500.00 €

>>> 

Même si cela n'est pas recommandable, vous pouvez accéder directement aux attributs d'instance :

>>> print(cb2.solde)

10500.0

>>> cb2.solde = 5000.0   # assignation de l'attribut d'instance solde

>>> print(cb2.solde)

5000.0

>>> print(cb2.Solde())

5000.0

>>> 

Notez que des mécanismes sont prévus pour personnaliser le mode d'accès aux attributs : fonction property() ou décorateur @property

Importation d'un module défini par l'utilisateur

L'importation de notre module personnel CompteBancaire se fait de la même façon que pour les modules de base (math, random, time ).

Redémarrer l'interpréteur interactif (Python Shell) : Shell → Restart Shell

>>> import CompteBancaire

>>> cb = CompteBancaire.Compte(1500)

>>> print(cb.Debit(200))

1300.0

>>> print(cb.solde)

1300.0

>>> cb+2000

Nouveau solde : +3300.00 €

>>> 

Le module CompteBancaire est importé par le programme principal (ici l'interpréteur interactif).

La partie du code qui suit l'instruction if __name__ == '__main__': est ignorée (il n'y a donc pas d'affichage après l'instruction import CompteBancaire).

Modules de classes, modules de fonctions

IDLE dispose de l'outil Path Browser pour connaître la structure d'un module.

File → Path Browser

 

Un module peut contenir des classes (CompteBancaire), des fonctions (animation) ou des fonctions et des classes.

Autre exemple

Le module standard math est un module de fonctions.

Pour s'en convaincre :

>>> import math

>>> help(math)

Help on built-in module math:

NAME     math

FILE

    (built-in)

DESCRIPTION

    This module is always available.  It provides access to the     mathematical functions defined by the C standard.

FUNCTIONS     acos( )         acos(x)

        Return the arc cosine (measured in radians) of x.

    acosh( )         acosh(x)

        Return the hyperbolic arc cosine (measured in radians) of x.

    trunc( )

        trunc(x:Real) -> Integral

        Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.

DATA     e = 2.718281828459045     pi = 3.141592653589793

Le module math a également deux données (pi et e) :

>>> print(math.e)    # donnée e du module math (nombre d'Euler)

2.71828182846

>>> print()   # donnée pi du module math (nombre pi)

3.14159265359

>>> print(())  # fonction sin() du module math (sinus)

0.707106781187

>>> print((2.0)) # fonction sqrt() du module math (racine carrée)

1.41421356237

>>> print((-3.0)) # fonction exp() du module math (exponentielle)

0.0497870683679

>>> print((math.e)) # fonction log() du module math (logarithme népérien)

1.0

Héritage de classes

Si vous êtes familiarisé avec le module Tkinter, voici un exemple qui montre toute la puissance des classes et de la notion d'héritage :

 

# -*- coding: utf-8 -*from tkinter import *

class EnterMessage(Frame):

    """ Classe EnterMessage (Frame de saisie du mes sage)

 

    Cette classe dérive de la classe

Tkinter.Frame"""

    def __init__(self, master=None):

        """Initialisation : création d'un widget Fr ame"""

        Frame.__init__(self, master, bg='navy')

        (padx=10, pady=10)

        self.CreateWidgets()

    def CreateWidgets(self):

        """ Création des widgets Entry et Button dans le widget Frame """

        self.NouveauMessage = StringVar()

        Entry(master=self, textvariable=self.Nouvea

uMessage).pack(side=LEFT, padx=10, pady=10)

        Button(master=self, text="Nouveau", fg="nav y", command=self.Nouveau).pack(padx=10, pady=10)

    def Nouveau(self):

        """ Création d'une instance de la classe Ne wPostIt """

        if () != "":

            NewPostIt(master=self.master, message=s ())

            ("")

class NewPostIt(Frame):

    """ Classe post-it (Frame Post-It)

    Cette classe dérive de la classe Tkinter.Frame"

""

    def __init__(self, master=None, message=None):         """Initialisation : création d'un widget Fr ame"""

        Frame.__init__(self, master, bg="maroon")

        (side=LEFT, padx=10, pady=10)

        self.CreateWidgets(message)

    def CreateWidgets(self, message):

        """ Création des widgets Label et Button da ns le widget Frame"""

        Label(master=self, text=message, fg='maroon

', bg='white').pack(padx=10, pady=10)

        Button(master=self, text="Effacer", fg="nav y", command=self.destroy).pack(padx=10, pady=10) if __name__ == '__main__':

    # création de la fenêtre principale

    Mafenetre = Tk()

    Mafenetre.title('Post-it')     Mafenetre['bg'] = 'bisque'

    # Création d'une instance de la classe EnterMes sage

    EnterMessage(master=Mafenetre)

    Mafenetre.mainloop()

Exercices

Exercice 6.0 ★ On s'intéresse au moduleCompteBancaire. Dans les méthodes __add__() et __sub__(), remplacer la ligne return self par simplement return

Tester ce nouveau code et expliquer la différence.

Exercice 6.1 ★ On s'intéresse au moduleCompteBancaire.

Définir une nouvelle méthode Decouvert() de la classe Compte, qui affiche selon le cas Solde positif ou Solde négatif :

>>> CompteFabrice = Compte(2000)

>>> CompteFabrice-3000

Nouveau solde : -1000.00 €

>>> CompteFabrice.Decouvert()

Solde négatif

>>> CompteFabrice+10000

Nouveau solde : +9000.00 €

>>> CompteFabrice.Decouvert()

Solde positif

>>> 

Exercice 6.2 ★★ On s'intéresse au moduleCompteBancaire.

Définir une nouvelle méthode Suivi() qui affiche l'historique du solde. On pourra définir un nouvel attribut de type list :

>>> CompteMuriel = Compte(5000)

>>> CompteMuriel-1000

Nouveau solde : +4000.00 €

>>> CompteMuriel+5000

Nouveau solde : +9000.00 €

>>> CompteMuriel.Suivi() [5000.0, 4000.0, 9000.0]

>>> 

Chapitre 7 - Interface graphique avec le module Tkinter

Le module Tkinter ("Tk interface") de Python permet de créer des interfaces graphiques (GUI : graphical user interface).

De nombreux composants graphiques (ou widgets) sont disponibles : fenêtre (classe Tk), bouton (classe Button), case à cocher

(classe Checkbutton), étiquette (classe Label), zone de texte simple (classe Entry), menu (classe Menu), zone graphique (classe Canvas), cadre (classe Frame)

On peut gérer de nombreux événements : clic sur la souris, déplacement de la souris, appui sur une touche du clavier, top d'horloge

Logiciels utilisant Python et sa bibliothèque graphique Tkinter

Tkinter est l'interface graphique des logicielsIDLE (environnement de développement intégré pour le langage Python) et(logiciel libre de visualisation de structures chimiques en 3D) :

Des scripts pour débuter

Les exemples qui suivent ont été écrits avec Python version 3.

Exemple n°0 : widgets Button et Label

Commençons par le traditionnel Hello world !

 

# -*- coding: utf-8 -*# script from tkinter import *

# Création de la fenêtre principale (main window) Mafenetre = Tk()

# Création d'un widget Label (texte 'Bonjour tout le monde !')

Label1 = Label(Mafenetre, text = 'Bonjour tout le monde !', fg = 'red')

# Positionnement du widget avec la méthode pack() ()

# Création d'un widget Button (bouton Quitter) Bouton1 = Button(Mafenetre, text = 'Quitter', comma nd = Mafenetre.destroy) ()

# Lancement du gestionnaire d'événements Mafenetre.mainloop()

Ce code est détailléici.

Exemple n°1 : widgets Button et Label

Ce script simule un dé à 6 faces :

 

# script #(C) Fabrice Sincère

from tkinter import * import random

def NouveauLance():

    nb = random.randint(1,6)

    ('Résultat -> ' + str(nb))

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title('Dé à 6 faces')

Mafenetre.geometry('300x100+400+400')

# Création d'un widget Button (bouton Lancer)

BoutonLancer = Button(Mafenetre, text ='Lancer', command = NouveauLance)

# Positionnement du widget avec la méthode pack()

(side = LEFT, padx = 5, pady = 5)

# Création d'un widget Button (bouton Quitter)

BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)

(side = LEFT, padx = 5, pady = 5)

Texte = StringVar()

NouveauLance()

# Création d'un widget Label (texte 'Résultat -> x')

LabelResultat = Label(Mafenetre, textvariable = Texte, fg ='red', bg ='white')

(side = LEFT, padx = 5, pady = 5)

Mafenetre.mainloop()

Ce code est détailléici.

Exemple n°2 : widgets Frame, Label et Button

Un widget Frame est une zone rectangulaire qui peut contenir d'autres widgets.

 

# script #(C) Fabrice Sincère from tkinter import *

# Création de la fenêtre principale

Mafenetre = Tk()

Mafenetre.title('Frame widget')

Mafenetre['bg']='bisque' # couleur de fond

# création d'un widget Frame dans la fenêtre princi pale

Frame1 = Frame(Mafenetre,borderwidth=2,relief=GROOV

E)

(side=LEFT,padx=10,pady=10)

# création d'un second widget Frame dans la fenêtre principale

Frame2 = Frame(Mafenetre,borderwidth=2,relief=GROOV

E)

(side=LEFT,padx=10,pady=10)

# création d'un widget Frame dans un widget Fram e

# le widget Frame1 est le parent du widget Frame3 # le parent du widget Frame1 est le widget Mafenetr e (fenêtre principale)

Frame3 = Frame(Frame1,bg="white",borderwidth=2,reli ef=GROOVE)

(side=LEFT,padx=10,pady=10)

# création d'un widget Label et d'un widget Button dans un widget Frame

Label(Frame1,text="RDV dentiste samedi à 15h").pack

(padx=10,pady=10)

Button(Frame1,text="Effacer",fg='navy',command=Fram e1.destroy).pack(padx=10,pady=10)

Label(Frame2,text="Réviser le contrôle d'info").pac k(padx=10,pady=10)

Button(Frame2,text="Effacer",fg='navy',command=Fram e2.destroy).pack(padx=10,pady=10)

Label(Frame3,text="RDV dentiste à 10h",bg="white"). pack(padx=10,pady=10)

Button(Frame3,text="Effacer",fg='navy',command=Fram e3.destroy).pack(padx=10,pady=10)

Mafenetre.mainloop()

Exemple n°3 : widgets Entry, Label, Button et boîte de dialogue MessageBox

Un script d'authentification :

 

# script #(C) Fabrice Sincère from tkinter import * from tkinter.messagebox import * # boîte de dialogue

def Verification():     if () == 'python27':

        # le mot de passe est bon : on affiche une boîte de dialogue puis on ferme la fenêtre         showinfo('Résultat','Mot de passe correct.\nAu revoir !')         Mafenetre.destroy()

    else:

        # le mot de passe est incorrect : on affiche une boîte de dialogue         showwarning('Résultat','Mot de passe incorrect.\nVeuillez recommencer !')         ('')

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title('Identification requise')

# Création d'un widget Label (texte 'Mot de passe')

Label1 = Label(Mafenetre, text = 'Mot de passe ')

(side = LEFT, padx = 5, pady = 5)

# Création d'un widget Entry (champ de saisie)

Motdepasse= StringVar()

Champ = Entry(Mafenetre, textvariable= Motdepasse, show='*', bg ='bisque', fg='maroon')

Champ.focus_set()

(side = LEFT, padx = 5, pady = 5)

# Création d'un widget Button (bouton Valider)

Bouton = Button(Mafenetre, text ='Valider', command = Verification)

(side = LEFT, padx = 5, pady = 5)

Mafenetre.mainloop()

Exemple n°4 : widgets Spinbox et Label

 

# script #(C) Fabrice Sincère from tkinter import *

def carre():

    """ Calcul du carré """

    ("Carré = "+str(float(()) **2))

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title("Spinbox widget")

Valeur = StringVar()

(2.0)

# Création d'un widget Spinbox

boite = Spinbox(Mafenetre,from_=0,to=10,increment=0 .5,textvariable=Valeur,width=5,command=carre) (padx=30,pady=10)

# Création d'un widget Label Resultat = StringVar() carre()

Label(Mafenetre,textvariable=Resultat).pack(padx=30 ,pady=10)

Mafenetre.mainloop()

Exemple n°5 : widgets Scale et Button

 

# script #(C) Fabrice Sincère from tkinter import *

def maj(nouvelleValeur):

    # nouvelle valeur en argument

    print(nouvelleValeur) def plus():

    (str(int(())+10))

    print(()) def moins():

    (str(int(())-10))

    print(())

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title("Scale widget")

Valeur = StringVar()

(50)

# Création d'un widget Scale echelle = Scale(Mafenetre,from_=-

100,to=100,resolution=10,orient=HORIZONTAL,\ length=300,width=20,label="Offset",tickinterval=20, variable=Valeur,command=maj) (padx=10,pady=10)

# Création d'un widget Button (bouton +)

Button(Mafenetre,text="+",command=plus).pack(padx=1 0,pady=10)

# Création d'un widget Button (bouton -)

Button(Mafenetre,text="-",command=moins).pack(padx= 10,pady=10)

Mafenetre.mainloop()

Exemple n°6 : widgets Canvas et Button

Le script dessine, à chaque clic sur le bouton Go, un disque de rayon 20 pixels à une position aléatoire :

 

# script #(C) Fabrice Sincère from tkinter import * import random

def Cercle():

    """ Dessine un cercle de centre (x,y) et de rayon r """     x = random.randint(0,Largeur)     y = random.randint(0,Hauteur)

 

    r = 20

    Canevas.create_oval(x-r, y-r, x+r, y+r, outline='blue', fill='blue')

def Effacer():

    """ Efface la zone graphique """

    Canevas.delete(ALL)

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title('Cercle')

# Création d'un widget Canvas (zone graphique)

Largeur = 480

Hauteur = 320

Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ='white')

(padx =5, pady =5)

# Création d'un widget Button (bouton Go)

BoutonGo = Button(Mafenetre, text ='Go', command = Cercle)

(side = LEFT, padx = 10, pady = 10)

# Création d'un widget Button (bouton Effacer)

BoutonEffacer = Button(Mafenetre, text ='Effacer', command = Effacer)

(side = LEFT, padx = 5, pady = 5)

# Création d'un widget Button (bouton Quitter)

BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)

(side = LEFT, padx = 5, pady = 5)

Mafenetre.mainloop()

Ce code est détailléici.

Exemple n°7 : widgets Canvas et Button ; gestion des images

Ce script reprend le script avec une image de fond

(méthode create_image() de la classe Canvas) et la possibilité d'effacer la dernière action (pour cela, on se sert du numéro identifiant de chaque item d'un widget Canvas) :

   

# script #(C) Fabrice Sincère from tkinter import * import random

def Cercle():

    """ Dessine un cercle de centre (x,y) et de ray on r """

x   = random.randint(0,Largeur)

y   = random.randint(0,Hauteur)

    r = 10

    # on dessine un cercle dans la zone graphique     item = Canevas.create_oval(x-r, y-r, x+r, y+r, outline='black', fill='black')

    print("Création du cercle (item" , item ,")")

    # affichage de tous les items de Canevas

    print(Canevas.find_all())

def Undo():

    """ Efface le dernier cercle"""     if len(Canevas.find_all()) > 1:

        item = Canevas.find_all()[-1]

        # on efface le cercle

        Canevas.delete(item)

        print("Suppression du cercle

(item" , item ,")")

        # affichage de tous les items de Canevas

        print(Canevas.find_all())

def EffacerTout():

    """ Efface tous les cercles"""

    while len(Canevas.find_all()) > 1:         Undo()

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title('Cible')

# Image de fond

photo = PhotoImage(file="")

# Création d'un widget Canvas (zone graphique)

Largeur = 550

Hauteur = 550

Canevas = Canvas(Mafenetre,width = Largeur, height

=Hauteur)

item = Canevas.create_image(0,0,anchor=NW, image=ph oto)

print("Image de fond (item",item,")") ()

# Création d'un widget Button

BoutonGo = Button(Mafenetre, text ='Tirer', command

= Cercle)

(side = LEFT, padx = 10, pady = 10)

# Création d'un widget Button

BoutonEffacer = Button(Mafenetre, text ='Effacer le dernier tir', command = Undo)

(side = LEFT, padx = 10, pady = 1 0)

# Création d'un widget Button

BoutonEffacerTout = Button(Mafenetre, text ='Efface r tout', command = EffacerTout)

(side = LEFT, padx = 10, pady = 10)

# Création d'un widget Button (bouton Quitter) BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)

(side = LEFT, padx = 10, pady = 1 0)

Mafenetre.mainloop()

Télécharger l'image de fond

Exemple n°8 : widgets Menu et Canvas ; gestion des images ; boîtes de

dialogue FileDialog et MessageBox

Le script suivant est un browser d'images (formats .gif .ppm .pgm), avec un widget Menu :

 

une boîte de dialogue FileDialog pour rechercher un fichier :

 

et un widget Canvas dans lequel sera affiché l'image :

 

# script #(C) Fabrice Sincère from tkinter import * import tkinter.messagebox import tkinter.filedialog

def Ouvrir():

    Canevas.delete(ALL) # on efface la zone graphiq ue

    filename = tkinter.filedialog.askopenfilename(t itle="Ouvrir une image",filetypes=[('gif files','.g if'),('all files','.*')])     print(filename)

    photo = PhotoImage(file=filename)

    gifdict[filename] = photo  # référence

    print(gifdict)

    Canevas.create_image(0,0,anchor=NW,image=photo)     Canevas.config(height=photo.height(),width=phot o.width())

    Mafenetre.title("Image "+str(photo.width())+" x

"+str(photo.height()))

def Fermer():

    Canevas.delete(ALL)     Mafenetre.title("Image")

def Apropos():

    tkinter.messagebox.showinfo("A propos","Tutoria l Python Tkinter\n(C) Fabrice Sincère")

# Main window

Mafenetre = Tk()

Mafenetre.title("Image")

# Création d'un widget Menu menubar = Menu(Mafenetre)

menufichier = Menu(menubar,tearoff=0)

menufichier.add_command(label="Ouvrir une image",co mmand=Ouvrir)

menufichier.add_command(label="Fermer l'image",comm and=Fermer)

menufichier.add_command(label="Quitter",command=Maf enetre.destroy)

menubar.add_cascade(label="Fichier", menu=menufichi er)

menuaide = Menu(menubar,tearoff=0)

menuaide.add_command(label="A propos",command=Aprop os)

menubar.add_cascade(label="Aide", menu=menuaide)

# Affichage du menu

Mafenetre.config(menu=menubar)

# Création d'un widget Canvas

Canevas = Canvas(Mafenetre) (padx=5,pady=5)

# Utilisation d'un dictionnaire pour conserver une référence gifdict={}

Mafenetre.mainloop()

Remarques

# dans le programme principal gifdict = {}

# dans la fonction Ouvrir() gifdict[filename] = photo

Si vous enlevez les lignes ci-dessus, l'ouverture des images ne fonctionne plus correctement.

En effet, photo est une variable locale à la fonction Ouvrir(). En dehors, elle n'existe plus et la référence à l'image est perdue.

Une manière de conserver la référence est d'utiliser un dictionnaire ou une liste qui ont "naturellement" une portée globale :

# dans le programme principal giflist = []

# dans la fonction Ouvrir() giflist.append(photo)

On peut aussi rendre globale la variable photo avec ce code au début de la fonction Ouvrir() :

global photo

Pour finir, la façon la plus élégante de résoudre ce genre de situation est de pratiquer la programmation orientée objet (encapsulation dans une classe) :voir le programme

Exemple n°9 : gestion du temps

L'heure courante est mise à jour toutes les secondes :

 

Pour cela, on utilise la méthode after() qui appelle une fonction après une durée donnée en millisecondes :

# script #(C) Fabrice Sincère from tkinter import * import time

def maj():

    # on arrive ici toutes les 1000 ms

    (time.strftime('%H:%M:%S'))

    Mafenetre.after(1000,maj)

Mafenetre = Tk()

Mafenetre.title("Heure courante")

# Création d'un widget Label heure = StringVar()

Label(Mafenetre,textvariable=heure).pack(padx=10,pa dy=10) maj()

Mafenetre.mainloop()

Exemple n°10 : widgets Canvas et Button ; gestion du temps

Le script est un exemple d'animation (affichage d'environ 20 disques par seconde) :

 

On se sert de la méthode after() pour actualiser la zone graphique toutes les 50 ms :

# script #(C) Fabrice Sincère from tkinter import *

 

import random

def Cercle():

    """ Dessine un cercle de centre (x,y) et de rayon r """     global Arret     x = random.randint(0,Largeur)     y = random.randint(0,Hauteur)     r = 10

    Canevas.create_oval(x-r, y-r, x+r, y+r, outline='red', fill='red')     if Arret == False:

        # appel de la fonction Cercle() après une pause de 50 millisecondes

        Mafenetre.after(50,Cercle)

def Arreter():

""" Arrêt de l'animation """ global Arret Arret = True

def Demarrer():

    """ Démarre l'animation """     global Arret     Canevas.delete(ALL)     if Arret == True:         Arret = False

        Cercle() # un seul appel à cette fonction

Arret = True

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title('Animation')

# Création d'un widget Canvas

Largeur = 480

Hauteur = 320

Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ='white')

(padx =5, pady =5)

# Création d'un widget Button (bouton Démarrer)

BoutonGo = Button(Mafenetre, text ='Démarrer', command = Demarrer)

(side = LEFT, padx = 10, pady = 10)

# Création d'un widget Button (bouton Arrêter)

BoutonArreter = Button(Mafenetre, text ='Arrêter', command = Arreter)

(side = LEFT, padx = 5, pady = 5)

# Création d'un widget Button (bouton Quitter)

BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)

(side = LEFT, padx = 5, pady = 5)

Mafenetre.mainloop()

Exemple n°11 : widget Canvas ; gestion du temps

Le script est une animation qui gère le déplacement d'une balle et de ses rebonds sur les bords :

 

# script #(C) Fabrice Sincère

from tkinter import * import math,random

LARGEUR = 480

HAUTEUR = 320

RAYON = 15 # rayon de la balle

# position initiale au milieu

X   = LARGEUR/2

Y   = HAUTEUR/2

# direction initiale aléatoire vitesse = random.uniform(1.8,2)*5 angle = random.uniform(0,2*)

DX = vitesse*(angle) DY = vitesse*(angle)

def deplacement():

    """ Déplacement de la balle """

    global X,Y,DX,DY,RAYON,LARGEUR,HAUTEUR

    # rebond à droite

    if X+RAYON+DX > LARGEUR:

        X = 2*(LARGEUR-RAYON)-X

        DX = -DX

    # rebond à gauche

    if X-RAYON+DX < 0:

        X = 2*RAYON-X

        DX = -DX

    # rebond en bas

    if Y+RAYON+DY > HAUTEUR:

        Y = 2*(HAUTEUR-RAYON)-Y

        DY = -DY

    # rebond en haut

    if Y-RAYON+DY < 0:

        Y = 2*RAYON-Y

        DY = -DY

X   = X+DX

Y   = Y+DY

    # affichage

    Canevas.coords(Balle,X-RAYON,YRAYON,X+RAYON,Y+RAYON)

    # mise à jour toutes les 50 ms

    Mafenetre.after(50,deplacement)

# Création de la fenêtre principale

Mafenetre = Tk()

Mafenetre.title("Animation Balle")

# Création d'un widget Canvas

Canevas = Canvas(Mafenetre,height=HAUTEUR,width=LAR

GEUR,bg='white')

(padx=5,pady=5)

# Création d'un objet graphique

Balle = Canevas.create_oval(X-RAYON,YRAYON,X+RAYON,Y+RAYON,width=1,fill='green')

deplacement() Mafenetre.mainloop()

Exemple n°12 : widgets Canvas et Button ; gestion de la souris

Le script dessine un carré à l'endroit du clic de la souris.

Pour cela, on utilise l'événement associé au clic gauche de la souris.

 

# script #(C) Fabrice Sincère from tkinter import *

def Clic(event):

    """ Gestion de l'événement Clic gauche sur la zone graphique """

    # position du pointeur de la souris

X   = event.x

Y   = event.y

    # on dessine un carré     r = 20

    Canevas.create_rectangle(X-r, Y-r, X+r, Y+r, outline='black',fill='green')

def Effacer():

    """ Efface la zone graphique """

    Canevas.delete(ALL)

# Création de la fenêtre principale

Mafenetre = Tk()

Mafenetre.title('Carrés')

# Création d'un widget Canvas

Largeur = 480

Hauteur = 320

Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ='white')

# La méthode bind() permet de lier un événement avec une fonction :

# un clic gauche sur la zone graphique provoquera l'appel de la fonction utilisateur Clic()

('<Button-1>', Clic)

(padx =5, pady =5)

# Création d'un widget Button (bouton Effacer)

Button(Mafenetre, text ='Effacer', command =

Effacer).pack(side=LEFT,padx = 5,pady = 5)

# Création d'un widget Button (bouton Quitter)

Button(Mafenetre, text ='Quitter', command =

Mafenetre.destroy).pack(side=LEFT,padx=5,pady=5)

Mafenetre.mainloop()

Ce code est détailléici.

Exemple n°13 : widget Canvas ; gestion de la souris

Nous allons voir comment déplacer un objet graphique avec la souris (clic, drag and drop) :

 

# script #(C) Fabrice Sincère from tkinter import *

def Clic(event):

    """ Gestion de l'événement Clic gauche """

    global DETECTION_CLIC_SUR_OBJET

    # position du pointeur de la souris

X   = event.x

Y   = event.y

    print("Position du clic -> ",X,Y)

    # coordonnées de l'objet

    [xmin,ymin,xmax,ymax] = Canevas.coords(Carre)

    print("Position objet -> ",xmin,ymin,xmax,ymax)     if xmin<=X<=xmax and ymin<=Y<=ymax: DETECTION_C

LIC_SUR_OBJET = True

    else: DETECTION_CLIC_SUR_OBJET = False

    print("DETECTION CLIC SUR OBJET ->

",DETECTION_CLIC_SUR_OBJET)

def Drag(event):

    """ Gestion de l'événement bouton gauche enfonc é """

X   = event.x

Y   = event.y

    print("Position du pointeur -> ",X,Y)

    if DETECTION_CLIC_SUR_OBJET == True:

        # limite de l'objet dans la zone graphique

        if X<0: X=0

        if X>Largeur: X=Largeur

        if Y<0: Y=0

        if Y>Hauteur: Y=Hauteur

        # mise à jour de la position de l'objet (dr ag)

        Canevas.coords(Carre,X-TailleCarre,Y-

TailleCarre,X+TailleCarre,Y+TailleCarre)

DETECTION_CLIC_SUR_OBJET = False

# Création de la fenêtre principale

Mafenetre = Tk()

Mafenetre.title("Drag and drop")

# Création d'un widget Canvas

Largeur = 480

Hauteur = 160

TailleCarre = 20

Canevas = Canvas(Mafenetre,width=Largeur,height=Hau teur,bg ='white')

# Création d'un objet graphique

Carre = Canevas.create_rectangle(0,0,TailleCarre*2, TailleCarre*2,fill='maroon')

# La méthode bind() permet de lier un événement ave c une fonction

('<Button-1>',Clic) # évévement clic ga uche (press)

('<B1-Motion>',Drag) # événement bouton gauche enfoncé (hold down)

Canevas.focus_set()

(padx=10,pady=10)

Mafenetre.mainloop()

Exemple n°14 : widgets Canvas et Button ; gestion du clavier

Le script gère le déplacement d'un pion avec le clavier. Pour se faire, on utilise l'événement associé à l'appui d'une touche du clavier.

a

q

l

m

§  touche  déplacement vers le haut

§  touche  déplacement vers le bas

§  touche  déplacement vers la gauche

§  touche  déplacement vers la droite

 

# script #(C) Fabrice Sincère from tkinter import *

def Clavier(event):

    """ Gestion de l'événement Appui sur une touche du clavier """     global PosX,PosY     touche = event.keysym     print(touche)

    # déplacement vers le haut     if touche == 'a':

        PosY -= 20

    # déplacement vers le bas     if touche == 'q':

        PosY += 20

    # déplacement vers la droite

 

    if touche == 'm':

        PosX += 20

    # déplacement vers la gauche     if touche == 'l':

        PosX -= 20

    # on dessine le pion à sa nouvelle position

    Canevas.coords(Pion,PosX -10, PosY -10, PosX +10, PosY +10)

# Création de la fenêtre principale

Mafenetre = Tk()

Mafenetre.title('Pion')

# position initiale du pion

PosX = 230

PosY = 150

# Création d'un widget Canvas (zone graphique)

Largeur = 480

Hauteur = 320

Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ='white')

Pion = Canevas.create_oval(PosX-10,PosY-

10,PosX+10,PosY+10,width=2,outline='black',fill='re d')

Canevas.focus_set()

('<Key>',Clavier)

(padx =5, pady =5)

# Création d'un widget Button (bouton Quitter)

Button(Mafenetre, text ='Quitter', command =

Mafenetre.destroy).pack(side=LEFT,padx=5,pady=5)

Mafenetre.mainloop()

Ce code est détailléici.

Symboles des quelques touches spéciales

'Up', 'Down', 'Left', 'Right' (flèches directionnelles haut, bas, gauche, droite), 'Return' (touche Entrée), 'space' (barre Espace)

Exemple n°15 : widgets Checkbutton et Button ; musiques et sons avec pygame

 

Le module pygame est un module externe de création de jeux vidéo en 2D. pygame contient un sous module pygame.mixer qui permet de charger et de lire des musiques ou des sons dans plusieurs formats (mp3, ogg, wav ).

La procédure d'installation de pygame se trouveici.

# script

#(C) Fabrice Sincère # python version 3.2 # pygame version 1.9.2 from tkinter import * import pygame

()

("chavmusic7.mp3")

# réglage volume

pygame.mixer.music.set_volume(0.3)

son1 = pygame.mixer.Sound("") son1.set_volume(0.5)

son2 = pygame.mixer.Sound("") son2.set_volume(1.0)

def PlaySon1():     () def PlaySon2():     () def Music():

    print(())

    if () == 1:

        # 1 (ON)

        # joue en boucle

        (-1)

    else:

        # 0 (OFF)

        ()

# Création de la fenêtre principale (main window)

Mafenetre = Tk()

Mafenetre.title("Checkbutton widget + Pygame.mixer" )

# Création d'un widget Button

Button(Mafenetre,text="son 1",command=PlaySon1).pac k(side=LEFT,padx=10,pady=10)

# Création d'un widget Button

Button(Mafenetre,text="son 2",command=PlaySon2).pac k(side=LEFT,padx=10,pady=10)

# Création d'un widget Checkbutton musique = IntVar() (1) # ON

Checkbutton(Mafenetre,text="Musique de fond",variab le=musique,command=Music).pack(side=LEFT,padx=10,pa dy=10)

Music()

Mafenetre.mainloop()

Télécharger le

Télécharger le

Télécharger la musiquechavmusic7.mp3

Exercices

Exercice 7.1 ★ En s'inspirant des

scripts et , écrire une application avec interface graphique qui calcule la racine carrée d'un nombre.

Par exemple, le calcul de √3 donne :

 

Exercice 7.2 ★ Reprendre le script de manière à limiter le nombre d'essais à trois.

Exercice 7.3 ★ En s'inspirant des

scripts et , écrire une application avec interface graphique qui calcule l'addition ou la soustraction de deux nombres :

 

Exercice 7.4 ★ A partir du script , dessiner des disques de positions, rayons et couleurs aléatoires :

 

Exercice 7.5 ★ A partir du script , faire une animation avec des disques de positions, rayons et couleurs aléatoires.

 

Exercice 7.6 ★★ A partir du script , faire une animation qui gère la trajectoire d'un nombre quelconque de balles :

 

Remarque : on ne tiendra pas compte des chocs entre balles.

Exercice 7.7 ★★

1)     Reprendre le script et remplacer le disque noir par une image :

 

Télécharger l'

Remarque : l'image de l'impact doit avoir un fond transparent.

2)     En s'inspirant du script , ajouter un effet sonore ().

Exercice 7.8 ★★ En s'inspirant du script , faire l'animation d'un mouvement aléatoire brownien.

On utilisera la méthode create_line() de la classe Canvas.

 

Exercice 7.9 ★ Compléter le script de manière à dessiner une grille.

On utilisera la méthode create_line() de la classe Canvas.

 

Exercice 7.10 ★★

Ecrire un script qui tire une carte et l'affiche à une position aléatoire.

 

Il faut se servir d'une référence comme dans le script Télécharger les images des 52 cartes et un squelette du scriptici.

Quelques idées de projets

Projet n°1 ★★★ Jeu Tic-Tac-Toe (jeu du morpion) Un projet relativement simple pour un travail en binôme.

Le fichier exécutable est téléchargeableici.

 

Remarque : dans ma version, le code source Python fait une bonne centaine de lignes.

On pourra compléter ce projet par une version en réseau (plus d'informationsici).

Projet n°2 ★★★★★ Jeu de Tetris avec classement en ligne Un gros projet à décomposer en plusieurs tâches :

§     jeu en local avec Python

§     applications Web(en PHP ou CGI-Python, base de données MySQL)

§    

§     (essayez !)

§    

§    

§    

§    

 

§     Télécharger le fichier exécutable

Le fichier exécutable est téléchargeableici.

Projet n°3 ★★★★ Jeu de SnakeDuel

Un jeu qui se joue à deux, ou seul contre l'ordinateur.

Le fichier exécutable est téléchargeableici.

 

Projet n°4 ★★★★ Jeu de Pong Un jeu qui se joue à deux.

Le fichier exécutable est téléchargeableici.

 

Projet n°5 ★★★★ Puzzle

Le fichier exécutable est téléchargeableici.

 

Projet n°6 ★★★ Simulation de feux de forêt

 

Liens utiles :

§ 

§ 

Projet n°7 ★★★ Distance entre deux villes


 

Vous aurez besoin des modules urllib et json ainsi que de l'Google Maps.

Programmes exécutables pour Windows

Pas besoin d'avoir Python sur votre machine !

Les programmes exécutables (extension .exe) des exercices et de la plupart des projets sont téléchargeablesici (7 Mo). Décompresser ensuite l'archive.

Pour jouer à Tetris (par exemple), lancer le

programme

Plus d'informations sur les jeux. Have fun !

Chapitre 8 - Lecture et écriture dans un fichier

Un fichier stocke des informations sur un support physique (disque dur, clé USB, CD, DVD, carte mémoire SD ).

Ouvrir un fichier consiste à le charger dans la mémoire vive (RAM) de l'ordinateur (c'est une mémoire volatile : elle s'efface quand on éteint l'ordinateur).

Enregistrer un fichier consiste à l'écrire sur un support physique de stockage (l'information est alors conservée de manière permanente).

Il existe deux types de fichiers :

§  Les fichiers textes : l'information est stockée sous forme de caractères lisibles par un éditeur de texte (principalement des lettres et des chiffres).

§  Les fichiers binaires : l'information est stockée en binaire (une suite d'octets dont la valeur est comprise entre 0x00 et 0xFF).

Ecriture dans un fichier

Le mode write

L'écriture dans un fichier se fait avec la fonction open() en mode écriture :

# script

NomFichier = ''

# création et ouverture du fichier en mode write 'w' (écriture)

# si le fichier existe déjà, il est écrasé Fichier = open(NomFichier, 'w')      # instanciation de l'objet Fichier de la classe file

# écriture dans le fichier avec la méthode write()

Fichier.write('Bonjour à tous !')

# fermeture du fichier avec la méthode close()

Fichier.close()

Le fichier est créé dans le répertoire courant (sous Windows c'est normalement le répertoire C:/PythonXX, mais on peut aussi choisir un emplacement quelconque en spécifiant le chemin absolu, par exemple NomFichier = 'F:/Mon ').

Vous pouvez vérifier son contenu en l'ouvrant avec un éditeur de texte (ou même avec un logiciel de traitement de texte) :

Remarques sur le codage des caractères

Pour Python, le codage par défaut des caractères est cp1252 (Windows1252) sous Windows, et UTF-8 sous GNU/Linux.

Avec le codage cp1252, le fichier fait 16 octets :

Avec le codage UTF-8, le fichier fait 17 octets !

La différence est due au codage du caractère accentué à :

1 octet (0xE0) pour le codage cp1252 et 2 octets (0xC3 0xA0) pour le codage UTF-8.

Les autres caractères ont un codage commun sur un octet (codage ASCII).

Une bonne pratique est de spécifier l'encodage, par exemple :

Fichier = open(NomFichier, 'w', encoding='utf8')

Le mode append

Pour écrire à la fin d'un fichier, on utilise la fonction open() en mode ajout.

Repartons du fichier précédent :

# ouverture du fichier en mode append 'a' (ajout)

Fichier = open('', 'a')  # instanciation de l'objet Fichier

Fichier.write('\nUne deuxième ligne.\n')# '\n' saut de ligne

Fichier.write('abc\tABC\t123\n') # '\t' tabulation

Fichier.write(str(126.85)+'\n')  # str() transforme un nombre en chaîne de caractères

Fichier.write('\x31\x41\x61\n')  # écriture de '1Aa' en code ASCII

Fichier.write(chr(0x62)+'\n')    # écriture de 'b' en code ASCII

Fichier.write(chr(99))                # écriture de

'c' en code ASCII

Fichier.close()

Ce qui donne :

Lecture dans un fichier

Lecture en mode texte

La lecture dans un fichier texte se fait avec la fonction open() en mode lecture :

# ouverture du fichier en mode read 'r'

(lecture en mode texte)

Fichier = open('', 'r')      # instanciation de l'objet Fichier de la classe file # lecture dans le fichier avec la méthode read() chaine = () # affichage du contenu du fichier print('Contenu du fichier :\n' + chaine) # fermeture du fichier avec la méthode close()

Fichier.close()

>>> 

Contenu du fichier :

Bonjour à tous !

Une deuxième ligne.

abc ABC

126.85 1Aa b c

123

Lecture en mode binaire

En mode texte, un fichier est lu caractère par caractère.

En mode binaire, un fichier est lu octet par octet : c'est un peu différent !

Par exemple, si on veut la taille d'un fichier, il faut utiliser la lecture en mode binaire 'rb' (read binary) :

# ouverture du fichier en mode read binary 'rb' (lecture en mode binaire) Fichier = open('', 'rb') data = ()

# affichage de la taille du fichier print('Taille du fichier :', len(data), 'octets')

# affichage du contenu (en hexadécimal) import binascii print(binascii.hexlify(data))

# fermeture du fichier avec la méthode close()

Fichier.close()

>>> 

Taille du fichier : 69 octets b'426f6e6a6f757220e020746f757320210d0a556e652064657 57869e86d65206c69676e652e0d0a6162630941424309313233

0d0a3132362e38350d0a3141610d0a620d0a63'

La taille du fichier est 69 octets avec le codage cp1252 (sous Windows) et 65 octets avec le codage UTF-8 (sous Linux).

Avec la lecture en mode texte 'r', on obtient 63 octets avec le codage cp1252 (sous Windows) et 65 octets avec le codage UTF-8 (sous Linux) !

Pourquoi ce décalage ?

Car sous Windows, un saut de ligne est codé sur 2 octets (0x0D 0x0A) et le caractère spécial d'une chaîne \n sur un seul octet !

Sous Linux, c'est plus simple avec un saut de ligne codé sur un seul octet (0x0A).

En définitive :

63 + 2 (2 caractères accentués à et è) = 65

63 + 6 (6 sauts de ligne) = 69

Sérialisation des données avec le module Pickle

Le module Pickle est extrêmement pratique pour sauvegarder dans un fichier des structures de données comme les listes (type list) ou les dictionnaires (type dict).

Pickling

Un exemple de sauvegarde d'un dictionnaire :

import pickle

# création d'un dictionnaire departement = {36: 'Indre', 30: 'Gard', 75: 'Paris'}

# enregistrement du dictionnaire dans un fichier Fichier = open('', 'wb') (departement, Fichier)    # sérialisation Fichier.close()

Unpickling

L'opération inverse est tout aussi simple :

import pickle

# récupération du dictionnaire

Fichier = open('', 'rb')

Dept = (Fichier)    # désérialisation Fichier.close()

print(Dept)

print(Dept[36])

>>> 

{75: 'Paris', 36: 'Indre', 30: 'Gard'}

Indre

Exercices

Exercice 8.1 : fichiers binaires et fichiers textes

Les fichiers suivants sont-ils de type binaire ou de type texte ?

§  Une photo au format JPEG

§  Une image au format PNG § Une image au format SVG

§  Un fichier audio au format MP3

§  Un document texte au format TXT

§  Une page web au format HTML

§  Un fichier exécutable (extension .exe)

§  Un document au format PDF

§  Un fichier compressé au format ZIP

§  Un script en langage Python (extension .py)

Exercice 8.2

1)  Créer un fichier texte contenant une suite aléatoire de chiffres.

On utilisera la fonction randint() du module random.

2)  Avec un logiciel tel que 7-Zip, compresser le fichier avec différents algorithmes (zip, gzip, bzip2).

Le taux de compression (en %) est donné par la formule : 100×(taille initiale - taille après compression)/taille initiale

Comment expliquer ce taux de compression modeste (au mieux 57 %)?

Projet

Election des délégués de classe par un vote électronique

Ecrire un ensemble de scripts qui gère une élection par vote électronique. On utilisera des fichiers pour stocker la liste électorale, les mots de passe, la liste des candidats et le résultat des votes.

Pour une sécurité optimale, le vote se fera sur un ordinateur seul (sans connexion réseau, sans connexion à Internet ).

Exemple d'interface :

>>> 

Election des délégués de classe

 

Actuellement, 18 élèves ont voté (sur 30)

Identifiant ? martin Mot de passe ?

L'authentification a réussi.

Electeur : Martin Rémi Liste des candidats :

Durand Yohan    --> 0 Barot Pauline   --> 1 Dupont Simon    --> 2

Vote blanc      --> 3

Quel est votre choix ? 1 Confirmer votre choix : 1

A voté !

Merci et bonne journée.

>>> 

Résultat de l'élection des délégués de classe

Nombre de votants : 30 / 30

Durand Yohan    -->  5 voix (17.9 %)

Barot Pauline   -->  16 voix (57.1 %)

Dupont Simon    -->  7 voix (25.0 %)

Vote blanc      -->  2 voix

Chapitre 10 - Traitement des images

Les images au format PGM

Le format PGM (portable graymap file format) est utilisé pour des images en niveau de gris.

C'est un format d'image matricielle, sans compression, assez peu utilisé mais qui présente l'intérêt d'être facilement manipulable.

Conversion d'une image JPEG dans le format PGM avec le logiciel GIMP

Commencez par copier sur votre Bureau une image en couleur de format quelconque (JPEG, PNG, BMP, GIF, PPM ). Par exemple :

 

Télécharger le fichier

Avec le logiciel de traitement d'images GIMP, nous allons convertir cette image dans le format PGM : Ouvrir le fichier avec GIMP

Fichier → Enregistrer sous

Sélectionner le type de fichier (selon l'extension) → Image PGM

Exporter

Formatage des données → Brut

Enregistrer

 

Renommez ce fichier :

Télécharger le fichier

Un exemple de traitement : l'inversion de couleurs

Le script permet d'inverser les couleurs d'une image.

On obtient ainsi le "négatif" :

 

# script import imghdr, struct

 

print("Inversion d'une image PGM en mode binaire à 256 niveaux de gris\n")

NomFichierSource = ''

NomFichierDestination = ''

print('Fichier source :',NomFichierSource) print('Fichier

destination :',NomFichierDestination)

def Inversion(octet):

    # cette fonction fait une inversion du niveau de gris

    # 0 (noir)    -> 255 (blanc)     # 255 (blanc) -> 0 (noir)     return 255-octet

if (NomFichierSource)=='pgm': # test du format de l'image

    FichierSource = open(NomFichierSource,'rb')     TailleFichier = len(())     print('\nTaille du fichier (en octets) :',TailleFichier)

    Largeur = int(input('Largeur de l\'image (en pixels) ? '))

    Hauteur = int(input('Hauteur de l\'image (en pixels) ? '))

    NbPixel = Largeur*Hauteur

    TailleEntete = TailleFichier - Largeur*Hauteur

    (0)

    # extraction de l'en-tête

    # la variable Entete est une chaîne d'octets (type bytes)

    Entete = (TailleEntete)

    # extraction des données

    # Data est une liste de nombre entiers (type list)

    # la fonction int() retourne le contenu d'un octet sous forme d'un entier

    Data = [int(i) for i in ()] compréhension de listes     FichierSource.close()

    if NbPixel == len(Data):

        print('Nombre de pixels :',Largeur*Hauteur)         print("Nombre d'octets de données :",len(Data))

        print("Taille de l'en-tête :",TailleEntete)

        FichierDestination = open(NomFichierDestination,'wb')

        # écriture de l'en-tête du fichier destination

        FichierDestination.write(Entete)

        # écriture des données du fichier destination         for i in Data:

#

            # conversion de type : int en bytes   

FichierDestination.write(('B',Inversion( i)))

        FichierDestination.close()         print('Travail terminé !')

    else:

        print('Erreur dans la saisie des données !')

else:     print("Ce n'est pas une image PGM !")

>>> 

Inversion d'une image PGM en mode binaire à 256 niveaux de gris

Fichier source :

Fichier destination :

Taille du fichier (en octets) : 153654

Largeur de l'image (en pixels) ? 480

Hauteur de l'image (en pixels) ? 320

Nombre de pixels : 153600

Nombre d'octets de données : 153600

Taille de l'en-tête : 54

Travail terminé !

Le script crée le fichier dans le répertoire courant.

Affichons l'en-tête des fichiers image PGM :

>>> import binascii

>>> print(binascii.hexlify(Entete)) # contenu de l'en-tête en hexadécimal b'50350a232043524541544f523a2047494d5020504e4d20466 96c7465722056657273696f6e20312e310a343830203332300a 3235350a'

>>> print(Entete)    # contenu de l'en-tête en chaîne de caractères b'P5\n# CREATOR: GIMP PNM Filter Version 1.1\n480 320\n255\n'

>>> 

L'en-tête contient en particulier la largeur et la hauteur de l'image (480 pixels x 320 pixels) et le nombre 255 (soit 256 niveaux de gris).

La couleur d'un pixel est codée sur un octet.

On va du noir (0x00) au blanc (0xff) en passant par tous les niveaux de gris.

>>> print(Data[0],hex(Data[0]))      # premier octet

: pixel en haut à gauche de l'image

153 0x99

>>> print(Data[1],hex(Data[1])) # deuxième octet : pixel à droite du précédent

142 0x8e

>>> print(hex(Data[479])) # 480ème octet : pixel en haut à droite

0xbf

>>> print(hex(Data[480])) # 481ème octet : pixel de la deuxième ligne à gauche

0x92

>>> print(hex(Data[153599]))  # dernier octet : pixel en bas à droite de l'image (320ème ligne)

0x25

Avec un éditeur hexadécimal, observons le contenu du fichier :

et comparons avec le contenu du fichier :

Inversion de couleurs avec le logiciel GIMP

Il suffit de faire :

Couleurs → Inverser

La librairie Pillow (Python Imaging Library)

Cette librairie spécialisée de Python fournit des outils de traitement d'images.

Pour la petite histoire, Pillow est un fork de l'ancienne librairie PIL.

Installation sur tablette ou smartphone sous Android

Dans Google Play, rechercher puis installer l'applicationQPython - Python .

Installation sous Windows ou GNU/Linux

Pillow n'est pas présente par défaut.

Il faut donc la télécharger et l'installer.

Traitement d'images avec la librairie Pillow

Le script suivant permet de convertir une photo en couleur au format JPEG en une image en niveau de gris au format PGM, puis de la transposer (retournement, miroir).

Les résultats sont affichés dans des fenêtres graphiques indépendantes et enregistrés dans des fichiers images :

# Pillow 6.0.0

# importation du module Image de la librairie Pillow from PIL import Image

# ouverture de l'image img = ('') # affichage de l'image ()

# affichage de la taille de l'image (en pixels) print()

# conversion au format PPM (en couleur) et enregistrement de l'image ('','PPM') ()

# conversion en niveau de gris (pour obtenir le format PGM) img0 = img.convert('L')

# enregistrement dans le fichier ('') ()

# retournement de l'image img1 = img0.rotate(180)

# affichage et enregistrement de l'image retournée

() ('')

# miroir horizontal img2 = img0.transpose(Image.FLIP_LEFT_RIGHT) () ('')

# miroir vertical img3 = img0.transpose(Image.FLIP_TOP_BOTTOM) () ('')

>>> 

(480, 320)

Dessiner avec la librairie Pillow

Le module ImageDraw de la librairie Pillow permet de créer des formes géométriques simples dans une image : ligne, cercle, rectangle, texte

Voici un script qui fabrique l'image d'un camembert 2D (au format PNG) :

 

# script

# Python 2.7 & Python 3

# Pillow 6.0.0

from PIL import Image,ImageDraw

# création d'une image 400x400 (fond blanc) img = ("RGB",(400,400),"#FFFFFF")

# création d'un objet Draw dessin = (img)

# dessine un arc partiel et le remplit

dessin.pieslice((50,50,350,350),0,60,fill="blue") dessin.pieslice((50,50,350,350),60,150,fill="gray") dessin.pieslice((50,50,350,350),150,360,fill="red")

# dessine du texte

((50,20),"camembert 2D",fill="red")

("","PNG") ()

Exercices

Exercice 10.1 ★ 1) Reprendre le script de manière à

réduire l'image initiale à deux couleurs (noir et blanc) en utilisant un seuil :

 

2) Faire la même chose avec le logiciel GIMP.

Exercice 10.2 ★★

1)  Reprendre le script de façon à retourner l'image (rotation à 180 degrés) :

 

2)  Faire la même chose avec le logiciel GIMP.

Exercice 10.3 ★★

1)  Reprendre le script afin de faire une transformation miroir horizontal :

 

2)  Faire la même chose avec le logiciel GIMP.

Exercice 10.4 ★★

1)  Reprendre le script afin de faire une transformation miroir vertical :

 

2)  Faire la même chose avec le logiciel GIMP.

Exercice 10.5 ★ Redimensionnement d'une image JPEG

A l'aide de la méthode resize() du module Image de la librairie Pillow, redimensionner une image JPEG.

Par exemple :

>>> 

Redimensionnement d'une image JPEG

Nom de l'image originale ?

Taille de l'image originale : (largeur, hauteur) =

(1944, 2592)

Nouvelle taille :

Hauteur en pixels ? 800 Largeur en pixels : 600

Enregistrement de l'image redimensionnée

Nom de l'image redimensionnée ?

>>> 

Exercice 10.6 ★★ Calcul du diamètre d'un disque

1) A l'aide de la méthode getpixel() du module Image de la librairie Pillow, estimer le diamètre d'un disque blanc d'une image à fond noir. getpixel((x,y)) retourne la couleur du pixel de coordonnées (x,y).

Par exemple :

 

>>> 

Nom du fichier ?

Largeur en pixels :  380

Hauteur en pixels :  250

Nombre de pixels (blanc) :  8820

Position du centre : x = 129.0 y = 100.0

Diamètre en pixels : 105.971565925

>>> 

Chapitre 11 - Débogage

Ledébogueur est un outil utile au débutant car il aide à comprendre le fonctionnement d'un script existant.

Pour un professionnel, il permet le test et la mise au point d'un script en cours de développement (détection et élimination desbugs).

Il existe plusieurs outils de déboguage sous Python, notamment le module standard pdb (en ligne de commande).

Nous ne nous intéresserons qu'au débogueur de l'environnement IDLE (en mode graphique).

Exemple d'utilisation du débogueur

Commencer par télécharger le

Ce script affiche le carré des nombres entiers de 1 à 5.

Nous allons tester son bon fonctionnement avec le débogueur de l'environnement IDLE.

Ouvrir IDLE :

Démarrer → Programmes → Python → IDLE (Python GUI)

Puis lancer le débogueur : Debug → Debugger

Cocher les cases Source et Globals :

N.B. Les copies d'écran ont été réalisées avec Python 2.7, et cela reste valable avec Python 3.

Le débogueur possède 5 boutons de commande :

Go

§    : Exécution normale du programme jusqu'au prochain point d'arrêt.

Step

Over

§    : Exécution pas-à-pas (instruction par instruction)

§    : Exécution pas-à-pas du programme principal (le débogueur ne rentre pas dans les fonctions)

§    Out : Pour sortir de la fonction en cours § Quit : Termine le programme

Dans l'interpréteur intéractif (Python Shell), ouvrir le script : File → Open →

La fenêtre du code source s'ouvre.

Dans cette fenêtre : Run → Run Module (ou touche F5)

Pas-à-pas grossier

Pour faire du pas-à-pas grossier, cliquer sur le bouton Over du débogueur :


 

Noter que l'on peut observer le contenu des variables (actuellement a vaut 4).

Pas-à-pas détaillé

Pour faire du pas-à-pas détaillé, cliquer sur le bouton Step du débogueur. Pour sortir immédiatement d'une fonction, utiliser le bouton Out (en particulier pour sortir du script qui gère la fonction print()).

Point d'arrêt (Breakpoint)

Dans la fenêtre du code source, sur la ligne d'instruction considérée, faire un clic droit et choisir Set Breakpoint (la ligne est alors surlignée en jaune) :

 

Puis utiliser le bouton Go.

Exercices

Exercice 11.1 A l'aide du débogueur, étudier la fonction récursive factorielle()qui retourne la factorielle d'un nombre entier :

def factorielle(x):     if x < 2:         return 1     else:

        result = x*factorielle(x-1)         return result

print(factorielle(5))

N.B. Une fonction récursive est une fonction qui s'appelle elle-même !

Exercice 11.2 A l'aide du débogueur, étudier lasuite de Conway dont le script est disponible ici :

>>> 

0   1

1   11

2   21

3   1211

4   111221

5   312211

6   13112221

7   1113213211

8   31131211131221

9   13211311123113112211

10   11131221133112132113212221

réer un programme exécutable avec Py2exe

L'extension Py2exe permet de convertir un script Python en un programme exécutable (uniquement pour le système d'exploitation Windows).

Ce programme exécutable (fichier avec l'extension .exe) peut ensuite être lancé sur un ordinateur où Python n'est pas installé.

Téléchargement et installation de Py2exe

Il faut un ordinateur avec Windows et Python déjà installé (attention :

Py2exe ne supporte pas la version 3 de Python).

Le programme d'installation de Py2exe est disponible ici :

Avec une machine 32 bits et Python version 2.7, vous devez utiliser le fichier suivant :

Une fois téléchargé, il suffit d'exécuter ce fichier pour installer Py2exe.

Utilisation de Py2exe

A titre d'exemple, voici le script d'un jeu de puissance 4 :

 

Télécharger et enregistrer ce script dans le répertoire où est installé Python (chez moi, c'est le répertoire C:\Python27).

Créer le script :

# from import setup import py2exe setup(windows=[""])

Enregistrer le script dans le répertoire courant de Python.

Remarques

§   si vous voulez disposer de la console en plus de l'interface graphique

(GUI),

remplacer setup(windows=[""]) par set up(console=[""])

§ pour traiter plusieurs scripts en même temps, il suffit de compléter la liste :

setup(windows=["",""," "])

Ouvrir l'interpréteur de commande de Windows (Démarrer → Exécuter → cmd)

Placez-vous dans le répertoire courant de Python (commande cd : change directory) :

> cd C:\Python27

puis lancer Py2exe :

> python py2exe

Chapitre 13 - Jeux vidéo avec le module Pygame

 

Dans le cadre du projet de la spécialité ISN (bac S), si vous êtes intéressés par la création de jeux vidéo en 2D, il existe le module Pygame de Python.

Attention : le choix de ce type de projet demande un investissement initial important, et cela ne doit pas empiéter sur les autres disciplines

Du point de vue technique, Pygame se base sur la bibliothèque.

Aperçu des possibilités de Pygame

De nombreux jeux sont disponibles et téléchargeables sur le site officiel de Pygame :

Installation de Pygame (sous Windows)

Il faut d'abord installer Python version 3.2 :

puis installer la version correspondante de Pygame :

Test avec le jeu SpaceAce

Vous pouvez tester le bon fonctionnement en téléchargeant le jeu SpaceAce :

 

L'archive estici (à extraire).

Un bug à corriger : il faut renommer le fichier en Pour lancer le jeu, ouvrir et exécuter le script avec Python.

Vous noterez que le code source fait environ 300 lignes. Règle du jeu

Chapitre 14 - Applications et jeux en réseau

Les applications et jeux en réseau se basent sur le modèle clients/serveur.

Au niveau de la programmation, la tâche est ardue car il faut avoir des connaissances en réseau (module socket) et en multithreading (module threading) :

-     Un socket permet de connecter deux machines à travers un réseau. Ainsi, pour un jeu en réseau avec 10 joueurs (soit 10 clients et 1 serveur), il faut créer 10 sockets (chaque client est connecté au serveur). Dans le cas du réseau Internet, les sockets se servent du protocole IP (couche réseau) et du protocole TCP pour la couche transport (il existe aussi le protocole UDP qui est plus simple, plus rapide mais non fiable).

-     Le multithreading est une technique qui permet d'exécuter plusieurs tâches (thread) en même temps et de manière indépendante dans un même processus.

Pour un jeu en réseau avec 10 joueurs, le serveur utilisera 10 threads pour communiquer individuellement avec chaque client.

Chaque thread gère donc le socket du client.

On retrouve le multithreading du côté de l'application cliente : pour traiter l'émission et la réception en parallèle, on utilise un thread pour parler au serveur, et un autre pour écouter le serveur.

Exemple : un QCM en réseau

Il s'agit d'un jeu multijoueurs.

On peut y jouer en réseau local (LAN) ou sur Internet.

Chaque joueur lance son application cliente pour se connecter au serveur. La première étape consiste à créer un pseudonyme, puis quand le nombre de joueurs est suffisant (3 dans l'exemple ci-dessous), la partie commence.

Le serveur envoie alors simultanément la première question à l'ensemble des joueurs : le but est d'y répondre correctement et le plus rapidement possible.

Quand tout le monde a répondu ou si la limite de temps est dépassée, on passe à la question suivante

Un classement est établi à partir d'un système de points.

Le serveur

Avant toute chose, il faut lancer le serveur.

Le port par défaut est 50026 et le nombre de joueurs est 3.

Mais on peut choisir pour le numéro de port une valeur arbitraire comprise entre 49152 et 65535, ainsi qu'un nombre quelconque de joueurs : il suffit de modifier ces paramètres dans le script.

Les clients

Ici, on joue à trois en réseau local (chez vous, derrière votre box, par exemple).

Pour se connecter au serveur, il faut connaître son adresse IP (192.168.1.10) et le port qu'il utilise (50026).

Python étant multiplateforme, on peut mélanger les systèmes d'exploitation : Windows, Linux, Mac Dans cet exemple :

§  le serveur et un client tournent sur le même ordinateur sous Linux/Ubuntu (192.168.1.10)

§  un deuxième client sur un ordinateur sous Windows (192.168.1.11)

§  un troisième client sur un troisième ordinateur sous Linux/Ubuntu (192.168.1.13)


   

 

Finalement, c'est Ubuntu qui gagne devant Windows ;)

Remarques

Cette application fonctionne mais est loin d'être parfaite : les pertes de connexion ne sont pas gérées, etc

Si vous avez testé cette application, cela m'intéresse d'avoir un retour de votre part.

Télécharger les scripts

§  serveur

§  client (mode graphique avec Tkinter)

§  client (mode console)

Projet

Jeu Tic-Tac-Toe en réseau (jeu du morpion)

Ecrire l'application serveur et l'application cliente d'un jeu de morpion en réseau local (LAN) ou sur Internet (plus d'informations) :

 

Bibliographie

Le cours de Gérard Swinnen, avec deux exemples concrets à essayer (un chat et un jeu de bombardes) :

§ 

§  livre de Brandon Rhodes et John Goerzen :

§  Foundations of Python Network Programming () La documentation officielle de Python :

§ 

§ 

Un module Python pour l'étude des circuits électriques linéaires en régime continu

Ce module pédagogique s'appuie sur l'écriture des lois de l'électricité pour résoudre un problème donné.

Ce n'est donc pas un logiciel de simulation.

Installation

pip install dc-electricity

Documentation

Version française

English version

Exemple 0 - Loi d'Ohm

Une résistance de 100 Ω est alimentée par une tension de 5 volts.

Que vaut le courant dans la résistance ? Quelle est la puissance consommée ?

>>> from dcelectricity.dc_fr import *

>>> loi = Loi()

>>> U = Tension(5)

>>> R = Resistance(100)

>>> I = (v=U, r=R)

>>> I

Intensité du courant : 0.05 A (50.000000 mA)

>>> P = loi.Joule(r=R, i=I)

>>> P

Puissance : 0.25 W (250.000000 mW)

On peut aussi utiliser des expressions littérales.

Notez que si l'expresssion est "inattendue", vous aurez droit à un message d'erreur :

>>> I = U/R

>>> I

Intensité du courant : 0.05 A (50.000000 mA)

>>> I = R/U

TypeError

Pour la puissance :

>>> P = R*I*I

>>> P = U*(U/R)

>>> P = U*I

Exemple 0b - Résistance équivalente

Que vaut la résistance équivalente à l'association en parallèle de 2 résistances 1 kΩ et 1,5 kΩ ?

>>> from dcelectricity.dc_fr import *

>>> loi = Loi()

>>> R1 = Resistance(1, 'k')

>>> R2 = Resistance(1.5, 'k')

>>> Req = loi.Rparallele(R1, R2)

>>> Req

Résistance : 600.000000 Ω

Voici une notation équivalente bien pratique :

>>> Req = R1//R2

>>> Req

Résistance : 600.000000 Ω

Avec les équations littérales :

>>> Req = 1/(1/R1+1/R2)

>>> Req = R1*(R2/(R1+R2))

Enfin, en passant par les conductances :

>>> G1 = 1/R1

>>> G2 = 1/R2

>>> Geq = G1 +G2

>>> Geq

Conductance : 0.00166667 S (1.666667 mS)

>>> Req = 1/Geq

>>> Req

Résistance : 600.000000 Ω

Exemple 1

On s'intéresse au circuit électrique suivant :

 

Données :

E = 12 V ; R1 = 1 kΩ ; R2 = 2,7 kΩ et R3 = 1,8 kΩ

Télécharger les

Ce script calcule les courants I1, I2 et I3, les tensions U1 et U2 et fait un bilan de puissances.

>>> from dcelectricity.dc_fr import *

>>> E = Tension(12)

>>> E

Tension : 12.000000 V

>>> R1 = Resistance(1, 'k')

>>> R1

Résistance : 1000 Ω (1.000000 kΩ)

>>> R2 = Resistance(2.7, 'k')

>>> R3 = Resistance(1.8, 'k')

>>> R23 = R2//R3  # résistances en parallèle

>>> R23

Résistance : 1080 Ω (1.080000 kΩ)

>>> Req = R1 +R23  # résistances en série

>>> Req

Résistance : 2080 Ω (2.080000 kΩ)

>>> I1 = E/Req  # Loi d'Ohm

>>> I1

Intensité du courant : 0.00576923 A (5.769231 mA)

>>> V1 = R1*I1  # Loi d'Ohm

>>> V1

Tension : 5.769231 V

>>> V2 = E -V1  # Loi des branches

>>> V2

Tension : 6.230769 V

>>> I2 = V2/R2  # Loi d'Ohm

>>> I2

Intensité du courant : 0.00230769 A (2.307692 mA)

>>> I3 = I1 -I2  # Loi des nœuds

>>> I3

Intensité du courant : 0.00346154 A (3.461538 mA)

Une autre approche :

>>> loi = Loi()

>>> # diviseur de tension

>>> V2 = loi.DiviseurTension(vtotal=E, r=R2//R3, r2=R1) >>> V2

Tension : 6.230769 V

>>> # Théorème de Millman

>>> masse = Tension(0)

>>> V2 = loi.Millman(v_r=[(E, R1), (masse, R2), (masse, R3)])

>>> V2

Tension : 6.230769 V

>>> (E/R1)/(1/R1 +1/R2 +1/R3)

Tension : 6.230769 V

>>> V2/E

0.5192307692307693

>>> # diviseur de courant

>>> I3 = loi.DiviseurCourant(itotal=I1, r=R3, r2=R2) >>> I3

Intensité du courant : 0.00346154 A (3.461538 mA) >>> I1*R2/(R2 +R3)

Intensité du courant : 0.00346154 A (3.461538 mA)

Puissances et loi de Joule

>>> P = E*I1  # puissance fournie par la source E

>>> P

Puissance : 0.0692308 W (69.230769 mW)

>>> P1 = loi.Joule(r=R1, i=I1)

>>> P1

Puissance : 0.033284 W (33.284024 mW) >>> R1*I1*I1

Puissance : 0.033284 W (33.284024 mW) >>> loi.Joule(r=R1, v=V1)

Puissance : 0.033284 W (33.284024 mW) >>> V1*(V1/R1)

Puissance : 0.033284 W (33.284024 mW)

>>> P2 = loi.Joule(r=R2, i=I2)

>>> P2

Puissance : 0.0143787 W (14.378698 mW)

>>> P3 = loi.Joule(r=R3, i=I3)

Puissance : 0.021568 W (21.568047 mW)

>>> P1 +P2 +P3

Puissance : 0.0692308 W (69.230769 mW)

Exemple 2a

Le même circuit électrique mais avec une résistance R3 ajustable :

Etude de l'évolution de U2 en fonction de R3

R3 = ? 0

Propriétés de R3 :

Résistance : 0.000000 Ω Propriétés de U2 :

Tension : 0.000000 V

R3 = ? 100

Propriétés de R3 :

Résistance : 100.000000 Ω Propriétés de U2 :

Tension : 1.055375 V

R3 = ?

Télécharger les

etexemple2a_analyse_para

Exemple 2b

On utilise ici le module matplotlib pour faire de belles courbes :


   

 

Télécharger les

etexemple2b_analyse_para

Exemple 3

On cherche la valeur de R3 qui donne U2 = 6,00 V. On utilise une méthode dichotomique :

Itération  R3 (Ω)               U2 (V)

1           5000.0   

7.641509433962264

2           2500.0   6.7782426778242675

3           1250.0  

5.5290102389078495

4           1875.0    6.303501945525291

5           1562.5   

5.969049373618275

6           1718.75    6.146947223180407

7           1640.625   

6.060929983965794

8           1601.5625  

6.0157594420795215

9           1582.03125    5.992601726263872

10         1591.796875    6.004229291252643

11         1586.9140625    5.998427762523782

12         1589.35546875   

6.001331580654524

13         1588.134765625    

5.99988043623693

14         1588.7451171875    6.000606199456697

15         1588.43994140625    6.000243365618415

16         1588.287353515625   

6.000061912872932

17         1588.2110595703125    

5.99997117754154

Résultat : 1588.2110595703125 Ω

Télécharger les

Avantages et limitations

Ce module gère les opérations arithmétiques de base (+, -, *, /) ainsi que // qui désigne deux résistances en parallèle.

La cohérence des unités est contrôlée :

>>> V3 = V1 -V2 +I3

TypeError

>>> I = I1 +0.5

TypeError

>>> I2 = Courant(0.5)

>>> I = I1 + I2

>>> I = 5*I2 -V1/R1 + I3

Le résultat d'une opération doit donner une grandeur dont l'unité est en volt, ampère, ohm, siemens, watt ou sans unité. Autrement, vous aurez une erreur :

>>> R1/V1  # Ω/V -> Erreur

TypeError

>>> R2*(R3/(R2 +R3))  # Ω*(Ω/Ω) -> Ω*() -> Ω

>>> R2*R3/(R2 +R3)  # Ω*Ω -> Erreur

TypeError

>>> P = V1*(V1/R1)  # V*(V/Ω) -> V*A -> W

>>> P = V1*V1/R1  # V*V -> Erreur

TypeError

>>> V1()**2/R1()

Un module Python pour l'étude des circuits électriques linéaires en régime continu

Ce module pédagogique s'appuie sur l'écriture des lois de l'électricité pour résoudre un problème donné.

Ce n'est donc pas un logiciel de simulation.

Installation

pip install dc-electricity

Documentation

Version française

English version

Exemple 0 - Loi d'Ohm

Une résistance de 100 Ω est alimentée par une tension de 5 volts.

Que vaut le courant dans la résistance ?

Quelle est la puissance consommée ?

>>> from dcelectricity.dc_fr import *

>>> loi = Loi()

>>> U = Tension(5)

>>> R = Resistance(100)

>>> I = (v=U, r=R)

>>> I

Intensité du courant : 0.05 A (50.000000 mA)

>>> P = loi.Joule(r=R, i=I)

>>> P

Puissance : 0.25 W (250.000000 mW)

On peut aussi utiliser des expressions littérales.

Notez que si l'expresssion est "inattendue", vous aurez droit à un message d'erreur :

>>> I = U/R

>>> I

Intensité du courant : 0.05 A (50.000000 mA)

>>> I = R/U

TypeError

Pour la puissance :

>>> P = R*I*I

>>> P = U*(U/R)

>>> P = U*I

Exemple 0b - Résistance équivalente

Que vaut la résistance équivalente à l'association en parallèle de 2 résistances 1 kΩ et 1,5 kΩ ?

>>> from dcelectricity.dc_fr import *

>>> loi = Loi()

>>> R1 = Resistance(1, 'k')

>>> R2 = Resistance(1.5, 'k')

>>> Req = loi.Rparallele(R1, R2)

>>> Req

Résistance : 600.000000 Ω

Voici une notation équivalente bien pratique :

>>> Req = R1//R2

>>> Req

Résistance : 600.000000 Ω

Avec les équations littérales :

>>> Req = 1/(1/R1+1/R2)

>>> Req = R1*(R2/(R1+R2))

Enfin, en passant par les conductances :

>>> G1 = 1/R1

>>> G2 = 1/R2

>>> Geq = G1 +G2

>>> Geq

Conductance : 0.00166667 S (1.666667 mS)

>>> Req = 1/Geq

>>> Req

Résistance : 600.000000 Ω

Exemple 1

On s'intéresse au circuit électrique suivant :

 

Données :

E = 12 V ; R1 = 1 kΩ ; R2 = 2,7 kΩ et R3 = 1,8 kΩ Télécharger les

Ce script calcule les courants I1, I2 et I3, les tensions U1 et U2 et fait un bilan de puissances.

>>> from dcelectricity.dc_fr import *

>>> E = Tension(12)

>>> E

Tension : 12.000000 V

>>> R1 = Resistance(1, 'k')

>>> R1

Résistance : 1000 Ω (1.000000 kΩ)

>>> R2 = Resistance(2.7, 'k')

>>> R3 = Resistance(1.8, 'k')

>>> R23 = R2//R3  # résistances en parallèle

>>> R23

Résistance : 1080 Ω (1.080000 kΩ)

>>> Req = R1 +R23  # résistances en série

>>> Req

Résistance : 2080 Ω (2.080000 kΩ)

>>> I1 = E/Req  # Loi d'Ohm

>>> I1

Intensité du courant : 0.00576923 A (5.769231 mA)

>>> V1 = R1*I1  # Loi d'Ohm

>>> V1

Tension : 5.769231 V

>>> V2 = E -V1  # Loi des branches

>>> V2

Tension : 6.230769 V

>>> I2 = V2/R2  # Loi d'Ohm

>>> I2

Intensité du courant : 0.00230769 A (2.307692 mA) >>> I3 = I1 -I2  # Loi des nœuds

>>> I3

Intensité du courant : 0.00346154 A (3.461538 mA)

Une autre approche :

>>> loi = Loi()

>>> # diviseur de tension

>>> V2 = loi.DiviseurTension(vtotal=E, r=R2//R3, r2=R1) >>> V2

Tension : 6.230769 V

>>> # Théorème de Millman

>>> masse = Tension(0)

>>> V2 = loi.Millman(v_r=[(E, R1), (masse, R2), (masse, R3)])

>>> V2

Tension : 6.230769 V

>>> (E/R1)/(1/R1 +1/R2 +1/R3)

Tension : 6.230769 V

>>> V2/E

0.5192307692307693

>>> # diviseur de courant

>>> I3 = loi.DiviseurCourant(itotal=I1, r=R3, r2=R2) >>> I3

Intensité du courant : 0.00346154 A (3.461538 mA) >>> I1*R2/(R2 +R3)

Intensité du courant : 0.00346154 A (3.461538 mA)

Puissances et loi de Joule

>>> P = E*I1  # puissance fournie par la source E

>>> P

Puissance : 0.0692308 W (69.230769 mW)

>>> P1 = loi.Joule(r=R1, i=I1)

>>> P1

Puissance : 0.033284 W (33.284024 mW) >>> R1*I1*I1

Puissance : 0.033284 W (33.284024 mW) >>> loi.Joule(r=R1, v=V1)

Puissance : 0.033284 W (33.284024 mW) >>> V1*(V1/R1)

Puissance : 0.033284 W (33.284024 mW)

>>> P2 = loi.Joule(r=R2, i=I2)

>>> P2

Puissance : 0.0143787 W (14.378698 mW)

>>> P3 = loi.Joule(r=R3, i=I3)

Puissance : 0.021568 W (21.568047 mW)

>>> P1 +P2 +P3

Puissance : 0.0692308 W (69.230769 mW)

Exemple 2a

Le même circuit électrique mais avec une résistance R3 ajustable :

Etude de l'évolution de U2 en fonction de R3

R3 = ? 0

Propriétés de R3 :

Résistance : 0.000000 Ω Propriétés de U2 :

Tension : 0.000000 V

R3 = ? 100

Propriétés de R3 :

Résistance : 100.000000 Ω Propriétés de U2 :

Tension : 1.055375 V

R3 = ?

Télécharger les

etexemple2a_analyse_para

Exemple 2b

On utilise ici le module matplotlib pour faire de belles courbes :

 

 

 

Télécharger les

etexemple2b_analyse_para

Exemple 3

On cherche la valeur de R3 qui donne U2 = 6,00 V. On utilise une méthode dichotomique :

Itération  R3 (Ω)               U2 (V)

1           5000.0   

7.641509433962264

2           2500.0   6.7782426778242675

3           1250.0  

5.5290102389078495

4           1875.0    6.303501945525291

5           1562.5   

5.969049373618275

6           1718.75    6.146947223180407

7           1640.625   

6.060929983965794

8           1601.5625  

6.0157594420795215

9           1582.03125    5.992601726263872

10         1591.796875    6.004229291252643

11         1586.9140625    5.998427762523782

12         1589.35546875   

6.001331580654524

13         1588.134765625    

5.99988043623693

14         1588.7451171875    6.000606199456697

15         1588.43994140625    6.000243365618415

16         1588.287353515625   

6.000061912872932

17         1588.2110595703125    

5.99997117754154

Résultat : 1588.2110595703125 Ω

Télécharger les

Avantages et limitations

Ce module gère les opérations arithmétiques de base (+, -, *, /) ainsi que // qui désigne deux résistances en parallèle.

La cohérence des unités est contrôlée :

>>> V3 = V1 -V2 +I3

TypeError

>>> I = I1 +0.5

TypeError

>>> I2 = Courant(0.5)

>>> I = I1 + I2

>>> I = 5*I2 -V1/R1 + I3

Le résultat d'une opération doit donner une grandeur dont l'unité est en volt, ampère, ohm, siemens, watt ou sans unité. Autrement, vous aurez une erreur :

>>> R1/V1  # Ω/V -> Erreur

TypeError

>>> R2*(R3/(R2 +R3))  # Ω*(Ω/Ω) -> Ω*() -> Ω

>>> R2*R3/(R2 +R3)  # Ω*Ω -> Erreur

TypeError

>>> P = V1*(V1/R1)  # V*(V/Ω) -> V*A -> W

>>> P = V1*V1/R1  # V*V -> Erreur

TypeError

>>> V1()**2/R1()

Decouvrir ces documents

  • Apprendre à Programmer avec Python facilement

    Apprendre à Programmer avec Python facilement

  • Cours pour apprendre Python

    Cours pour apprendre Python

  • Apprendre à utiliser le Framework webware pour Python

    Apprendre à utiliser le Framework webware pour Python

  • Débuter avec le Framework Spyce pour Python Cours

    Débuter avec le Framework Spyce pour Python Cours

  • Support de cours Python pour apprendre à utiliser le Framework Flask

    Support de cours Python pour apprendre à utiliser le Framework Flask

  • Support de cours python pour débuter avec le Framework RapidSMS

    Support de cours python pour débuter avec le Framework RapidSMS

  • Apprendre à utiliser les bases de données en python

    Apprendre à utiliser les bases de données en python

  • Apprendre la programmation python sous QGIS

    Apprendre la programmation python sous QGIS

Articles connexes

  • 9 façons amusantes et créatives d’apprendre l’anglais
  •  Comment s’améliorer en informatique avec plaisir ?
  • Quelle langue choisir pour booster ma carrière : espagnol, chinois, une autre ?
  • Quels sont les meilleurs éditeurs EDI / IDE pour votre code Python ?
  • Fiche méthode : comment apprendre une leçon ?
  • Apprendre l'anglais PRO pour se démarquer au travail
  • L’importance d’apprendre l’anglais pro pour les futurs ingénieurs
  • Échecs pour débutants: Où et comment commencer votre aventure stratégique
  • Contactez-nous
  • A propos de nous
  • On recrute
  • Rechercher dans le site
  • Politique de confidentialité
  • Droit d'auteur/Copyright
  • Conditions générales d'utilisation
  • Plan du site
  • Accueil
  • Blog
  • Finance et compta.
  • Formations Pro.
  • Logiciels & Apps
  • Organisation
  • Cours informatique
  • Aide à la rédaction
  • Etudes et Metiers
  • Science et Tech
  • Titans de la Tech
id 11354 02