Оператор walrus (моржовый оператор)
В версии 3.8 появился моржовый оператор, которого зачастую не хватало разработчикам, писавших на C-подобных языках. Моржовый оператор является одновременно выражением (expression) и оператором присваивания.
А назван он так потому, что символы :=
похожи на глаза и бивни моржа :)
Чтобы не быть голословным, перейдем сразу к практике.
Допустим, нам нужно складывать все числа из пользовательского ввода до тех пор, пока пользователь не введет пустую строку.
result = 0
while True:
number = input()
if number == 0:
break
result += int(number)
print(result)
С моржовым оператором это будет выглядеть более компактно:
result = 0
while (number := input()) != '':
result += int(number)
print(result)
Моржовый оператор позволяет избежать повторных вызовов функций или вычисления выражений.
Еще один пример: получить список ссылок в slug-виде, длина которых будет не менее 16 символов.
С повторным вызовом функции:
slug_urls = [slugify(url) for url in urls if len(slugify(url)) >= 16]
С дополнительными вычислениями:
all_slugs = (slugify(url) for url in urls)
slug_urls = list(filter(lambda slug: len(slug) >= 16))
С моржовым оператором:
slug_urls = [slug for url in urls if len(slug := slugify(url)) >= 16]
Можно применять цепочки таких операторов:
>>> (x := (y := 5) + 5)
10
>>> x, y
(10, 5)
Важно ставить скобки, иначе вылетит SyntaxError:
>>> x := 5
^
SyntaxError: invalid syntax