Что такое оператор присваивания в выражении (walrus operator) в Python

Ответ

Оператор присваивания в выражении := (неофициально — «моржовый оператор» из-за сходства с глазами и бивнями моржа) был добавлен в Python 3.8. Он позволяет одновременно присвоить значение переменной и вернуть это значение в рамках одного выражения.

Основная цель — упростить код, избегая повторных вычислений или вызовов функций, и сделать его более лаконичным.

Классический пример: цикл while

Чтение файла по строкам до тех пор, пока не встретится пустая строка.

Без оператора :=

lines = []
line = f.readline()
while line:
    lines.append(line)
    line = f.readline()

С оператором := Код становится короче и выразительнее, так как присваивание и проверка происходят в одном месте.

lines = []
while (line := f.readline()):
    lines.append(line)

Другие полезные случаи применения:

  1. Условия if:

    # Вместо
    match = re.search(pattern, text)
    if match:
        print(match.group(0))
    
    # Можно написать
    if (match := re.search(pattern, text)):
        print(match.group(0))
  2. Генераторы списков (List Comprehensions):

    # Обработать только "дорогие" товары, сохранив результат вычисления
    cart = [{"name": "apple", "price": 1.2}, {"name": "banana", "price": 0.5}]
    expensive_items = [discounted_price for item in cart 
                       if (discounted_price := item['price'] * 0.9) > 1.0]
    # expensive_items будет [1.08]

Важное замечание: Следует использовать оператор := с осторожностью. В сложных выражениях он может ухудшить читаемость кода, что противоречит одному из главных принципов Python (The Zen of Python — "Readability counts").