Моржовый оператор (walrus operator) в Python

Опубликован: 02.09.2023 143

В Python 3.8 был добавлен новый оператор присваивания под названием «оператор морж» (или walrus operator).

Такое необычное название связано с тем, как оператор выглядит ( := ) (символы, добавляющие «глаза» и «бивни», создают характерный образ моржа, лежащего на берегу моря).

Как работает моржовый оператор

Оператор ( := ) совмещает функцию присваивания значения переменной с возвратом этого значения. Присваивания с помощью моржового оператора требуется делать в круглых скобках (x := 5), иначе будет вызвано исключение SyntaxError. Внутри скобок либо создается новая переменная, либо происходит присваивание значения уже существующий переменной. Чтобы было понятнее, попробуем ввести следующее:

print(number = 10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'number' is an invalid keyword argument for print()

Интерпретатор выдал сообщение об ошибке, поскольку переменная number не была объявлена до передачи в функцию print(). А вот если задействовать моржовый оператор ( := ), то Python отработает без ошибок:

print(number := 10)
10

Таким образом, в одном выражении мы ввели новую переменную и тут же вернули присвоенное ей значение!

"Моржовый" оператор ( := ) можно использовать для упрощения кода в конструкциях if ... else , в циклах while, а также в числовых выражениях когда необходимо присвоить значение переменной внутри выражения и одновременно его использовать.

Примеры использования оператора :=

Использование с числовыми выражениями:

# расчет суммы нарастающим итогом:
data = [5, 4, 3, 2]
c = 0 
print( [(c := c + x) for x in data] ) 
[5, 9, 12, 14]

# или произведения нарастающим итогом:
a = 1 
print( [ (a := a * b) for b in data] )
[5, 20, 60, 120]

# моржовый оператор в цикле while
i = 0
while ( i := i + 1 ) < 10:
     print( i, end=" ")
1 2 3 4 5 6 7 8 9

А вот примеры использования моржового оператора в конструкции if ... else :

# без моржового оператора
age = int(input("Какой Ваш возраст?"))
if age > 18:
    print("Вы уже взрослый !")
else:
    print("Вы еще ребенок !")

# с моржовым оператором
if (age := int(input("Какой ваш возраст?"))) > 18:
    print("Вы уже взрослый !")
else:
    print("Вы еще ребенок !")

phrase = 'В человеке должно быть все прекрасно: и лицо, и одежда, и душа, и мысли …'
if (word := phrase.find('прекрасно')) != -1:
    print(phrase[word:])
прекрасно: и лицо, и одежда, и душа, и мысли 

Таким образом, моржовый оператор действительно является хорошим дополнением к языку, и если вы будете использовать его правильно, он может помочь вам сделать код более лаконичным и читабельным.

Похожие посты

Оценка основных статистических метрик набора данных в Python

Область эффективного использования lambda функции в Python

Логические выражения if ... else в Pythonic стиле

Способы удаления лишних пробелов в строке

Комментариев нет.