L’opérateur Walrus := en Python

Article publié le et mis à jour le .

L’opérateur Walrus := en Python

L’opérateur d’affectation walrus, également appelé morse en français, permet d’assigner une variable tout en évaluant la valeur.

Explications vidéo pour comprendre l’opérateur walrus en Python en moins d’une minute :

Que veut dire := en Python?

Les symboles := représentent l’opérateur walrus en Python. Il tient son nom de sa ressemblance avec la tête d’un morse avec ses defenses. On l’utilise pour assigner une valeur à une variable tout en renvoyant l’evaluation de l’operation.

Syntaxe :

variable := objet

Que fait l’opérateur walrus := en Python ?

L’evaluation d’une assignation de variable avec l’opérateur walrus (variable := objet) renvoie l’objet.

Donc (ma_variable := 12) :

  • assigne 12 à la variable ma_variable
  • renvoie 12

Comment utiliser walrus dans une fonction ?

On peut utiliser l’opérateur walrus dans une fonction comme la fonction print et lui assigner une valeur.

print(ma_variable := 42)
print(ma_variable / 2)

Affichera :

42
21

Comment utiliser walrus dans une boucle ?

Disons que nous voulons récupérer les carrés des nombres dans une liste uniquement si ces carrés sont inférieurs à 15.

nombres = [1, 2, 3, 4, 5]
carres = []

for nombre in nombres:
    c = nombre * nombre
    if c < 15:
        carres.append(c)

print(carres)

On peut effectuer l’assignation du carré à c directement dans la condition du “if” en utilisant l’opérateur walrus et en plaçant son assignation entre parenthèses.

nombres = [1, 2, 3, 4, 5]
carres = []

for nombre in nombres:
    if (c := nombre * nombre) < 15:
        carres.append(c)

print(carres)

Et notre programme fonctionne comme avant.

Ces deux programmes renvoient une liste avec les carres des nombres qui sont inférieurs à 15, donc : [1, 4, 9].

Comment utiliser walrus dans une liste en comprehension ?

Donc, on utilise surtout cet opérateur pour améliorer la lisibilité du code, mais aussi pour éviter des évaluations coûteuses qui se répètent.

Prenons cette même boucle mais sous forme de liste en compréhension.

nombres = [1, 2, 3, 4, 5]
l = [n * n for n in nombres if n * n < 15]
print(l)

On a toujours [1, 4, 9].

Dans ce code, on a calculé deux fois le carré. Sur un petit programme comme celui-ci, ce n’est pas un problème, mais on double le temps de calcul, ce qui n’est pas bon du point de vue des performances.

Donc, on peut plutôt utiliser l’opérateur walrus pour calculer le carré une seule fois en assignant sa valeur à la variable “c”.

nombres = [1, 2, 3, 4, 5]
l = [c for n in nombres if (c := n * n) < 15]
print(l)

Et encore une fois, on a [1, 4, 9].