Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Моржовый оператор в Python: руководство

Роман Андреев
Роман Андреев
Технический писатель
23 сентября 2022 г.
1668
4 минуты чтения
Средний рейтинг статьи: 5

Первый вопрос, который задают новички, только что узнавшие про моржовый оператор Python — откуда такое странное название? Ответ кроется в самих символах. Посмотрите, как выглядит Python walrus operator:

:=

Чем не отдыхающий на берегу моря морж? Символы, добавляющие «глаза» и «бивни», создают характерный образ, поэтому программисты прочно закрепили за этим выражением соответствующее название.

А теперь о том, что оно делает.

Как работает оператор моржа Python

Новый оператор присваивания, появившийся в Python version 3.8, совмещает функцию присвоения значения переменной с возвратом этого значения. Чтобы было понятнее, для начала введем следующее:

print(apples = 7)

На выходе мы получили ожидаемое сообщение об ошибке от интерпретатора, поскольку переменная apples не была объявлена. А теперь давайте задействуем «моржа»:

print(apples := 7)

7

В одном выражении мы ввели новую переменную и тут же вернули присвоенное значение, удобно! Это та функция, которую долго ждали многие разработчики Python.

Примеры использования

Напишем программку, в которой пользователю предлагается ввести любую фразу или нажать Enter (в последнем случае программа выйдет из цикла, поскольку ввод вернет пустую строку, и перейдет к последней фразе). В более ранних версиях это было возможно написать только таким способом:

expression = input('Введите что-нибудь или просто нажмите Enter: ')

while expression != '':
    print('Отлично!')
    expression = input('Введите что-нибудь или просто нажмите Enter: ')

print('Надоело? Ладно, пока.')

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

while(expression := input('Введите что-нибудь или просто нажмите Enter: ') != ''):
    print('Отлично!')

print('Надоело? Ладно, пока.')

«Морж» позволил нам поместить переменную с командой на присвоение этой переменной значения из пользовательского ввода прямо внутрь цикла while, что сэкономило пару строк кода. И работать это будет точно так же:

Введите что-нибудь или просто нажмите Enter: Timeweb
Отлично!
Введите что-нибудь или просто нажмите Enter: new expressions with value assignment
Отлично!
Введите что-нибудь или просто нажмите Enter: Use functional code!
Отлично!
Введите что-нибудь или просто нажмите Enter: *нажимает Enter*
Надоело? Ладно, пока.

Вы, наверное, уже заметили, что «морж» присваивает значения переменным только внутри других выражений, то есть в подвыражениях: это одна из его особенностей. Теперь еще один пример, но уже с моржовым оператором внутри условного выражения.

Применение walrus Python с условными конструкциями

Напишем фразу и присвоим ей значение переменной, а затем найдем какое-нибудь слово в этой фразе по условию:

phrase = 'Я узнал, что у меня есть огромная семья: и тропинка, и лесок, в поле каждый колосок…'
word = phrase.find('тропинка')
if word != -1:
    print(phrase[word:])

Запись [word:] позволяет нам получить такой вывод:

тропинка, и лесок, в поле каждый колосок…

А теперь давайте сократим код с использованием моржового оператора. И вместо:

word = phrase.find('тропинка')
if word != -1:
    print(phrase[word:])

напишем так:

if(word := phrase.find('тропинка')) != -1:
    print(phrase[word:])

В данном случае по объему выиграли немного, зато уменьшили количество строк. Далее заметим, что, несмотря на сокращение времени на написание кода, моржовый оператор не всегда упрощает его чтение. Однако во многих случаях это лишь вопрос привычки, так что с практикой вы научитесь легко читать код с «моржами».

Walrus Python с числовыми выражениями

Напоследок приведем пример из еще одной области, в которой применение моржового оператора помогает оптимизировать работу программ. Это операции с числами. Напишем несложную программу для возведения в степень:

def pow(number,power):
    print('Вызываем pow')
    result = 1
    while power:
        result *= number
        power -= 1
    return result

И теперь введем в интерпретаторе следующее:

>>> [pow(number, 2) for number in range(3) if pow(number, 2) % 2 == 0]

Получим такой вывод:

Вызываем pow
Вызываем pow
Вызываем pow
Вызываем pow
Вызываем pow
[0, 4, 16]

Перепишем ввод в интерпретаторе с помощью моржового оператора:

>>> [p for number in range(3) if(p := pow(number, 2)) % 2 == 0]
Вызываем pow
Вызываем pow
Вызываем pow
[0, 4, 16]

Как видим, код сократился не слишком сильно, зато количество вызовов функции уменьшилось почти вдвое, а значит, программа будет работать быстрее!

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону