Модуль 6 · Функции и модули

Справочник по Python · модуль 6 · функции и модули

Глава 6.12

6.12

Оператор присваивания :=

Выражение name := value сохраняет результат в переменной и одновременно возвращает его. Оператор полезен, когда один результат нужно сразу проверить и затем использовать.

Категория
Выражения и условия
Уровень
Средний
Версия
Python 3.8+
Зачем это знать
Не повторять вычисление перед условием или циклом

§1Обычное присваивание является инструкцией

main.pyсначала сохраняем, потом проверяем
length = len("Python")
if length > 5:
    print(length)
Выводзначение доступно в теле if
6

§2Оператор := создаёт присваивающее выражение

main.pyприсвоить и получить значение
print(length := len("Python"))
print(length)
Выводрезультат сохранён
6
6

Название «моржовый оператор» связано с внешним видом :=. В документации используется термин «присваивающее выражение».

§3В if результат сначала сохраняется, затем проверяется

main.pyодин вызов len
items = ["чай", "кофе", "вода"]

if (count := len(items)) >= 3:
    print(f"Позиций: {count}")
Выводcount уже доступна
Позиций: 3

§4Вычисление не приходится повторять

main.pyрезультат поиска нужен после проверки
text = "Ошибка: файл не найден"

if (position := text.find(":")) != -1:
    print(f"Разделитель на позиции {position}")
Выводfind вызван один раз
Разделитель на позиции 6

§5В while удобно читать очередное значение

main.pyучебная последовательность вместо ручного ввода
read = iter(["первая", "вторая", "exit"]).__next__

while (line := read()) != "exit":
    print(line)
Выводзначение exit завершает цикл
первая
вторая

В реальной программе вместо read() здесь может быть input(), чтение строки файла или получение сообщения из очереди.

§6Скобки показывают границы выражения

main.pyсохраняется длина, сравнивается результат
word = "Python"
long_word = (length := len(word)) > 5

print(length)
print(long_word)
Выводint и bool
6
True

Без скобок читателю труднее понять, какая часть сохраняется. В некоторых позициях синтаксис также требует скобок.

§7Переменная остаётся доступной после выражения

main.pyусловие ложно, присваивание уже произошло
if (size := len([])):
    print("Список не пуст")

print(size)
Выводsize равен нулю
0

§8Во включении можно сохранить промежуточный результат

main.pyдлина вычисляется один раз для слова
words = ["код", "функция", "цикл"]
lengths = [length for word in words if (length := len(word)) > 3]
print(lengths)
Выводдлины подходящих слов
[7, 4]

§9Простое присваивание часто читается лучше

Рекомендациядве ясные строки
result = calculate()
if result:
    process(result)

Если сокращение не убирает повторное вычисление или делает выражение длинным, обычное = понятнее. Не стоит помещать несколько операторов := в одно условие.

§10Частые ошибки

Что написаноЧто произойдётКак правильно
if n = len(data):SyntaxErrorif (n := len(data)):
if (n := len(data) > 3):в n попадёт boolif (n := len(data)) > 3:
ожидать, что имя временноепеременная останется в текущей областивыбирать понятное имя и учитывать дальнейший код
несколько := в одном условииход вычислений трудно читатьразделить вычисления на инструкции
использовать в Python 3.7SyntaxErrorPython 3.8+ или обычное присваивание

§11Проверьте себя

Что сохранит n в выражении (n := len(data)) > 5?

Целую длину data. С числом 5 сравнивается уже сохранённое значение.

Создаётся ли переменная, если условие оказалось ложным?

Да: присваивание выполняется до проверки истинности результата.

Когда := действительно помогает?

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

§12Шпаргалка

Сохранить(value := expression)
Проверить длинуif (n := len(data)) > 0:
Цикл чтенияwhile (line := read()):
ВерсияPython 3.8+

Итог главы

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

Глава 6.12 · Оператор присваивания := · Справочник по PythonАвтор: Макаров Максим Николаевич