Académique Documents
Professionnel Documents
Culture Documents
2022-2023
PRÉSENTATION SEMESTRE
Déroulement Contenu
10 semaines (2h CM, 1h TP, 2h TP) Semaines 1 et 2 : programmation impérative (non évaluée)
1/3 CC (FIL ROUGE ½ travail, ¼ ccf et ¼ rapport/git) Rappels
Rendu d’un rapport et d’un dépôt GIT de l’application (forge Unicaen) Méthodes spéciales 2
Docstring et Pydoc
3
LANGAGES D’IMPLÉMENTATION
WYSIWYG
Programmation Python Java
Haut niveau
Langages de haut niveau
C COBOL C++
Langages de bas niveau
Langages d’assemblage
Programmation
Bas niveau Langages Machine
Architecture matérielle
5
Paradigmes de
programmation
Programmation Programmation
impérative déclarative
Données Entrée X
Fonctions Fonctions
globales
Données Données
Fonction 1 Fonction 2 Fonction 3
Fonction f
Objet 1 Fonctions Objet 2
Données Données Données
locales locales locales
Données Sortie f(X)
Objet 3
6
INTERPRÉTATION
Langage à interpréter
if __name__ == "__main__":
if a==b:
b=5
Données de sortie
8
ENVIRONNEMENT DE TRAVAIL
C . Python
Stations de travail de l’université, ordinateurs exploités par une Stations de travail de l’université, ordinateurs exploités par une
distribution Linux UBUNTU distribution Linux UBUNTU
Ordinateurs personnels OS X / MacOS fonctionne avec un Langage multiplateforme
système UNIX
Ordinateurs personnels Windows :
Installer un logiciel de virtualisation (par exemple VirtualBox d’Oracle
est libre et opensource, https://www.virtualbox.org/)
Télécharger ubuntu desktop : https://ubuntu.com/download/desktop
L’installer comme une machine virtuelle grâce à l’outil de virtualisation
Les deux systèmes (windows er ubuntu) vont cohabiter
3 2
11
VARIABLES ET MÉMOIRE
C . Python
1. #include <stdio.h>
2.
3. int main() {
4. /* my first program in C */ 1. # my first program in Python
5. int i; 2. i = -3*2
6. i = -3*2; 3. print("Val :”, i)
7. printf("Val : %d \n", i);
8. return 0;
9. }
Ligne 1 : fichier de définition Ligne 1 : commentaire non pris en compte par le compilateur
Ligne 2 : saut de ligne (purement esthétique) Ligne 2 : définition de variable, calcul et affectation
Ligne 3 : début de l’exécution du bloc de programme principal Ligne 3 : affichage
Ligne 4 : commentaire non pris en compte par le compilateur
Ligne 5 : définition de variable
Ligne 6 : calcul et d’affectation
Ligne 7 : affichage
Ligne 8 : fin du programme principal avec la valeur 0
Ligne 9 : marque de fin de bloc de programme principal
12
VARIABLES ET MÉMOIRE
C . Python
Entier
… … Valeurs
? ? ? 11111111 11111010 ? ? ?
Mémoire 32 bits
… 0000
A16B
0000
A16C
0000
A16D
0000
A16E
0000
A16F
0000
A170
0000
A171
0000
A172
… Adresses (4Go = 232 = 4 294 967 296 cases
Labels de 00000000 à FFFFFFFF)
i Val : -6
|
DÉCLARATION DE VARIABLES
13
ET DE CONSTANTES
C . Python
Déclaration Python C
[[un]signed] type maVariable [= valeur] ;
Implicite :
Variables short i ;
i = 2020 signed short i ;
unsigned short i = 2020 ;
const [[un]signed] type maVariable [= valeur] ;
Pas de déclarations spécifiques const double PI = 3.1416
Constantes
Natives : True, False, None #define MA_CST val
#define PI 3.1416
CONSTRUCTION D’EXPRESSIONS
C . Python
Expression : combinaison d’opérandes et d’opérateurs
Opérande : constante, variable, littéral, expression
Opérateur : arithmétique, comparaison, logique (booléen), accès (composite)
Évaluation : selon priorité, associativité (droite ou gauche) et regroupements forcés (parenthèses, crochets) des opérateurs
Opérateurs Opérateurs Opérateurs
Python C Associativité Python C Associativité
arithmétiques De Python C Associativité logiques
comparaison
Incrémentation ++ Droite Négation not ! Droite
Infériorité
Décrémentation -- Droite < < Négation
Priorité croissante
stricte ~ ~ Droite
binaire
Multiplication * * Gauche
Infériorité <= <=
Et inclusif
Division / / Gauche & & Gauche
Supériorité binaire
> >
Quotient // / Gauche stricte
Ou inclusif
| ^ Gauche
Modulo % % Gauche Supériorité >= >= binaire
Addition + + Gauche Égalité == == Gauche Conjonction and && Gauche
Soustraction - - Gauche inégalité != != Gauche Disjonction or || Gauche
Exponentiation ** Gauche Affectation et opérateur combinés possible en C et Python : +=, -=, *=, /=, %=
15
TYPES
C . Python
Numériques De base
short, int, long, long long (tous signed or unsigned) Entiers (int) i=3
Float, double, long double (tous signed or unsigned) flottants (float) f=3.1416
Alphanumériques Booléens (bool) b=True
char (signed or unsigned) Séquences
char * Chaines de caractère (str) s="Bonjour" ou ‘Bonjour’
Enumérés Listes (list) l=[1,3,"bonjour",[4.2,5],False]
bool Tuples(tuple) t=(1,3,"bonjour",[4.2,5],False)
BOOLÉENS
C . Python
int flag = 1;
while (flag) {
… flag = 0; … flag = True
}
while flag:
bool flag = true; … flag = False …
while (flag) {
… flag = false; …
}
!(A % 400) || !(A % 4) && A % 100; not(A % 400) or not(A % 4) and A % 100;
17
C . Python
MUTABILITÉ DES TYPES
De base
Pas de modifications directes des valeurs des
Entiers (int) i = 3
variables. Passage obligé par une nouvelle
affectation de la variable. flottants (float) f=3.1416
Booléens (bool) b=True
n = 3.4 Types
n = -1.2 non mutables Séquences
s = "bonjour"
Chaines de caractère (str) s="Bonjour" ou ‘Bonjour’
s = s + " à tous !"
Tuples(tuple) t=(1,3,"bonjour",[4.2,5],False)
Modifications directes possibles des valeurs Listes (list) l=[1,3,"bonjour",[4.2,5],False]
des variables.
l[3] = "toto" Types mutables Dictionnaires(dict)
d["trois"] = True d={0:1,6:"bonjour","trois":False}
18
s + ‘ Python’ C h a i n e P y t h o n
-8 -7 -6 -5 -4 -3 -2 -1 Paquetage automatique
t = 1, 2, 3
0 1 2 3 4 5 6 7
l + (‘ ’, 3) P y t h o n 3 Dépaquetage automatique
a, b, c = t
20
del(l[3]) L i s e
input retourne toujours une chaine de caractère (str) 1bis. print(nom, "-", int(age) + 1, "ans.")
Typage fort age + 1 produirait une erreur ! 2bis. print(nom + "-" + str(int(age) + 1) + "ans.")
PRINCIPALES FONCTIONS UTILES
22
DE BASE DE PYTHON
C . Python
Intégrées au langage (built-in functions – fonctions natives)
Transtypage Calcul numérique/logique Séquences, Infos, I/O Documentation
int(val) min(intseq) range(deb, fin, pas) dir(val)
float(val) max(intseq) zip(seq, seq) help(val)
bool(val) abs(num) reversed(seq)
str(val) eval(str) sorted(seq)
tuple(val) pow(base, num, mod) len(seq)
frozenset(val) round(num) type(val)
list(val) sum(intseq) print(val)
dict(val) all(boolseq) input(str)
set(val) any(boolseq) open(str, mode, encodage)
if (a%400 == 0) {
printf("%d bissextile", a); if a%400 == 0:
} else if (a%4 == 0) { print(a, "bissextile")
if (a%100 == 0) { elif a%4 == 0:
printf("%d non bissextile", a); if a%100 == 0:
} else { print(a, "non bissextile")
printf("%d bissextile", a); else:
} print(a, "bissextile")
} else { else:
printf("%d non bissextile", a); print(a, "non bissextile")
}
BOUCLES C . Python
#include <stdio.h> reponse = "n"
while reponse == "n" :
int main(){ reponse = input("Terminé o/n ?")
#include <stdio.h>
int main(){
char reponse;
do { Pas de do-while
printf("Terminé o/n ?");
reponse = getchar();
} while (reponse == "n");
return 0;
}
for (int i=0, i<5, i++) { for (int i=5, i>0, i--) { for i in range(5): for i in range(5, 1, -1):
printf("%d\n", i); printf("%d\n", i); print(i) print(i)
} }
25
for val in [1, 2, 3, 4]: for cle in {"Fabrice":49, "Isabelle":49, "Julien":20 , "Samuel":18}:
print(val, end="-") print(cle, end="-")
Les listes possèdent également de nombreuses méthodes qui peuvent s’avérer très Beaucoup d’autres fonctions ou
pratiques. On appelle méthode une fonction qui agit sur l’objet auquel elle est attachée méthodes exploitant les listes existent
par un ‘.’ dans de nombreux modules qu’il suffit
d’importer. Elles peuvent aussi être
attachées au module par l’opérateur ‘.’ si
>>> l = [1, 2, 3] Certaines méthodes sont programmées pour ne pas retourner de seul le nom est importé
>>> l += [4] >>> l = [1, 2, 3] valeur : append, extend, …
d’autres si : count, join, … >>> import random
>>> l.append(5) >>> l.extend([4, 5, 6]) >>> l = [1, 2, 3, 4, 5]
>>> l >>> l random.shuffle(l)
>>> [1, 2, 3, 4, 5] [1, 2, 3, 4, 5, 6] >>> l
>>> l = [‘a’, ‘b’, ‘c’, ‘b’] >>> l = [‘a’, ‘b’, ‘c’] [2, 3, 6, 4, 1, 5]
>>> l.count(‘b’) >>> ‘-’.join(l) >>> random.choice(l)
2 ‘a-b-c’ 3
27
>>> new_liste = [traitement(val) for val in [1, 2, 3]] >>> new_liste = [traitement(val) for val in [1, 2, 3] if <condition>]
>>> mots = "Bonjour à tous".split() Astuce : Combinaisons intéressantes avec certaines fonctions natives comme any, all ou sum
>>> [mot.lower() for mot in mots if len(mot) > 1 >>> any(‘o’ in mot for mot in mots)
>>> ["bonjour", "tous"] True
>>> sum(len(mot) for mot in mots) / len(mots) >>> all(‘o’ in mot for mot in mots)
>>> 4.0 False
28
FONCTIONS C . Python
#include <stdio.h>
#include <math.h>
double f(double x) {
def f(x):
double y = pow(x, 2)-2*x+1;
y = x**2-2*x+1
return y;
return y
}
val = input("Entrer valeur x : ")
int main() {
y = f(float(val))
printf("Entrer valeur x : ");
print("y =", y)
scanf("%lf",&val);
double y = f(val);
printf("y = %f", y);
return 0
}
29
def increment_erreur(val=1):
nb_erreur = nb_erreur + val
def a_perdu():
return nb_erreur == 10
>>> nb_erreur = 10
>>> print(nb_erreur)
10
>>> print(aPerdu())
False
>>> increment_erreur()
UnboundLocalError: local variable
'nb_erreur' referenced before assignment
30
def increment_erreur(val=1):
Création/accès variable locale nb_erreur = nb_erreur + val
Pas de modification de la variable globale !
def a_perdu():
Accès variable globale return nb_erreur == 10
def increment_erreur(val=1):
Accès/Modification variable global nb_erreur
globale nb_erreur = nb_erreur + val
def a_perdu():
Accès variable globale return nb_erreur == 10
l1 Labels
PASSAGE DES PARAMÈTRES PAR
35
l1 l2 Labels
PASSAGE DES PARAMÈTRES PAR
36
l1 l2 Labels
PASSAGE DES PARAMÈTRES PAR
37
… ? 1 2 3 ? ? ? ? … Valeurs
… 0000
E4B3
0000
E4B4
0000
E4B5
0000
E4B6
0000
E4B7
0000
E4B8
0000
E4B9
0000
E4BA
… Adresses
l2 Labels
41
PRINT_PLATEAU C . Python
void print_plateau(int allumettes) { def print_plateau(allumettes):
for (int i=0; i<allumettes; i++) { print("|" * allumettes, end="")
printf("|");
if allumettes > 0:
}
print("- Il reste", allumettes, "allumettes")
if (allumettes>0) {
printf("- Il reste %d allumettes\n", allumettes);
else:
} else { print("Plus d’allumettes – Jeu terminé")
printf("Plus d'allumettes - Jeu terminé\n"); print()
}
printf("\n");
}
LE JEU DE NIM :
45
LA PARTIE C . Python
int partie_nim() { def partie_nim():
int allumettes = 20; allumettes, gagne = 20, False
int gagne = 0;
print_plateau(allumettes)
print_plateau(allumettes);
while allumettes > 0:
while (allumettes > 0) {
allumettes -= choix_humain(allumettes);
allumettes -= choix_humain(allumettes)
if (allumettes == 0) { if allumettes == 0:
gagne = 1; gagne = True
} else { else:
allumettes -= choix_ordinateur(allumettes); allumettes -= choix_ordinateur(allumettes)
} if gagne:
}
print("Comment avez-vous triché ?")
if (gagne==1) {
printf("Comment avez-vous triché ?");
else:
} else { print("Encore l’ordinateur qui gagne…")
printf("Encore l'ordinateur qui gagne..."); return allumettes
}
return allumettes;
}
AUTRE EXEMPLE :
47
1. Il est possible d’arrêter le programme avec des erreurs 1. Utilisation du dépaquetage implicite lorsqu’une fonction
prédéfinis et des messages d’erreur spécifiques retourne plusieurs valeurs
(mécanisme de levée d’exception : raise) 2. L’opérateur * force le dépaquetage. Solution pratique pour
2. Utilisation de l’opérateur ternaire de branchement fournir une valeur à chaque paramètre d’une fonction
conditionnel pour construire la chaine du rationnel alors que ces valeurs sont stockées dans une séquence
48
PROBLÈMES
AVANTAGES ET INCONVÉNIENTS
Texte brut en français : Bienvenu chez Sébastien (23 octets ASCII ou 46 octets
UNICODE)
Texte encodé avec la norme UTF-8 :
Bienvenu chez Sébastien (28 octets UTF-8)
Bienvenu chez Sébastien (29 octets UTF-8)
55
>>>
test.txt
Mot1
Mot2
Mot3
Mot4
57
test.txt
f
Mot1
Mot2
Mot3
Mot4
58
Mot1
f
Mot2
Mot3
Mot4
59
f
Mot1
Mot2
Mot3
Mot4
60
Mot1
‘t1\n’
[‘Mot2\n’, ‘Mot3\n’, ‘Mot4\n’]
Mot2
Mot3
Mot4 f
61
Mot1
‘t1\n’
[‘Mot2\n’, ‘Mot3\n’, ‘Mot4\n’]
>>> with open(‘test.txt’, ‘r’, encoding=‘utf-8’) as f:
Mot2
Mot3
Mot4
62
Mot1
‘t1\n’
[‘Mot2\n’, ‘Mot3\n’, ‘Mot4\n’]
>>> with open(‘test.txt’, ‘r’, encoding=‘utf-8’) as f:
Mot2
print(f.read())
‘Mot1\nMot2\nMot3\nMot4’
Mot3
Mot4 f
63
• Lecture de la ligne courante depuis la position courante (retour à la ligne inclus) : f.readline()
• Lecture des lignes restantes d’un fichier (basée sur le retour à la ligne inclus) : f.readlines() ou list(f)
• Écriture à la position courante : write(), ne pas oublier le ‘\n’ pour imposer un retour à la ligne
• Position courante exprimée en octets pour un fichier binaire (par un nombre obscur utile pour f.seek dans un fichier texte) : f.tell()
• Autres déplacements dans un fichier binaire : f.seek(n, pos) : +n octets à partir de pos 1 (début), 2 (courant) ou 3 (fin)
• Autres déplacements dans un fichier texte : f.seek(0, 2) pour aller à la fin du fichier ou f.seek(val) avec val obtenu par f.tell()
ce
Bonjour à toi. Ne soit pas >>> with open(‘test.txt’, ‘r’, encoding=‘utf-8’) as f: de
triste à la lecture de ce >>> texte = f.read() lecture
dernier slide du cours >>> mots = [mot.lower() for mot in texte.split() if mot[-1] == ‘e’] ne
d’introduction à la >>> print(mots) slide
programmation ! [‘ne’, ‘triste’, ‘lecture’, ‘de’, ‘ce’, ‘slide’] triste
test.txt
res.txt
list(d.items()) [('a‘, 18), ('o', 3), ('n',3), ('b‘, 5), ('u‘, 5), ('j‘, 0)]
Astuce pour travailler sur un dictionnaire trié sur les clés Astuce pour travailler sur un dictionnaire trié sur les valeurs
>>> d = {‘b’: 25, ‘c’: 10, ‘a’: 50} >>> d = {‘b’: 25, ‘c’: 10, ‘a’: 50}
>>> sorted(list(zip(d.keys(), d.values()))) >>> sorted(list(zip(d.values(), d.keys())))
[(‘a’, 50), (‘b’, 25), (‘c’, 10)] [(10, ‘c’), (25, ‘b’), (50, ‘a’)]
NOTION DE GRILLES
0 1 2 3 4 5
0 0 1 2 3 4 5
Case Cases repérées par un entier de 0 à nb_lig * nb_col - 1
1 6 7 8 9 10 11
2 12 13 14 15 16 17
3 18 19 20 21 22 23
4 24 25 26 27 28 29 Cases repérées par un numéro de ligne de 0 à nb_lig - 1
(i, j)
et un numéro de colonne de 0 à nb_col - 1
nb_lig = 5
nb_col = 6
68
0 @0
>>> grille = creer(5, 6, 0)
>>> grille[4][2] = 10 1 @0 0 1 2 3 4 5
>>> print(grille[3][2]) 2 @0 0 0 10 0 0 0
10
3 @0
4 @0
@grille
71
return res 3 @3
0 1 2 3 4 5
4 @4
0 0 10 0 0 0
>>> grille = creer(5, 6, 0) @grille
>>> grille[4][2] = 10
72
L’opération [:] pour faire une copie est inadaptée aux grilles
COPIE DE LISTES
Une solution est de faire sa propre fonction comme copy_iteratif
1
def copy_iteratif(l):
res = []
for line in l:
>>> grille = [[1, 2], [3, 4]]
new_line = []
1 >>> autre_grille1 = copy_iter(grille)
for val in line:
2 >>> autre_grille2bad = [line for line in grille]
new_line.append(val) 2 >>> autre_grille2bis = [line[:] for line in grille]
res.append(new_line) >>> from copy import deepcopy
return res 3 >>> autre_grille3 = deepcopy(grille)
>>> grille[1][0] = 100
>>> grille
[[1, 2], [100, 4]]
Deux autres solutions : >>> autre_grille1
• 2 Utilisation des listes en compréhension (line[:] peut être [[1, 2], [3, 4]]
remplacé par list(line)) >>> autre_grille2bad
Sans copie explicite, chaque sous-liste a été copiée par référence ! [[1, 2], [100, 4]]
>>> autre_grille2bis
• 3 Utilisation du module deepcopy (fonctionne quelque soit le [[1, 2], [3, 4]]
>>> autre_grille3
niveau d’imbrication)
[[1, 2], [3, 4]]
74
0 4 4 5 5 5
0 3 0 0 5 0
0 3 0 0 6 0
0 2 0 8 7 9
0 2 0 10 0 11
1 1 1 0 0 0
Fonctions
• Dessiner le pendu
Variables globales • Incrémenter erreurs
• tab_pendu et tab_limite • Test victoire
• nb_erreur • Caractère en i, j en fonction du nombre d’erreurs
• Dessiner les vignettes en fonction du nombre d’erreurs
76
tab_pendu = [
[' ', '_', '_', '_', '_', '_‘],
[' ', '|', ' ', ' ', '|', ' ‘],
[' ', '|', ' ', ' ', 'O', ' ‘],
[' ', '|', ' ', '/', '|', '\\‘],
[' ', '|', ' ', '/', ' ', '\\‘],
['_', '|', '_', ' ', ' ', ' ‘]
]
Ce pictogramme indique un exemple de code sur ecampus Fabrice Maurel – L1 INFO/MATH/MIASH – Semestre 2
dans un fichier commençant par NUMCHAP_NUMSLIDE fabrice.maurel@unicaen.fr – 02 31 56 73 97 – S3-364
78
Paradigmes de
programmation
Programmation Programmation
impérative déclarative
S1 S2 S2 S3 S4 S4
Programmation Programmation Programmation
Programmation
procédurale (C, orientée objet (C++, fonctionnelle (Haskell,
logique (Prolog)
Python, Ada...) Python, Java...) lisp, Python…)
Données Entrée X
Fonctions Fonctions
globales
Données Données
Fonction 1 Fonction 2 Fonction 3
Fonction f
Objet 1 Fonctions Objet 2
Données Données Données
locales locales locales
Données Sortie f(X)
Objet 3
79
Fonction 1 Fonction 2
Objet 1 Fonctions Objet 2
Fonction 3
Orienté traitements : « que doit faire Orienté données : « sur quoi porte
le programme ? » le programme ? »
Division en sous-programmes Modélisation des données comme
(fonctions, procédures) des objets
Traitements hiérarchisés Données et traitements encapsulés
80
Fonction 1 Fonction 2
Objet 1 Fonctions Objet 2
Fonction 3
Logique du comportement
Pratique de l’utilisation
Encapsulation
Instanciation
Une propriété est
Soit un attribut : donnée caractérisant l'état de l'objet
Soit une méthode : opération que l'objet est à même de réaliser
84
def __init__(self,texte):
self.mess = texte 1. Appel de la méthode constructeur :
Personne.__init__(p1,"Machin", 40)
def envoi(self,dest):
res = "Cher " + dest + ",\n\n" + self.mess 2. Création des attributs :
return res p1.nom = "Machin"
P1 = Personne("Machin",40) p1.age = 40
p1.vieillir()
Texte = "bon anniversaire pour tes " + str(p1.age) + "ans"
3. Création de la méthode :
print(Message(texte).envoi(p1.nom)) def p1.vieillir(annees=1):
p1.age = p1.age + annees
85
class Personne:
def vieillir(self,annees=1):
self.age = self.age + annees
86
>>> from math import atan2, pi >>> matrice_test = [[1, 2, 3], [4, 3, 2]]
>>> c = Complexe(-3, 4) >>> m = Matrice(matrice_test)
>>> print(c.conjugue()) >>> print(m.nb_lig, m.nb_col)
-3-i4 2, 3
>>> print(c.mul(c)) >>> print(m.matrice_str())
-7-i24 | 1 2 3 |
>>> print(c.module()) | 4 3 2 |
5.0 >>> print(m.matrice_str(m.somme(m)))
>>> print(c.argument()) | 2 4 6 |
>>> 126.86989764584402 | 8 6 4 |
87
person.py
88
def to_string(self):
return f"Je m’appelle {self.name} et j’ai {self.age} ans."
if __name__ == "__main__":
p1 = Human("Toto", 25)
p2 = Human("Tata", 20)
print(p1.to_string()) Je m’appelle Toto et j’ai 25 ans.
print(p2.to_string()) Je m’appelle Tata et j’ai 20 ans.
89
?
def __init__(self, name, age=0):
self.name = name
self.age = age
def to_string(self):
return f"Je m’appelle {self.name} et j’ai {self.age} ans."
if __name__ == "__main__":
p1 = Human("Toto", 25)
p2 = Human("Tata", 20)
print(p1.to_string()) Je m’appelle Toto et j’ai 25 ans.
print(p2.to_string()) Je m’appelle Tata et j’ai 20 ans.
print(p1) <__main__.Human object at 0x0000015227C37070>
print(p2) <__main__.Human object at 0x0000015227C36A10>
90
Ce pictogramme indique un exemple de code sur ecampus Fabrice Maurel – L1 INFO/MATH/MIASH – Semestre 2
dans un fichier commençant par NUMCHAP_NUMSLIDE fabrice.maurel@unicaen.fr – 02 31 56 73 97 – S3-364
92
!?
def __init__(self, name, age=0):
self.name = name
self.age = age
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
p.ageing(-100)
print(p) Je m’appelle Toto et j’ai -75 ans.
93
Solution
def ageing(self, years=1):
if years > 0:
self.age = self.age + years
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
p.ageing(-100) Je m’appelle Toto et j’ai 25 ans.
print(p)
94
Solution
def ageing(self, years=1):
if years > 0:
self.age = self.age + years
partielle !
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {sels.age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
p.age = -100 Je m’appelle Toto et j’ai -75 ans.
print(p)
95
Solution
def ageing(self, years=1):
if years > 0:
self.__age = self.__age + years
complète
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.__age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
print(p.__age) AttributeError: 'Human' object has no
print(p) attribute '__age'
Un attribut privé est inaccessible directement hors de la classe. Conséquence : il est obligatoire de passer par
une méthode prévue à cet effet pour le manipuler correctement (ici en lecture, génère une erreur).
96
Solution
def ageing(self, years=1):
if years > 0:
self.__age = self.__age + years
complète
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.__age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
p.__age = -100
print(p) Je m’appelle Toto et j’ai 25 ans.
Un attribut privé est inaccessible directement hors de la classe. Conséquence : il est obligatoire de passer par
une méthode prévue à cet effet pour le manipuler correctement (ici en écriture, l’affectation n’a pas d’effet).
97
Solution
def ageing(self, years=1):
if years > 0:
self.__age = self.__age + years
complète
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.__age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
p.ageing()
print(p) Je m’appelle Toto et j’ai 26 ans.
Un attribut privé est inaccessible directement hors de la classe. Conséquence : il est obligatoire de passer par
une méthode prévue à cet effet pour le manipuler correctement (ici en écriture, seule la méthode ageing fonctionne).
98
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.__age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
p.ageing()
print(p) Je m’appelle Toto et j’ai 26 ans.
Un attribut privé est inaccessible directement hors de la classe. Conséquence : il est obligatoire de passer par
une méthode prévue à cet effet pour le manipuler correctement (ici en écriture, seule la méthode ageing fonctionne).
99
def ageing(self, years=1): Mutateur (ou setter) : gère l’accès d’un attribut
privé en écriture. Souvent par convention
if years > 0: set_nom_attribut_privé
self.__age = self.__age + years
if __name__ == "__main__":
p = Human("Toto", 25)
p.ageing()
print(p.get_age()) 26
100
def get_age(self):
return self.__age
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.__age} ans."
if __name__ == "__main__":
p = Human("Toto", 25)
p.ageing()
print(p.get_age()) 26
101
def get_age(self):
return self.__age
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.__age} ans."
if __name__ == "__main__":
print(Human.human_counts) 0 Nul besoin de l’existence d’un objet pour l’appeler.
p1 = Human("Toto", 25)
Ici, modification par incrémentation de 1 à chaque
p2 = Human("Tata", 20)
appel du constructeur.
print(Human.human_counts) 2
102
def get_age(self):
return self.__age
def __repr__(self):
return f"Je m’appelle {self.name} et j’ai {self.__age} ans."
if __name__ == "__main__":
print(Human.get_human_counts()) 0 Nul besoin de l’existence d’un objet pour l’appeler.
p1 = Human("Toto", 25) Ici, modification par incrémentation de 1 à chaque appel du
p2 = Human("Tata", 20) constructeur.
print(Human.get_human_counts()) 2
YSINL2A1 – INTRODUCTION À LA POO EN PYTHON
2022-2023
Ce pictogramme indique un exemple de code sur ecampus Fabrice Maurel – L1 INFO/MATH/MIASH – Semestre 2
dans un fichier commençant par NUMCHAP_NUMSLIDE fabrice.maurel@unicaen.fr – 02 31 56 73 97 – S3-364
104
RELATION D'AGRÉGATION
108