# Python Operators : présentation rapide des opérateurs Python

Les opérateurs Python (Python Operators en anglais) vous permettent de travailler avec des valeurs (ou opérandes), de les modifier ou de les relier les unes aux autres. Il peut par exemple s’agir d’opérateurs logiques ou arithmétiques.

## Opérateurs Python : qu’est-ce que c’est ? Comment fonctionnent-ils ?

Un opérateur correspond au **signe d’une opération**. Les opérateurs sont souvent utilisés pour relier plusieurs opérandes. Cela permet généralement de créer une nouvelle valeur. Si vous appliquez un opérateur à un seul opérande, vous modifiez celui-ci.

Dans le cas des opérateurs Python, l’exemple le plus simple correspond à l’association de deux nombres grâce à un **opérateur d’addition** (soit le signe « + ») entre ceux-ci. Python évalue alors l’expression et restitue la valeur correspondante :

```none
1 + 1
```

Python a pour particularité d’utiliser, en plus des symboles, des mots courts tels que *and*, *or*, *is*, *not* ou *in* (littéralement « et, ou, est, pas, dans ») en tant qu’opérateurs. La **combinaison d’opérateurs et d’opérandes** permet de créer une expression :

```none
1 + 1 == 2
```

### Quels sont les différents types d’opérateurs Python ?

Il existe plusieurs classes d’opérateurs Python. Ceux-ci **fonctionnent sur différentes sortes d’opérandes** et donnent des résultats d’un type bien précis. Vous trouverez ci-dessous un aperçu des différentes sortes d’opérateurs Python :

<table>
  <tbody>
    <tr>
      <td><strong>Classe d’opérateurs Python</strong></td>
      <td><strong>Explication</strong></td>
      <td><strong>Opérandes</strong></td>
      <td><strong>Résultat</strong></td>
      <td><strong>Présentation rapide des opérateurs</strong></td>
    </tr>
    <tr>
      <td>Opérateurs arithmétiques</td>
      <td>Associent deux nombres pour en former un nouveau</td>
      <td>Nombres</td>
      <td>Nombre</td>
      <td>+, -, \*, /, //, %, \*\*, @</td>
    </tr>
    <tr>
      <td>Opérateurs de comparaison</td>
      <td>Comparent deux expressions entre elles</td>
      <td>Expressions</td>
      <td>Valeur booléenne</td>
      <td>&lt;, &gt;, ==, !=, &lt;=, &gt;=</td>
    </tr>
    <tr>
      <td>Opérateurs logiques</td>
      <td>Associent des expressions dans un contexte booléen</td>
      <td>Expressions</td>
      <td>Dernière expression évaluée / valeur booléenne</td>
      <td>and, or, not (et, ou, pas)</td>
    </tr>
    <tr>
      <td>Opérateurs bit à bit</td>
      <td>Manipulent des nombres entiers en tant que suites binaires</td>
      <td>Nombres</td>
      <td>Nombre</td>
      <td>&lt;&lt;, &gt;&gt;, &amp;, |, ^, ~</td>
    </tr>
    <tr>
      <td>Opérateurs d’assignation</td>
      <td>Assignent une valeur à un nom</td>
      <td>Valeurs de gauche, valeurs de droite</td>
      <td>– / expression évaluée</td>
      <td>=, :=, +=, -=, \*=, etc.</td>
    </tr>
    <tr>
      <td>Opérateurs d’identité</td>
      <td>Déterminent si deux noms font référence au même objet</td>
      <td>Objets</td>
      <td>Valeur booléenne</td>
      <td>is, is not (est, n’est pas)</td>
    </tr>
    <tr>
      <td>Opérateurs conditionnels</td>
      <td>Se basent sur une condition pour renvoyer l’une des deux valeurs</td>
      <td>Expression, condition, alternative</td>
      <td>Expression / alternative</td>
      <td>… if… else… (… si… sinon…)</td>
    </tr>
    <tr>
      <td>Opérateurs d’ensemble</td>
      <td>Associent deux ensembles ou comparent des ensembles</td>
      <td>Ensembles</td>
      <td>Ensemble / valeur booléenne</td>
      <td>&amp;, |, ^, -, &lt;, &gt;, &lt;=, &gt;=</td>
    </tr>
    <tr>
      <td>Opérateurs d’appartenance</td>
      <td>Réalisent des tests pour savoir si une valeur itérative contient un objet spécifique</td>
      <td>Objet, valeur itérative</td>
      <td>Valeur booléenne</td>
      <td>in, not in (dans, pas dans)</td>
    </tr>
    <tr>
      <td>Opérateurs de concaténation</td>
      <td>Séquences concaténées</td>
      <td>Chaînes de caractères / listes / n-uplets</td>
      <td>Chaîne de caractères / liste / n-uplet</td>
      <td>+</td>
    </tr>
    <tr>
      <td>Opérateurs d’indexation et de tranche</td>
      <td>Fournissent un ou plusieurs éléments d’une valeur itérative</td>
      <td>Valeur itérative, index / tranche</td>
      <td>Chaîne de caractères / liste / n-uplet</td>
      <td>\[\], \[::\]</td>
    </tr>
  </tbody>
</table>

En plus du type d’opérandes et de valeur de retour, le classement des opérateurs prend également en compte leur « arité ». L’arité d’un opérateur n’a rien à voir avec la « parité ». Ce terme désigne plutôt **le nombre d’opérandes associés par un opérateur**. La plupart du temps, il s’agit d’opérateurs « binaires », avec deux opérandes. Certains opérateurs sont également dits « unaires » (avec un seul opérande) ou « ternaires » (qui associe trois opérandes) :

<table>
  <thead>
    <tr>
      <th>Arité de l’opérateur</th>
      <th>Nombre d’opérandes</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Unaire</td>
      <td>Un opérande</td>
      <td>not single\_value</td>
    </tr>
    <tr>
      <td>Binaire</td>
      <td>Deux opérandes</td>
      <td>left\_operand + right\_operand</td>
    </tr>
    <tr>
      <td>Ternaire</td>
      <td>Trois opérandes</td>
      <td>some\_value if condition else other\_value</td>
    </tr>
  </tbody>
</table>

### Tenir compte de l’ordre des opérateurs

Pour utiliser les opérateurs Python, il est également essentiel de comprendre leur ordre. En arithmétique, ce concept est celui de la **priorité des opérations**. Un petit rappel s’impose : l’expression *3 \* 8 + 2* doit être traitée sous la forme *(3 \* 8) + 2*, et non sous la forme *3 \* (8 + 2)*. Comme pour les signes « + » et « \* » utilisés ci-dessus, des règles de priorité s’appliquent à tous les opérateurs Python. Voici un exemple d’expression utilisant les opérateurs logiques *and*, *or* et *not* :

```none
if is_user and is_user_logged_in or is_admin and not login_blocked:
    …
```

Si vous ne connaissez pas les règles de priorité applicables aux opérateurs Python concernés, vous ne serez pas maître de la manière dont les différents termes s’associent entre eux. Cela peut vite s’avérer compliqué si vous utilisez plusieurs opérateurs dans une même expression. Nous vous recommandons généralement de **ne pas compter sur une compréhension parfaite de ces règles implicites**, mais plutôt d’utiliser des parenthèses explicites pour clarifier les liaisons existantes entre les termes d’une même expression :

```none
if (is_user and is_user_logged_in) or (is_admin and not login_blocked):
    …
```

À titre de comparaison, voici **les mêmes termes regroupés de manière différente** (l’énoncé n’est donc pas le même pour les deux expressions) :

```none
if (is_user and is_user_logged_in or is_admin) and not login_blocked:
    …
```

### Définition d’opérateur, méthodes Dunder et fonctions d’opérateurs Python

Certains opérateurs Python peuvent être utilisés pour **plus d’une opération**. À cet égard, le signe « + » est l’un des exemples les plus marquants ; il fonctionne en effet comme un opérateur d’addition pour les nombres, mais aussi comme un opérateur de concaténation permettant d’assembler des séquences telles que des chaînes ou des listes. Ici, nous additionnons deux nombres à l’aide de l’opérateur d’addition :

```none
8 + 3 == 11
```

Avec ce même opérateur, nous concaténons ensuite **deux chaînes de caractères** :

```none
"Walter" + "White" == "WalterWhite"
```

L’opérateur « + » nous permet également de concaténer les **listes** :

```none
[’Jack’, ’Jim’] + [’John’] == [’Jack’, ’Jim’, ’John’]
```

Ce « double emploi » du signe « + » en tant qu’opérateur s’apparente à un concept plutôt répandu en informatique. Il est question de « **définition d’opérateur** » lorsqu’un seul et même opérateur peut être utilisé pour différentes opérations, suivant le type de données des opérandes.

Comment fonctionne la définition d’opérateur avec Python ? L’opérateur et ses opérandes sont interprétés comme un **appel de la fonction correspondante**. Une « méthode Dunder » est appelée au niveau du premier opérande, qui reçoit le ou les opérandes suivants comme des arguments. Le mot « Dunder » vient de l’anglais *double underscore*, « double tiret du bas ». L’opérateur « + » est le reflet de la méthode Dunder *\_\_add\_\_()*. Les objets mettant en œuvre une méthode *\_\_add\_\_()* peuvent être associés à l’opérateur « + ». Il appartient alors à l’objet de déterminer la nature exacte de cette relation.

Outre les méthodes Dunder, le [module de l’opérateur](https://docs.python.org/3/library/operator.html "Opérateurs standard en tant que fonctions&nbsp;: documentation&nbsp;Python&nbsp;3.10.4") contient **des fonctions qui renferment les capacités des opérateurs Python**. Ainsi, *operator.add(a, b)* permet d’appeler la méthode Dunder *a.\_\_add\_\_(b)*, ce qui revient à l’expression *a + b*. Découvrez avec nous la fonction de chaque opérateur, dans la mesure où celui-ci en a une. Le nom de la fonction de l’opérateur correspond au nom de la méthode Dunder qui y est associée. Nous vous conseillons dès lors d’utiliser ces références pour mettre en œuvre des fonctionnalités propres à vos opérateurs :

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Fonction de l’opérateur</th>
      <th>Méthode Dunder</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>a + b</td>
      <td>operator.add(a, b)</td>
      <td>a.\_\_add\_\_(b)</td>
    </tr>
  </tbody>
</table>

Les opérateurs font appel une **notation infixe** (c’est-à-dire qu’ils sont placés entre les opérandes). Le style fonctionnel favorise toutefois la notation préfixe. Ces deux variantes sont néanmoins équivalentes :

<table>
  <thead>
    <tr>
      <th>Notation</th>
      <th>Utilisation</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Infixe</td>
      <td>Opérateurs</td>
      <td>a + b</td>
    </tr>
    <tr>
      <td>Préfixe</td>
      <td>Fonctions</td>
      <td>+ a b / add(a, b)</td>
    </tr>
  </tbody>
</table>

Considérons l’exemple suivant. Nous commençons par **définir deux nombres**, que nous **additionnons** tous deux avec l’opérateur, la fonction de l’opérateur et la méthode Dunder correspondante :

```none
import operator
a = 42
b = 69
assert a + b == operator.add(a, b) == a.__add__(b)
```

Il est également possible d’élaborer des expressions plus complexes à l’aide de ces fonctions. Vous pouvez voir ici un exemple de combinaison des opérateurs Python « + » et « = » en notation préfixe :

```none
import operator
assert ’Py’ + ’thon’ == ’Python’
assert operator.eq(operator.add(’Py’, ’thon’), ’Python’)
```

## Présentation rapide des opérateurs Python

Découvrez maintenant avec nous **onze classes différentes d’opérateurs Python**.

### Opérateurs arithmétiques

Les **opérateurs arithmétiques de Python fonctionnent sur des nombres** et servent à en générer un nouveau. À l’exception du « + » ou du « - » unaire, ces opérateurs sont toujours binaires. Retrouvez ci-dessous un aperçu :

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>+</td>
      <td>Addition / « + » unaire</td>
      <td>add(a, b) / pos(a)</td>
      <td>5 + 3 == 8 / +8 == 4 + 4</td>
    </tr>
    <tr>
      <td>-</td>
      <td>Soustraction / « - » unaire</td>
      <td>sub(a, b) / neg(a)</td>
      <td>7 - 2 == 5 / -4 == 2 - 6</td>
    </tr>
    <tr>
      <td>\*</td>
      <td>Multiplication</td>
      <td>mul(a, b)</td>
      <td>2 \* 3 == 6</td>
    </tr>
    <tr>
      <td>/</td>
      <td>« Véritable » division</td>
      <td>truediv(a, b)</td>
      <td>8 / 2 == 4.0, 7 / 2 == 3.5</td>
    </tr>
    <tr>
      <td>//</td>
      <td>Division de nombres entiers par le plus petit nombre entier suivant</td>
      <td>floordiv(a, b)</td>
      <td>8 // 2 == 4, 7 // 2 == 3</td>
    </tr>
    <tr>
      <td>%</td>
      <td>Opération modulo : reste de la division de nombres entiers</td>
      <td>mod(a, b)</td>
      <td>8 % 2 == 0, 7 % 2 == 1</td>
    </tr>
    <tr>
      <td>\*\*</td>
      <td>Exponentiation</td>
      <td>pow(a, b)</td>
      <td>2 \*\* 3 == 8, 10 \*\* -1 == 0.1</td>
    </tr>
    <tr>
      <td>@</td>
      <td>Produit matriciel</td>
      <td>matmul(a, b)</td>
      <td>–</td>
    </tr>
  </tbody>
</table>

Par défaut, l’**opération modulo** est utilisée pour déterminer si un nombre est pair ; le reste d’un nombre pair divisé par deux est en effet toujours nul. L’opérateur modulo nous permet de définir la fonction Python correspondante :

```none
def is_even(number):
    return number % 2 == 0
# test
assert is_even(8) and not is_even(7)
```

Le **produit matriciel** nécessite l’utilisation d’une bibliothèque telle que NumPy.

### Opérateurs de comparaison Python

Les opérateurs de comparaison de Python vous indiquent **la manière dont deux éléments peuvent être organisés entre eux**. Ils renvoient un résultat booléen et peuvent notamment être utilisés dans le cadre d’algorithmes de tri :

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>&lt;</td>
      <td>Inférieur à</td>
      <td>lt(a, b)</td>
      <td>3 &lt; 1, ’a’ &lt; ’z’</td>
    </tr>
    <tr>
      <td>&gt;</td>
      <td>Supérieur à</td>
      <td>gt(a, b)</td>
      <td>4 &gt; 2, ’z’ &gt; ’a’</td>
    </tr>
    <tr>
      <td>==</td>
      <td>Égal à</td>
      <td>eq(a, b)</td>
      <td>’a’ == ’a’</td>
    </tr>
    <tr>
      <td>!=</td>
      <td>Différent de</td>
      <td>ne(a, b)</td>
      <td>1 != 2, ’Jim’ != ’Jack’</td>
    </tr>
    <tr>
      <td>&lt;=</td>
      <td>Inférieur ou égal à</td>
      <td>le(a, b)</td>
      <td>9 &lt;= 10, 10 &lt;= 10</td>
    </tr>
    <tr>
      <td>&gt;=</td>
      <td>Supérieur ou égal à</td>
      <td>ge(a, b)</td>
      <td>11 &gt;= 10, 10 &gt;= 10</td>
    </tr>
  </tbody>
</table>

### Opérateurs logiques

Les opérateurs logiques *and* et *or* de Python **connectent plusieurs opérandes en suivant une logique booléenne**. Pour ce qui est du résultat, chacun des deux opérateurs renvoie le dernier objet qu’il a évalué. L’opérateur logique *not* de Python permet quant à lui d’interpréter un objet dans un contexte booléen et d’inverser sa valeur logique :

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>and</td>
      <td>ET logique</td>
      <td>Aucune correspondance directe</td>
      <td>True and False == False, ’name’ and … == …</td>
    </tr>
    <tr>
      <td>or</td>
      <td>OU logique</td>
      <td>Aucune correspondance directe</td>
      <td>False or True == True, a = ’’ or ’Default’; assert a == ’Default’</td>
    </tr>
    <tr>
      <td>not</td>
      <td>Négation</td>
      <td>not\_(a)</td>
      <td>not True == False</td>
    </tr>
  </tbody>
</table>

Il peut s’avérer utile de démontrer l’**effet des opérations logiques** sur des tables de vérité. Ici, c’est le « ET » logique qui est représenté :

<table>
  <tbody>
    <tr>
      <td><strong>and</strong></td>
      <td><strong>True</strong></td>
      <td><strong>False</strong></td>
    </tr>
    <tr>
      <td>True</td>
      <td>True</td>
      <td>False</td>
    </tr>
    <tr>
      <td>False</td>
      <td>False</td>
      <td>False</td>
    </tr>
  </tbody>
</table>

C’est aussi le cas du « OU » logique :

<table>
  <tbody>
    <tr>
      <td><strong>or</strong></td>
      <td><strong>True</strong></td>
      <td><strong>False</strong></td>
    </tr>
    <tr>
      <td>True</td>
      <td>True</td>
      <td>True</td>
    </tr>
    <tr>
      <td>False</td>
      <td>True</td>
      <td>False</td>
    </tr>
  </tbody>
</table>

Les opérandes des opérateurs booléens de Python ne se limitent pas aux variables booléennes. Il est au contraire possible d’interpréter chaque objet Python dans un contexte booléen. **Dans un contexte booléen, l’évaluation des objets suivants correspond à *False*** (ce qui leur vaut donc l’appellation *falsy*) :

<table>
  <thead>
    <tr>
      <th>Objet</th>
      <th>Explication</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>False, None</td>
      <td>Constantes qui sont, par définition, fausses (False)</td>
    </tr>
    <tr>
      <td>0, 0.0, Decimal(0), Fraction(0, 1), etc.</td>
      <td>Nombre représentant une valeur nulle</td>
    </tr>
    <tr>
      <td>’’, (), \[\], {}, set(), range(0), etc.</td>
      <td>Séquence ou collection vide</td>
    </tr>
  </tbody>
</table>

### Opérateurs bit à bit

Les opérateurs bit à bit de Python **fonctionnent à l’aide de nombres entiers interprétés comme des chaînes binaires**. À l’exception de l’opérateur *NOT*, il s’agit toujours d’opérateurs bit à bit :

<table>
  <tbody>
    <tr>
      <td><strong>Opérateur Python</strong></td>
      <td><strong>Signification</strong></td>
      <td><strong>Fonction de l’opérateur</strong></td>
      <td><strong>Exemple</strong></td>
    </tr>
    <tr>
      <td>&lt;&lt;</td>
      <td>Déplacer la chaîne binaire vers la gauche</td>
      <td>lshift(a, b)</td>
      <td>5 &lt;&lt; 3 == 5 \* 2 \*\* 3</td>
    </tr>
    <tr>
      <td>&gt;&gt;</td>
      <td>Déplacer la chaîne binaire vers la droite</td>
      <td>rshift(a, b)</td>
      <td>1 &gt;&gt; 1 == 0, 8 &gt;&gt; 1 == 4</td>
    </tr>
    <tr>
      <td>&amp;</td>
      <td>Associer deux chaînes binaires à l’aide de l’opérateur *AND*</td>
      <td>and\_(a, b)</td>
      <td>``</td> </tr> <tr> <td>|</td> <td>Associer deux chaînes binaires à l’aide de l’opérateur « *OR* »</td> <td>or\_(a, b)</td> <td>``</td> </tr> <tr> <td>^</td> <td>Associer deux chaînes binaires à l’aide de l’opérateur « *XOR* »</td> <td>xor(a, b)</td> <td>``</td> </tr> <tr> <td>~</td> <td>Inverser la chaîne binaire avec l’opérateur *NOT*</td> <td>invert(a)</td> <td>``</td>
    </tr>
  </tbody>
</table>

Les opérateurs bit à bit **sont parfaits pour optimiser les opérations mathématiques**. Le décalage vers la gauche correspond donc à la multiplication par une puissance de deux :

<table>
  <tbody>
    <tr>
      <td><strong>Expression</strong></td>
      <td><strong>23 = 8</strong></td>
      <td><strong>22 = 4</strong></td>
      <td><strong>21 = 2</strong></td>
      <td><strong>20 = 1</strong></td>
      <td><strong>Décimale</strong></td>
    </tr>
    <tr>
      <td>b = 6</td>
      <td>0</td>
      <td>1).</td>
      <td>1).</td>
      <td>0</td>
      <td>6</td>
    </tr>
    <tr>
      <td>b &lt;&lt; 1</td>
      <td>1).</td>
      <td>1).</td>
      <td>0</td>
      <td>0</td>
      <td>12</td>
    </tr>
    <tr>
      <td>b &gt;&gt; 1</td>
      <td>0</td>
      <td>0</td>
      <td>1).</td>
      <td>1).</td>
      <td>3</td>
    </tr>
  </tbody>
</table>

Afin d’illustrer les opérations *AND*, *OR* et *NOT* bit à bit, nous avons établi un **tableau des différents bits**. À l’aide d’un marquage, les opérations sont appliquées à un nombre en représentation binaire :

<table>
  <tbody>
    <tr>
      <td><strong>Expression</strong></td>
      <td><strong>23 = 8</strong></td>
      <td><strong>22 = 4</strong></td>
      <td><strong>21 = 2</strong></td>
      <td><strong>20 = 1</strong></td>
      <td><strong>Décimale</strong></td>
    </tr>
    <tr>
      <td>bits = 6</td>
      <td>0</td>
      <td>1).</td>
      <td>1).</td>
      <td>0</td>
      <td>6</td>
    </tr>
    <tr>
      <td>mask = 5</td>
      <td>0</td>
      <td>1).</td>
      <td>0</td>
      <td>1).</td>
      <td>5</td>
    </tr>
    <tr>
      <td>bits &amp; mask</td>
      <td>0</td>
      <td>1).</td>
      <td>0</td>
      <td>0</td>
      <td>4</td>
    </tr>
    <tr>
      <td>bits | masquage</td>
      <td>0</td>
      <td>1).</td>
      <td>1).</td>
      <td>1).</td>
      <td>7</td>
    </tr>
    <tr>
      <td>bits ^ mask</td>
      <td>0</td>
      <td>0</td>
      <td>1).</td>
      <td>1).</td>
      <td>3</td>
    </tr>
  </tbody>
</table>

L’opérateur bit à bit de Python ***NOT* permet d’inverser une chaîne de bits**. Tous les 1 deviennent des 0, et inversement. Le signe du nombre est lui aussi inversé :

<table>
  <tbody>
    <tr>
      <td><strong>Expression</strong></td>
      <td><strong>23 = 8</strong></td>
      <td><strong>22 = 4</strong></td>
      <td><strong>21 = 2</strong></td>
      <td><strong>20 = 1</strong></td>
      <td><strong>Décimale</strong></td>
    </tr>
    <tr>
      <td>b = 6</td>
      <td>0</td>
      <td>1).</td>
      <td>1).</td>
      <td>0</td>
      <td>6</td>
    </tr>
    <tr>
      <td>~ b</td>
      <td>1).</td>
      <td>0</td>
      <td>0</td>
      <td>1).</td>
      <td>-7</td>
    </tr>
  </tbody>
</table>

### Opérateurs d’assignation

Les assignations comptent parmi les instructions de base de la majorité des langages de programmation. Les opérateurs d’assignation de Python permettent d’**associer une valeur à un nom de variable**. En plus de l’instruction d’assignation, un opérateur « morse » plus récent peut être utilisé pour effectuer une assignation dans une expression. Vous pouvez également faire appel à une série d’instructions d’assignation avancées combinant une assignation à une autre opération :

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>=</td>
      <td>Instruction d’assignation</td>
      <td>Aucune correspondance directe</td>
      <td>name = ’Walther’</td>
    </tr>
    <tr>
      <td>:=</td>
      <td>Expression d’assignation (opérateur « morse »)</td>
      <td>Aucune correspondance directe</td>
      <td>\[ half for x in range(10) if (half := x / 2) &lt; 5 \]</td>
    </tr>
    <tr>
      <td>+=</td>
      <td>Assignation d’addition avancée</td>
      <td>iadd(a, b)</td>
      <td>x = 1; x += 4; assert x == 5</td>
    </tr>
  </tbody>
</table>

Python propose des opérateurs d’assignation avancés pour les opérations arithmétiques et bit à bit. La liste complète n’apparaît pas dans cet article, mais vous pouvez découvrir leur **modèle général** ci-dessous, **illustré par une assignation de concaténation avancée**. Pour commencer, un élément est ajouté à une chaîne de caractères existante à l’aide d’un code :

```none
name = ’Walther’
name = name + ’White’
assert name == ’WaltherWhite’
```

Voici un exemple similaire avec l’opérateur de concaténation avancée « += » de Python. Si cela conduit au même résultat, le code est ici plus concis et pertinent :

```none
name  = ’Walther’
name += ’White’
assert name == ’WaltherWhite’
```

### Opérateurs d’identité

L’opérateur *is* de Python effectue des tests visant à déterminer **si deux variables font référence au même objet dans la mémoire**. L’identité d’objet est différente de l’égalité d’objet, testée quant à elle grâce à l’opérateur de comparaison « == » de Python. L’opérateur *is* de Python correspond, à peu de choses près, à l’opérateur d’égalité rigoureux de JavaScripts, « === ». Avec l’opérateur *is not*, Python permet également la réalisation de tests d’identité inversés.

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>is</td>
      <td>Test d’identité</td>
      <td>is\_(a, b)</td>
      <td>a = 42; b = a; assert a is b</td>
    </tr>
    <tr>
      <td>is not</td>
      <td>Test d’identité inversé</td>
      <td>is\_not(a, b)</td>
      <td>assert \[42\] is not \[42\]</td>
    </tr>
  </tbody>
</table>

Intéressons-nous de plus près à quelques exemples. Nous allons pour cela créer une référence à un objet en mémoire, suivie plus tard d’une autre référence (sous forme d’alias). Si **les deux variables font bien référence au même objet en mémoire**, l’opérateur *is* renvoie le résultat *True*.

```none
# assign value to name
a = [42]
# reference existing object
b = a
# if this holds
assert a is b
# so will this
assert a == b
```

Nous allons ici créer deux **références à des objets indépendants l’un de l’autre en mémoire**. Ces objets sont certes identiques, mais ils restent néanmoins distincts. L’opérateur *is* renvoie alors le résultat *False* :

```none
# assign the same value to different names
a = [42]
b = [42]
# `a`, `b` are two different objects
assert a is not b
# that contain the same value
assert a == b
```

### Opérateurs conditionnels

L’opérateur conditionnel de Python utilise encore différemment les mots-clés *… if… else…* Il sert le plus souvent à **établir une distinction entre deux valeurs possibles en matière d’assignation**. Étant donné que l’opérateur conditionnel associe une condition à deux expressions, il est également qualifié d’opérateur « ternaire ».

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>… if… else…</td>
      <td>Expression conditionnelle</td>
      <td>Aucune correspondance directe</td>
      <td>name = ’Jim’ if age == 42 else ’Jack’</td>
    </tr>
  </tbody>
</table>

Commençons par nous intéresser à un exemple utilisant l’[instruction … if… else… dans Python](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/python-if-else/). Le code ci-dessous permet de définir les degrés Celsius ou Fahrenheit en tant qu’**unité de thermométrie** selon le système de mesure choisi :

```none
if system == ’metric’:
    unit = ’C’
else:
    unit = ’F’
```

L’**utilisation de l’opérateur conditionnel** permet de simplifier le code sous la forme d’une seule assignation :

```none
unit = ’C’ if system == ’metric’ else ’F’
```

### Opérateurs d’ensemble Python

En plus des chaînes de caractères, des n-uplets, des listes et des dictionnaires, les **ensembles** sont, par défaut, pris en charge par Python **en tant que type de données composées**. La définition d’opérateur est alors utilisée pour les opérations ordinaires :

<table>
  <thead>
    <tr>
      <th>Opérateurs Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>&amp;</td>
      <td>Créer une liaison entre deux ensembles</td>
      <td>and\_(a, b)</td>
      <td>{’a’, ’b’} &amp; {’a’, ’c’} == {’a’}</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td>Créer une intersection entre deux ensembles</td>
      <td>or\_(a, b)</td>
      <td>{’a’, ’b’}</td>
      <td>{’a’, ’c’} == {’a’, ’c’, ’b’}</td>
    </tr>
    <tr>
      <td>^</td>
      <td>Créer une différence symétrique entre deux ensembles</td>
      <td>xor(a, b)</td>
      <td>{’a’, ’b’} ^ {’a’, ’c’} == {’c’, ’b’}</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>-</td>
      <td>Créer une différence entre deux ensembles</td>
      <td>sub(a, b)</td>
      <td>{’a’, ’b’} - {’a’} == {’b’}</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>&gt;</td>
      <td>Vérifier s’il s’agit d’un véritable sur-ensemble</td>
      <td>gt(a, b)</td>
      <td>assert {’a’, ’b’} &gt; {’a’}</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>&gt;=</td>
      <td>Vérifier s’il s’agit d’un sur-ensemble</td>
      <td>ge(a, b)</td>
      <td>assert {’a’} &gt;= {’a’}</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>&lt;</td>
      <td>Vérifier s’il s’agit d’un véritable sous-ensemble</td>
      <td>lt(a, b)</td>
      <td>assert {’a’} &lt; {’a’, ’b’}</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>&lt;=</td>
      <td>Vérifier s’il s’agit d’un sous-ensemble</td>
      <td>le(a, b)</td>
      <td>assert {’a’} &lt;= {’a’}</td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

### Opérateurs d’appartenance Python

Les opérateurs d’appartenance *in* et *not in* de Python donnent des informations sur **la présence ou l’absence d’un objet dans une collection**.

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>in</td>
      <td>Test permettant de vérifier si un objet est contenu dans une valeur itérative</td>
      <td>contains(a, b)</td>
      <td>’y’ in ’Python’</td>
    </tr>
    <tr>
      <td>not in</td>
      <td>Inversion de l’opérateur in</td>
      <td>not contains(a, b)</td>
      <td>’x’ not in ’Python’</td>
    </tr>
  </tbody>
</table>

Les opérateurs d’appartenance fonctionnent avec des **valeurs itératives** et font appel à un dispositif de **vérification de l’égalité** visant à déterminer si la collection contient bien l’objet cible :

```none
’Py’ in ’Python’
’Px’ not in ’Python’
’Jack’ in [’Jim’, ’Jack’]
```

L’utilisation de l’opérateur *in* évite d’avoir à écrire du code sous la forme suivante :

```none
def my_in(target, collection):
    for element in collection:
        if element == target:
            return True
    return False
# test
word = ’Python’
letter = ’y’
assert (my_in(letter, word)) == (letter in word)
```

### Opérateurs de concaténation

L’opérateur de concaténation de Python permet de **relier entre elles plusieurs séquences de même type**. L’opérateur a pour symbole le signe « + ».

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>+</td>
      <td>Concatène deux séquences</td>
      <td>add(a, b)</td>
      <td>\[’Jim’\] + \[’Jack’, ’John’\]</td>
    </tr>
  </tbody>
</table>

Intéressons-nous de plus près à quelques exemples. Nous allons ici concaténer **deux chaînes de caractères, deux listes et deux n-uplets** :

```none
assert "Walter" + "White" == ’WalterWhite’
assert [’a’, ’b’] + [’c’] == [’a’, ’b’, ’c’]
assert (’q’, ’r’) + (’s’, ’t’) == (’q’, ’r’, ’s’, ’t’)
```

Python est utilisé comme un [langage de programmation Web](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/langages-de-programmation-web/ "Langages de programmation Web"). Dans ce contexte, l’opérateur de concaténation permet donc l’assemblage de [balises HTML](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/balises-htlm/) :

```none
site_title = ’Welcome’
print(’<h1>’ + site_title + ’</h1>’)
```

Si vous comparez [Python à PHP](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/php-vs-python/), vous vous rendrez compte qu’il existe des différences entre les opérateurs de concaténation des deux langages. PHP utilise en effet le symbole « . ». Voici le même exemple, utilisant cette fois-ci le langage **PHP** :

```none
$siteTitle = ’Welcome’;
echo ’<h1>’ . $siteTitle . ’</h1>’;
```

### Opérateurs d’indexation et de tranche

L’opérateur d’indexation de Python permet d’**extraire** d’une collection un élément spécifique. L’opérateur de tranche sert quant à lui à en extraire une sous-séquence.

<table>
  <thead>
    <tr>
      <th>Opérateur Python</th>
      <th>Signification</th>
      <th>Fonction de l’opérateur</th>
      <th>Exemple</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>iterable\[index\]</td>
      <td>Renvoie l’élément d’une valeur itérative située au niveau de l’index</td>
      <td>getitem(iterable, index)</td>
      <td>’Python’\[1\] == ’y’</td>
    </tr>
    <tr>
      <td>sequence\[start:stop:step\]</td>
      <td>Renvoie une tranche de la séquence concernée</td>
      <td>getitem(iterable, slice(start, stop, step))</td>
      <td>’Python’\[0:1\] == ’Py’, ’Python’\[0:-1:2\] == ’Pto’</td>
    </tr>
  </tbody>
</table>

En interne, les opérateurs d’indexation et de tranche de Python font appel à la méthode Dunder *\_\_getitem\_\_()*. Celle-ci est alors appelée à partir d’un index numérique ou d’un objet de tranche :

```none
names = [’Jim’, ’Jack’, ’John’]
names[0] == names.__getitem__(0)
names[0:2] == names.__getitem__(slice(0, 2))
```

Si l’opérateur de tranche est pratique, c’est parce qu’il permet d’**extraire une sous-séquence** sans qu’il soit pour autant nécessaire d’utiliser une [boucle for Python](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/loop-for-en-python/) ou une [boucle while Python](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/boucle-while-en-python/). Les personnes responsables de la programmation n’ont donc plus à écrire leur code sous cette forme :

```none
word = ’Python’
start, stop, step = 0, 5, 2
index, substring = start, ’’
while index in range(start, stop, step):
    substring += word[index]
    index += step
# test
assert substring == word[start:stop:step]
```


This is a markdown version of: [https://www.ionos.fr/digitalguide/sites-internet/developpement-web/operateurs-python/](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/operateurs-python/) for AI/LLM consumption.