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

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.

À 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

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

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

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

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

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

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 :

association nom variable 1

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

association nom variable 2

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 :

association nom variable 3

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 = :

association nom variable 4

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 = :

association nom variable 5

A retenir

Le mécanisme d'affectation procède en 2 temps :

  1. on cherche l'objet associé à droite de =
  2. 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

  1. on commence par chercher les objets à droite du =
  2. 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 :

association nom variable 6

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

association nom variable 7

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

suppression 1

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

>>> del x
>>> y
1

suppression 2

L'objet est toujours associé au nom y. Supprimons ce nom :

>>> del y

L'objet n'est plus accessible !

suppression 3

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 :

suppression 4

À 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

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

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

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

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

>>> i, j = 3, 12

Affectez en une ligne la valeur 3 aux variables x, y et z.

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 :

python possède aussi :

Que vaut le quotient et le reste de la division entière de 4538 par 23 ?

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 :

Chaînes de caractères

Trois opérateur sont courants pour les chaînes de caractères :

Concatenation et multiplication

Les chaînes de caractères possèdent 2 opérateurs :

Par exemple :

>>> "x" + "y"
'xy'
>>> 3 * "x"
'xxx'

Recopiez 10 fois : "j'aime bien faire du python" en une ligne de python

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

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 :

Booléens

Comparaisons

Comparateurs classiques :

Les comparaisons rendent un booléen. Par exemple : 2 <= 3 rend le booléen True.

Opérations logiques

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 :

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 :

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 soit False si x <= 0 soit log(x) sinon.
  • ((x > 0) and log(x)) or None qui rendra soit None si x <= 0 soit log(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 :

nouvel objet

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 :

nouvel objet

À 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 :

Affichez l'aide de la fonction print dans la console.

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 :

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 :

  1. tous les paramètres sans valeurs par défaut dans l'ordre de la définition
  2. puis les paramètres optionnels utilisés sans nom, dans l'ordre de leurs définitions
  3. 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 :

  1. int("12") ?
  2. int(base=2) ?
  3. int("12", base=8) ?
  4. int("12", 8) ?
  5. int(base=8, "12") ?

solution

  1. oui
  2. non, la règle 1 n'est pas satisfaite
  3. oui
  4. oui
  5. 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

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

>>> len(str(2 ** 11213 - 1))
3376

Fonctions usuelles

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

Donne le type d'un objet.

On l'a utilisée dans la partie objets types et types d'objets.

Fonction len

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

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

>>> x = str(2 ** 11213 - 1)

En utilisant la méthode count, comptez le nombre de 0 du 23ème nombre de Mersenne premier.

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

Dans un interpréteur :

>>> y = int(x.replace("2", "7"))

Avec le mot "choucroute garnie" et les méthodes count, index et rindex :

  • combien y a-t-il de "ou" ?
  • quel est l'indice du premier "e" ?
  • quel est l'indice du dernier "e" ?

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

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 :

  1. replace("x","7") est appliqué à ce qui est à sa gauche donc str(2 ** 11213 - 1).replace("2","x").replace("7","2")
  2. replace("7","2") est appliqué à ce qui est à sa gauche donc str(2 ** 11213 - 1).replace("2","x")
  3. replace("2","x") est appliqué à ce qui est à sa gauche donc str(2 ** 11213 - 1)

En remontant les opérations précédentes :

  1. le résultat de str(2 ** 11213 - 1) sera une chaîne de caractère représentant le 23ème nombre premier de Mersenne
  2. str(2 ** 11213 - 1).replace("2","x") on a remplacé les 2 par des "x" dans la chaîne précédente
  3. str(2 ** 11213 - 1).replace("2","x").replace("7","2") on a remplacé les 7 par des 2 de la chaîne précédente
  4. str(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