
Python 3.8 все еще в разработке, но уже можно полистать список грядущих изменений, и, пожалуй, самое значимое из них (и возможно единственное заметное изменение) – ввод нового оператора присваивания := (морж). Старички вспомнили Паскаль. Смысл этого оператора – дать имя результату выражения. Т.е. вычисляем правую часть моржа, связываем с именем переменной слева и возвращаем результат моржа наружу.
Раньше делали так:
x = len(s)
if x:
print(x)
Будем делать так:
if x := len(s): # можно в 3.8
print(x)
Мотивация введения оператора := состоит в том, что уже наработано много примеров кода, когда он делает запись более лаконичной, не вызывая при этом повторного вычисления выражений.
📎 Пример. Используем вычисленное однажды значение f(x) под именем y:
[y := f(x), y**2, y**3]
📎 Пример. Читаем, сохраняем в chunk и сразу проверяем условие цикла:
while chunk := file.read(8192):
process(chunk)
📎 Пример. Можно применить в проходах по спискам, чтобы дважды не вычислять f(x):
filtered_data = [y for x in data if (y := f(x)) is not None]
📎 Примеры можно/нельзя:
x := 5 # нельзя
(x := 5) # можно
x = y := 0 # нельзя
x = (y := 0) # можно
Приоритет запятой возле нового оператора. Сравните:
x = 1, 2 # x -> (1, 2)
(x := 1, 2) # x -> 1
P.S.: Казалось бы, почему не сделать так: if x = len(s)? Ответ: чтобы не путать с if x == len(s). В C-подобных языках это частая проблема.
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈