Справочник по Python · модуль 6 · функции и модули
Глава 6.12
Оператор присваивания :=
Выражение name := value сохраняет результат в переменной и одновременно возвращает его. Оператор полезен, когда один результат нужно сразу проверить и затем использовать.
- Категория
- Выражения и условия
- Уровень
- Средний
- Версия
- Python 3.8+
- Зачем это знать
- Не повторять вычисление перед условием или циклом
§1Обычное присваивание является инструкцией
length = len("Python") if length > 5: print(length)
6
§2Оператор := создаёт присваивающее выражение
print(length := len("Python")) print(length)
6 6
Название «моржовый оператор» связано с внешним видом :=. В документации используется термин «присваивающее выражение».
§3В if результат сначала сохраняется, затем проверяется
items = ["чай", "кофе", "вода"] if (count := len(items)) >= 3: print(f"Позиций: {count}")
Позиций: 3
§4Вычисление не приходится повторять
text = "Ошибка: файл не найден" if (position := text.find(":")) != -1: print(f"Разделитель на позиции {position}")
Разделитель на позиции 6
§5В while удобно читать очередное значение
read = iter(["первая", "вторая", "exit"]).__next__ while (line := read()) != "exit": print(line)
первая вторая
В реальной программе вместо read() здесь может быть input(), чтение строки файла или получение сообщения из очереди.
§6Скобки показывают границы выражения
word = "Python" long_word = (length := len(word)) > 5 print(length) print(long_word)
6 True
Без скобок читателю труднее понять, какая часть сохраняется. В некоторых позициях синтаксис также требует скобок.
§7Переменная остаётся доступной после выражения
if (size := len([])): print("Список не пуст") print(size)
0
§8Во включении можно сохранить промежуточный результат
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): | SyntaxError | if (n := len(data)): |
if (n := len(data) > 3): | в n попадёт bool | if (n := len(data)) > 3: |
| ожидать, что имя временное | переменная останется в текущей области | выбирать понятное имя и учитывать дальнейший код |
несколько := в одном условии | ход вычислений трудно читать | разделить вычисления на инструкции |
| использовать в Python 3.7 | SyntaxError | Python 3.8+ или обычное присваивание |
§11Проверьте себя
Что сохранит n в выражении (n := len(data)) > 5?
Целую длину data. С числом 5 сравнивается уже сохранённое значение.
Создаётся ли переменная, если условие оказалось ложным?
Да: присваивание выполняется до проверки истинности результата.
Когда := действительно помогает?
Когда один вычисленный результат нужно проверить и затем использовать, не повторяя вычисление.
§12Шпаргалка
(value := expression)if (n := len(data)) > 0:while (line := read()):Python 3.8+Итог главы
:= одновременно сохраняет и возвращает результат. Он нужен для конкретного случая — убрать повторное вычисление, сохранив понятный порядок действий.