Écrire du code python
On va lister les concepts fondamentaux qui permettent d'écrire du code python que l'on pourra faire exécuter par l'interpréteur python. Ces concepts sont identiques pour tous (ou quasi tous) les langages de programmation objet.
À retenir
Dans tous les exemples de code qui suivront, lorsque la ligne de code commencera par >>> cela signifiera que l'on a exécuté ce code directement dans l'interpréteur, la ligne suivante montrera le résultat. Par exemple :
>>> 21 * 2
42
Si l'on veut passer par l'éditeur on écrira du code de cette façon :
x = 21 * 2
print(x)
Il faudra ensuite l'exécuter pour voir son résultat.
À retenir
Dans tous les instructions de code qui suivront (pas les résultats donnés par python), lorsqu'un texte est entre <> cela signifiera que c'est un paramètre variable, ce qu'on peut y mettre étant décrit entre les <>. Par exemple : <un entier> fonctionnera en le remplaçant par un entier quelconque.
- Dans Spyder, la console est une console Ipython, elle ne commence donc pas par
>>>mais parInsuivi d'un numéro entre crochet, par exemple :In [42]. Son fonctionnement est cependant identique. - pour exécuter du code avec spyder, on utilise soit :
- le triangle vert sur l'interface
- le menu run > run
- F5
Testez tous les exemples qui suivent dans un spyder, soit directement dans la console soit via l'éditeur.
Commentaires
Commençons par ne pas écrire du python. Dans une ligne de code python, tout ce qui suit un # n'est pas lu.
Par exemple, le code suivant écrit dans une console ne produit pas d'erreur (il n'est même pas lu...) :
>>> # coucou python !
Alors que le même code sans # est interprété par python et comme ce n'est pas du python cela produit une erreur :
>>> coucou python !
File "<stdin>", line 1
coucou python !
^
SyntaxError: invalid syntax
Objets
Les objets de python correspondent à tout ce qui est manipulé : le but d'un programme python est de créer et de rendre des objets.
Types d'objets
Python connaît 6 types d'objets de base qui permettent de faire la grande majorité des programmes.
- Chaînes de caractères
- exemple :
"python"ou'python' - quelque chose qui commence et fini par
"ou qui commence et fini par'ou encore qui commence et fini par""".
- exemple :
- Réels
- exemple :
2.91ou2.0 - un nombre avec une décimale (qui peut être nulle) notée par un
.
- exemple :
- Entiers
- exemple :
42ou0 - un nombre sans décimale
- exemple :
- Complexes (la notation utilise j à la place de i)
- exemple :
3+2j,1j - un réel ou entier avec une partie imaginaire, notée
j, entière ou imaginaire.
- exemple :
- Booléens
- exemple :
TrueouFalse - que 2 possibilités,
TrueouFalse
- exemple :
- le vide, utilisé pour noter l'absence de valeur
- ne contient qu'un unique élément noté
None
- ne contient qu'un unique élément noté
À retenir
Tout objet de python possède un type.
Pour connaître le type d'un objet, on peut utiliser la fonction type. Par exemple :
>>> type(42)
<class 'int'>
Les entiers sont donc de type class 'int', ce que l'on traduit par : l'entier 42 est objet de la classe entier :
Définition
Chaque objet de python possède un unique type. Ce type est très souvent une classe : Dans le cadre de ce cours on considérera que type et classe sont deux synonymes
À vous :
Quelle est la classe de chaque objet de base ?
solution
solution
>>> type("2")
<class 'str'>
>>> type(2.0)
<class 'float'>
>>> type(2)
<class 'int'>
>>> type(2+0j)
<class 'complex'>
>>> type(True)
<class 'bool'>
Conversion de type
Le type d'un objet n'est pas modifiable : par exemple un entier (3) n'est pas un réel (3.0) et réciproquement. Il est en revanche possible de créer un nouvel objet du type choisi à partir d'un objet d'un autre type. Pr exemple pour créer un objet te type réel depuis un entier 3, on peut écrire : float(3). Ceci se généralise :
Définition
Créer un objet de type <un type> à partir d'un objet <un objet> s'écrit :
<un type>(<un objet>)
On ne peut bien sur pas faire n'importe quoi int("deux") ne crée pas un entier valant 2, mais beaucoup des choses sont possibles.
Conversion entre réels, entiers et chaînes de caractères
On peut par exemple transformer un réel en entier :
Quel est le résultat de l'instruction suivante :
int(3.1415)
solution
solution
>>> int(3.1415)
3
C'est un entier valant 3.
Ou en entier en réel :
Quel est le résultat de l'instruction suivante :
float(3)
solution
solution
>>> float(3)
3.0
C'est un réel valant 3.0
On peut aussi transformer une chaîne de caractères en entier ou en réel. Par exemple :
float("3.1415")
Va rendre un objet réel valant 3.1415 à partir d'une chaîne de caractère avec le caractère "3.1415".
Une chaîne de caractère n'est pas un réel ou un entier.
La conversion de chaînes de caractères en entier ou en réel est très courante lorsque l'on récupère des entrées tapées par un utilisateur. jen effet :
À retenir
Une entrée donnée par un utilisateur est toujours une chaîne de caractères.
Conversion de booléens
On effectue souvent ce genre d'opération de façon implicite pour les booléens. Ainsi, un entier est vrai s'il est non nul.
Vérifiez qu'un entier non nul est Vrai.
solution
solution
>>> bool(42)
True
>>> bool(0)
False
>>> bool(-42)
True
Tous les objets peuvent être converti sen booléen.
Quand-est qu'une chaîne de caractère est fausse ?
solution
solution
Une chaîne de caractère est fausse si elle est vide et vraie sinon.
>>> bool("")
False
>>> bool("False")
True
On peut aussi faire le contraire :
Que vaut la conversion de booléens en entier ?
solution
solution
Une chaîne de caractère est fausse si elle est vide et vraie sinon.
>>> int(True)
1
>>> int(False)
0
Variables
Définition
Une variable est un nom qui représente un objet : une variable n'est pas un objet, c'est un moyen d'y accéder.
Les variables permettent à l'interpréteur de se rappeler d'objets qu'il a crée lors d'exécutions précédentes. Sans elles, on ne pourrait exécuter que des lignes indépendantes les unes entre elles : bref, on ne pourrait rien faire d'intéressant.
Affecter une variable
Définition
Une variable est un nom auquel est associé un objet. Pour associer un nom à un objet on utilise l’opérateur d’affectation = :
<un nom> = <un objet>
À l'issue de l'affectation, la variable à gauche du signe = représentera l'objet à droite de celui-ci.
A gauche de l’opérateur d'affection = se trouve une variable (en gros, un nom ne pouvant commencer par un nombre) et à droite un objet. Après affectation, dans toute la suite du programme l'interpréteur python remplacera la variable par l'objet à chaque fois qu'elle la rencontrera.
Une variable n'est PAS une chaîne de caractères. Une chaîne de caractère est un objet alors qu’un nom n’est qu’un alias vers un objet.
Il est important de comprendre que l’opérateur d’affectation = n’est pas symétrique. À gauche, des variables et à droite, des objets.
Attardons nous un moment sur le processus d'affectation car il est seront crucial pour appréhender les possibilités offertes par les objets.
Considérons le programme suivant :
x = 1
y = 1
y = 3
Et regardons ce qu'il se passe au niveaux des variables et des objets après chaque instruction.
Au départ, avant l'exécution par l'interpréteur de la première ligne le programme ne possède aucune variable ni aucun objet. On possède cependant deux espaces distincts pour les accueillir :

Après l'exécution de la ligne 1, nous sommes dans la situation suivante :

La variable de nom x est affectée à un objet entier valant 1. Notez bien que la variable et l'objet sont deux choses différentes et sont uniquement mis en relation par la flèche. De plus :
On ne peut accéder à un objet en python que via une variable qui lui est affectée.
L'exécution de la deuxième instruction procède de la même manière, à l'issue de celle-ci on se trouve dans l'état suivant :

Notez bien que les objets mis en relations ne sont pas les mêmes, ce sont deux objets de type entier valant 1.
L'instruction de la ligne 3 est identique aux deux précédentes : on associe un objet à une variable. Que cette variables était précédemment n'a pas d'importance : on l'associe à l'objet à droite de l'opérateur d'affectation = :

L'objet précédemment assigné à y n'est plus associé à aucune variable : il n'y a plus aucun moyen d'y acceder. Ces objets non assignés sont supprimés à intervalles réguliers (c’est ce qu’on appelle le garbage collector).
Le même mécanisme est à l'oeuvre si on a une variable à droite de l'opérateur d'affectation =. Considérons le programme suivant :
x = 1
y = 1
y = x
L'instruction de la ligne 3 commence par trouver l'objet à droite de l'opérateur d'affectation = via la variable : c'est l'objet et non la variable qui est associé. Une fois l'objet trouvé, il est assigné à la variable à gauche de l'opérateur d'assignation = :

A retenir
Le mécanisme d'affectation procède en 2 temps :
- on cherche l'objet associé à droite de
= - on affecte l'objet trouvé à la variable à gauche de
=
Pour exécuter une instruction, on commence toujours par remplacer les variables par les objets qu'elles référencent.
Ce mécanisme d'affectation est puissant, il permet par exemple d'affecter plusieurs variables en même temps, comme le montre l’exemple suivant qui échange les objets des noms i et j :
x = 2
y = 3
x, y = y, x
A quels objets sont liés les variables $i$ et $j$ après la ligne 3 de l'exemple précédent ? Comment python procède-t-il pour exécuter cette ligne ?
Solution
Solution
- on commence par chercher les objets à droite du
= - on les affecte aux variables.
Rappelez vous que la variable existe ou pas au moment de l'affectation n'a pas d'importance.
Avant l'exécution de la ligne 3 :

Après l'exécution de la ligne 3 :

Enfin, il est possible d'affecter plusieurs noms à un même objet. Par exemple l'exemple suivant affecte le même entier 1 aux noms x et y :
x = y = 1
Supprimer une variable
On peut supprimer un nom en utilisant le mot clé del.
Dans une console :
>>> x = 2
>>> print(x)
2
>>> del x
>>> print(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Notez bien que seule la variable est supprimée, pas l'objet associé. Considérons par exemple le code suivant, qui affecte le même objet aux variables x et y :
>>> x = 1
>>> y = x

Si on supprime la variable x cela ne supprime pas l'objet (il est aussi affecté à la variable y) :
>>> del x
>>> y
1

L'objet est toujours associé au nom y. Supprimons ce nom :
>>> del y
L'objet n'est plus accessible !

Python utilise un mécanisme nommé ramasse-miettes qui supprime les objets qui ne sont plus accessible via des noms, ce qui permet de gagner de la place mémoire. Une fois le ramasse-miettes passé on se retrouve alors dans l'état :

À retenir
Les objets n'existent que tant qu'on pense à eux (qu'on peut les nommer).
À vous (certains exercices sont liés : utilisez toujours le même interpréteur) :
Affectez la valeur 3 à la variable a, puis affichez à l'écran la valeur associée à la variable a.
solution
solution
>>> a=3
>>> print(a)
3
Affectez la nouvelle valeur 6 à la variable a, puis affichez à l'écran la valeur associée à la variable a.
solution
solution
>>> a=6
>>> print(a)
6
Affectez la valeur 2 à la variable A, puis affichez à l'écran la valeur associée aux variables a et A.
solution
solution
>>> A = 2
>>> print(a)
6
>>> print(A)
2
Les variables sont sensibles à la casse : a est différent de A.
Affectez la valeur 4 à la variable b, puis affectez le résultat de la somme des variables a et b à variable c
solution
solution
>>> b = 4
>>> c = (a + b)/2
>>> print(b)
4
>>> print(c)
5.0
c est un réel.
Affectez en une ligne les valeurs 3 et 12 respectivement aux variables j et k
solution
solution
>>> i, j = 3, 12
Affectez en une ligne la valeur 3 aux variables x, y et z.
solution
solution
>>> x = y = z = 3
Opérations sur les objets
Créer de nouveaux objets avec d'autres objets. Les opérations sur les objets vont des opérations arithmétiques (a + b, a - b, ...) aux tests (a < b) en passant par les opérations logiques (a et b).
Nombres
Les opérations peuvent s'effectuer sur les trois types numériques que sont les entier (classe int), les réels (classe float) et les complexes (classe complex)
Opérateurs
Outre les classiques opérations :
+(addition)-(soustraction)/(division)*(multiplication)
python possède aussi :
//division entière%reste de la division entière**exposant.
Que vaut le quotient et le reste de la division entière de 4538 par 23 ?
solution
solution
>>> 4538 // 23
197
>>> 4538 % 23
7
>>> (4538 // 23) * 23 + 7
4538
Raccourcis d'affectation
Python permet aussi de faire l'opération et de procéder immédiatement à sa réaffectation avec les opérateurs :
x += 1est équivalent àx = x + 1x -= 1est équivalent àx = x - 1x /= 3est équivalent àx = x / 3x *= 2est équivalent àx = x * 2
Chaînes de caractères
Trois opérateur sont courants pour les chaînes de caractères :
- la concaténation avec l'opérateur
+ - la multiplication avec l'opérateur
* - test de présence avec l'opérateur
in
Concatenation et multiplication
Les chaînes de caractères possèdent 2 opérateurs :
- l'addition qui concatène deux chaînes
- la multiplication d'un entier $i$ par une chaîne $c$ qui concatène $i$ fois $c$ à elle même.
Par exemple :
>>> "x" + "y"
'xy'
>>> 3 * "x"
'xxx'
Recopiez 10 fois : "j'aime bien faire du python" en une ligne de python
solution
solution
On peut écrire :
>>> 10 * "J'aime bien faire du python. "
"J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. J'aime bien faire du python. "
Affectez la chaîne de caractères "j'aime bien faire du" à la variable x. Puis ajoutez " python" à x en une ligne de python
solution
solution
On peut écrire :
>>> x = "J'aime bien faire du"
>>> x += " python."
>>> print(x)
J'aime bien faire du python.
Test de présence
Une chaîne de caractère peut être vue comme un conteneur (ordonné) de caractères. Savoir si un caractère ou une sous-chaîne est présent dans une chaîne peut se faire alors avec l'opérateur in, qui rend un booléen :
"c" in "coucou"rendraTrue"cou" in "coucou"rendraTrue"cc" in "coucou"rendraFalse
Booléens
Comparaisons
Comparateurs classiques :
<: strictement plus petit<=: plus petit ou égal>: strictement plus grand>=: plus grand ou égal==: égal!=: différentis: égalité d'objets (en pratique uniquement utilisé pour comparer àNone)
Les comparaisons rendent un booléen. Par exemple : 2 <= 3 rend le booléen True.
Opérations logiques
not: négationor: ou logiqueand: et logique
Notez que les opérateurs logiques s'appliquent à tous les objets, python va comparer leurs représentations sous la forme de booléen. Par exemple
not 2 va rendre True (l'entier 2 est True représenté comme un booléen).
De même, les opérateurs or et and vont rendre des objets comparé, dont les représentation binaires correspondent aux opérateurs logiques :
x or yrendra :xsi la représentation sous la forme d'un booléen de dexestTrueysi la représentation sous la forme d'un booléen de dexestFalse
x and yrendra :ysi la représentation sous la forme d'un booléen de dexestTruexsi la représentation sous la forme d'un booléen de dexestFalse
Cela ne change rien à l'utilisation classique des opérations logiques puisque la représentation sous forme de booléen de l'objet rendu est conforme à ce qu'on attend :
Truesi un des deux paramètres est considéré comme vrai pouror,Falsesinon.Truesi un des les deux paramètres sont considérés comme vrai pourand,Falsesinon.
AND/OR trick
Python a choisi cette façon de faire pour permettre des notations abrégées comme :
(x > 0) and log(x)qui rendra soitFalsesix <= 0soitlog(x)sinon.((x > 0) and log(x)) or Nonequi rendra soitNonesix <= 0soitlog(x)sinon
Immutabilité des objets
Notez que tous les objets basique de python sont non modifiables. Ainsi, si x = 41, on est dans la situation suivante :

En incrémentant x :
x = x + 1
On crée un nouvel objet (un entier valant 42) et l'ancien objet qui n'est plus accessible va disparaître sous l'action du ramasse-miettes :

À retenir
Les objets basiques de python sont dit immutables : ils ne peuvent être modifiées après leurs créations. La notion de mutabilité est cruciale dans les langages objets, nous reviendrons souvent sur cette notion qui peut mordre très fort si on ne la comprend pas bien.
Pour l'instant tout est ok puisque nous n'avons qu'une sorte d'objets et qu'ils sont immutables.
Fonctions
Une fonction est un type d'objet pouvant être exécuté. Par exemple la fonction print.
C'est un objet :
>>> type(print)
<class 'builtin_function_or_method'>
Définition
On exécute l'objet en faisant suivre son nom de parenthèses :
<nom de la fonction>()
Par exemple :
>>> print()
>>>
Va exécuter la fonction print de python qui affiche à l'écran le caractère retour à la ligne ce qui a pour effet d'aller à la ligne.
Définition
De nombreuses fonctions peuvent être exécutées avec des paramètres qui sont placées les un à la suite des autres entre les parenthèses et séparés par des virgules :
<nom de la fonction>(<paramètre 1>, <paramètre 2>, ..., <paramètre n>)
Prenons par exemple la fonction print de python :
>>> print("coucou", "les gens", "!")
coucou les gens !
L'exécution de la fonction print avec les trois paramètres "coucou", "les gens" et "!" affichera à l'écran les 3 paramètres espacé d'un caractère (séparé par un caractère espace " ") puis ira à la ligne.
Toutes les fonctions de python sont documentées. On peut y accéder :
- via le site de python. L'aide de la fonction
printest là : https://docs.python.org/fr/3/library/functions.html#print - en console en utilisant la fonction
help:help(print)donne l'aide deprint
Affichez l'aide de la fonction print dans la console.
solution
solution
>>> help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Si votre fenêtre est trop petite, l'affichage peut être différent.
Les fonctions sont des objets pouvant être exécutés, c'est à dire que faire suivre l'objet de parenthèses va effectuer une action. Tout comme pour les variables, le nom de la fonction n'est qu'un moyen d'y accéder. On peut par exemple tout à fait écrire :
>>> écrire = print
>>> écrire("coucou")
coucou
>>>
Retour de fonction
L'exécution de toute fonction va retourner un objet.
Définition
Le retour de l'exécution est un objet qui peut être stockée dans une variable via une affectation :
<nom de variable> = <nom de la fonction>(<paramètre 1>, <paramètre 2>, ..., <paramètre n>)
C'est parfois utile (comme abs) :
>>> x = abs(-10)
>>> print(x)
10
Parfois inutile (comme avec la fonction print) et dans ce cas là on a coutume de renvoyer l'objet vide, None :
>>> x = print("coucou")
coucou
>>> print(x)
None
Notez bien que l'exécution de la fonction print qui affiche quelque chose à l'écran (ici coucou) est différent de son résultat (ici None)
Enfin, comme ici on exécute notre code directement dans l'interpréteur python, le résultat de chaque fonction est également affiché à l'écran, sauf :
- si l'instruction est une affectation (c'est pour ça que l'interpréteur n'affiche pas
-10après l'instructionx = abs(-10)alors qu'il l'affiche après l'instructionabs(-10)) - si le résultat est
None(c'est pour ça que l'interpréteur n'affiche rien après l'instructionNoneni après après avoir affichécoucouaprès l'exécution de la fonctionprint("coucou"))
Paramètres d'une fonction
À retenir
Savoir lire la documentation d'une fonction est très important. Cela fait gagner un temps fou de pouvoir utiliser à bon escient tous les paramètres d'une fonction.
En regardant la documentation de la fonction print, on remarque que les premiers paramètres sont sans noms (value, ...) puis les paramètres ont des noms (sep, end, file, flush) suivi d'une valeur. Ce sont des paramètres qui ont une valeur par défaut (par défaut sep vaut " ").
Définition
Les paramètres sans valeurs par défaut sont obligatoires lorsque l'on appelle une fonction, les paramètres ayant une valeur par défaut sont optionnels.
On cependant bien sur utiliser, en le nommant, un paramètre ayant une valeur par défaut :
>>> print("coucou", "les gens", "!", sep="***")
coucou***les gens***!
Définition
Les paramètres d'une fonctions doivent être mis dans cet ordre :
- tous les paramètres sans valeurs par défaut dans l'ordre de la définition
- puis les paramètres optionnels utilisés sans nom, dans l'ordre de leurs définitions
- puis les paramètres optionnels utilisés avec leur nom (
nom=valeur) que l'on peut les mettre dans n'importe quel ordre.
La fonction print n'a pas de nombre déterminé de paramètres sans valeurs par défaut (il y a un ...), la règle 2 ne s'applique donc pas pour print.
Expérimentons ça sur un exercice.
La classe int a pour définition int(x, base=10) si x est une chaîne de caractère.
Peut-on écrire :
int("12")?int(base=2)?int("12", base=8)?int("12", 8)?int(base=8, "12")?
solution
solution
- oui
- non, la règle 1 n'est pas satisfaite
- oui
- oui
- non, la règle 2 (et 1) n'est pas satisfaite
Nom d'une classe comme fonction
int, float, complex, str et bool permettent de créer des objets du nom du type. Ces classes peuvent être exécutées.
En python les fonctions ne sont pas les seules objets pouvant être exécuté. En particulier l'exécution d'une classe permet de créer des objets de ce type.
On a déjà vu cette possibilité dans la partie objets types et types d'objets, c'est très utile pour changer un objet de classe. Mais utilisons ce qu'on a vu maintenant pour aller plus loin :
En utilisant int() qui crée des entiers, trouvez la représentation décimale du nombre binaire : 1001100011
solution
solution
On utilise le paramètre base de la classe int :
>>> int("1001100011", base=2)
611
Allez, un dernier pour la route :
En utilisant le fait que la fonction len(chaîne_de_caractères) donne le nombre de caractères de la chaîne (par exemple len("abc") rend 3), et que l'exposant eb python s'écrit ** (par exemple 2**8 rend 256) donnez le nombre de chiffre du 23ème nombre de Mersenne premier.
solution
solution
>>> len(str(2 ** 11213 - 1))
3376
Fonctions usuelles
Documentation
Certaines sont plus utiles que d'autres. Nous allons en citer certaines, parmi les plus utilisées.
Fonction print
Affiche à l'écran ses paramètres.
Fonction type
Documentation
Donne le type d'un objet.
On l'a utilisée dans la partie objets types et types d'objets.
Fonction len
Documentation
Rend le nombre d'éléments d'une chaîne de caractères (et plus généralement d'un conteneur que l'on verra plus tard).
Quel est le nombre de caractères du mot "anticonstitutionnellement" ?
solution
solution
>>> len("anticonstitutionnellement")
25
Fonction input
Permet de demander une chaîne de caractère à un utilisateur. Par exemple :
>>> x = input()
23
>>> x
'23'
On demande à l'utilisateur de taper quelque chose puis d'appuyer sur la touche entrée. Ce qu'à taper l'utilisateur est rendu sous la forme d'une chaîne de caractère.
Tout ce qui vient de l'utilisateur est une chaîne de caractère. Si l'on veut que ce soit un nombre par exemple, il faut le convertir. Comme par exemple : i = int(input()) qui converti en entier le résultat de la fonction input.
Méthodes
Les méthodes sont un autre moyen d'agir sur un objet :
Définition
<retour de la méthode> = <un objet>.<nom de la méthode>(<paramètre 1>, <paramètre 2>, ..., <paramètre n>)
On applique <nom de la méthode> (dit méthode appelée) à <un objet> (dit objet appelant) en utilisant les paramètres de la méthode. Comme une fonction, on peut récupérer son résultat si nécessaire via une affectation.
À retenir
Une méthode ne s'utilise jamais seule. Elle s'applique à ce qu'il y a à gauche d'elle.
Prenez le temps de regarder les différentes méthodes des classes de base de python. Souvent elle vous permettent de faire rapidement une opération compliquée. C'est en particulier vrai pour les chaînes de caractères et les listes.
Certaines méthodes vont rendre des objets utiles (comme les méthodes de chaîne de caractères), d'autre vont modifier les objets appelants et leur retour sera None (comme beaucoup de méthodes de liste que l'on verra bientôt).
Exemple : méthodes des chaînes de caractères
Chaque classe vient avec ses méthodes. Si les nombres et les booléens ont peu de méthodes, les chaines de caractères par exemple en ont tout un tas.
Essayons de les apprendre avec ces petits exercices :
Transformez le 23ème nombre de Mersenne en une chaîne de caractère
solution
solution
>>> x = str(2 ** 11213 - 1)
En utilisant la méthode count, comptez le nombre de 0 du 23ème nombre de Mersenne premier.
solution
solution
Dans un interpréteur :
>>> x.count("0")
348
En utilisant la méthode replace, changez les 2 en 7 dans le 23ème nombre de Mersenne premier.
solution
solution
Dans un interpréteur :
>>> y = int(x.replace("2", "7"))
solution
solution
>>> mot.count("ou")
2
>>> mot.index("e")
9
>>> mot.rindex("e")
16
On peut chaîner les méthodes, la sortie d'une méthode devenant l'entrée de la prochaine. Par exemple, avec 2 méthodes :
<un objet>.<nom de la méthode 1>().<nom de la méthode 2>()
Signifie que <nom de la méthode 2> est appliquée à l'objet rendu par l'exécution de <nom de la méthode 2> sur <un objet>.
À retenir
L'application des méthodes est associative à gauche.
<un objet>.<nom de la méthode 1>().<nom de la méthode 2>()
est équivalent à :
(<un objet>.<nom de la méthode 1>()).<nom de la méthode 2>()
Ceci se généralise avec $n$ méthodes :
<un objet>.<nom de la méthode 1>().<nom de la méthode 2>(). ... .<nom de la méthode n>()
La méthode <nom de la méthode n> est appliquée au résultat de <un objet>.<nom de la méthode 1>().<nom de la méthode 2>(). ... .<nom de la méthode n-1>()
Que fait :
str(2 ** 11213 - 1).replace("2","x").replace("7","2").replace("x","7")
solution
solution
De part l'associativité à gauche, la commande précédente est équivalente à :
((str(2 ** 11213 - 1).replace("2","x")).replace("7","2")).replace("x","7")
Il est aisé de comprendre ce que ça fait en procédant de droite à gauche :
replace("x","7")est appliqué à ce qui est à sa gauche doncstr(2 ** 11213 - 1).replace("2","x").replace("7","2")replace("7","2")est appliqué à ce qui est à sa gauche doncstr(2 ** 11213 - 1).replace("2","x")replace("2","x")est appliqué à ce qui est à sa gauche doncstr(2 ** 11213 - 1)
En remontant les opérations précédentes :
- le résultat de
str(2 ** 11213 - 1)sera une chaîne de caractère représentant le 23ème nombre premier de Mersenne str(2 ** 11213 - 1).replace("2","x")on a remplacé les 2 par des "x" dans la chaîne précédentestr(2 ** 11213 - 1).replace("2","x").replace("7","2")on a remplacé les 7 par des 2 de la chaîne précédentestr(2 ** 11213 - 1).replace("2","x").replace("7","2").replace("x","7")on a remplacé les "x" par des 2 dans la chaîne précédente
On a donc au final échangé les 2 et les 7 du 23ème nombre premier de Mersenne
Fonctions vs. méthodes
Ne confondez pas fonctions et méthodes. Une fonction s'exécute toute seule alors qu'une méthode a besoin d'un objet sur lequel elle s'applique (celui avant le .). Vous pouvez voir ça comme un 1er paramètre indispensable à l'exécution d'une méthode. Considérez le programme suivant :
>>> ma_chaîne = "coucou !"
>>> en_majuscules = ma_chaîne.upper()
>>> print(en_majuscules)
COUCOU !
La première ligne crée une chaîne de caractères. La seconde instruction est une méthode (upper) qui s'applique à l'objet de nom ma_chaîne et qui n'a pas de paramètre.
On peut voir les méthodes comme des fonctions définies dans l'espace de nom de l'objet.
Attributs d'un objet
C'est plus rare, mais certaines classes possèdent des également des attributs en plus des méthodes.
Définition
Un attribut est un nom représentant un objet :
<retour de la méthode> = <un objet>.<nom de l'attribut>
Un attribut est une variable située dans un objet.
Ce sont des valeurs associées à l'objet.
Par exemple les objets de la classe complex qui possède les attributs real et imag pour rendre la partie réelle et imaginaire d'un complexe.
>>> (1+2j).real
1.0
>>> (1+2j).imag
2.0
Les attributs d'un complexes sont en lecture seule, ce sont des variables que l'on peut lire mais qu'on ne peut pas affecter :
>>> x = 3 + 2j
>>> x.real
3.0
>>> x.real = 12
Traceback (most recent call last):
File "<python-input-10>", line 1, in <module>
x.real = 12
^^^^^^
AttributeError: readonly attribute