Введение
Python 3.8, выпущенный в октябре 2019 года, добавляет выражения присваивания в Python с использованием синтаксиса :=
. Синтаксис выражения присваивания иногда также называют «оператором моржа», потому что :=
отдаленно напоминает моржа с бивнями.
Выражения присваивания позволяют присваивать переменные в более крупных выражениях. Хотя выражения присваивания никогда не являются строго необходимыми для написания правильного кода Python, они могут помочь сделать существующий код Python более кратким. Например, выражения присваивания, использующие синтаксис :=
, позволяют вам присваивать переменные в if
, которые часто могут создавать более короткие и компактные участки кода Python за счет исключения присваивания переменных в строках, предшествующих или следующих за if
.
В этом руководстве вы будете использовать выражения присваивания в нескольких примерах для создания кратких разделов кода.
Предпосылки
Чтобы получить максимальную отдачу от этого урока, вам понадобятся:
- Python 3.8 или более поздней версии. Выражения присваивания — это новая функция, добавленная начиная с Python 3.8. Вы можете просмотреть учебные пособия по Python по этому адресу.
- Некоторое знакомство с циклами
while
,if
, пониманием списков и функциями в Python 3 полезно, но не обязательно.
Используйте выражения присваивания в операторах if
Давайте начнем с примера того, как вы можете использовать выражения присваивания в операторе if
.
Рассмотрим следующий код, который проверяет длину списка и печатает оператор:
some_list = [1, 2, 3]
if (list_length:= len(some_list)) > 2:
print("List length of", list_length, "is too long")
Если вы запустите приведенный выше код, вы получите следующий вывод:
List length of 3 is too long
Он инициализирует список с именем some_list
, который содержит три элемента. Затем if
использует выражение присваивания ((list_length:= len(some_list))
для привязки переменной с именем list_length
к длине some_list
. Оператор if
возвращает True
, поскольку list_length
больше 2
Вы печатаете строку, используя переменную list_length
, который изначально был связан с выражением присваивания, указывающим, что список из трех элементов слишком длинный.
Примечание.Python 3.8
Если бы мы не использовали выражение присваивания, наш код мог бы быть немного длиннее. Например:
some_list = [1, 2, 3]
list_length = len(some_list)
if list_length > 2:
print("List length of", list_length, "is too long")
Этот пример кода эквивалентен первому примеру, но для этого кода требуется дополнительная автономная строка для сопоставления значения list_length
с len(some_list)
.
Другой эквивалентный пример кода может выполнять len(some_list)
дважды: один раз в if
и один раз в операторе print
. Это позволит избежать дополнительной строки, необходимой для привязки переменной к значению len(some_list)
:
some_list = [1, 2, 3]
if len(some_list) > 2:
print("List length of", len(some_list), "is too long")
Выражения присваивания помогают избежать лишних строк или двойных вычислений.
Примечание.
В следующем разделе мы рассмотрим использование выражений присваивания в циклах while
.
Используйте выражения присваивания в циклах while
Выражения присваивания часто хорошо работают в циклах while
, потому что они позволяют нам добавить больше контекста в условие цикла.
Рассмотрим следующий пример, встраивающий функцию пользовательского input
в условие цикла while
:
while (directive:= input("Enter text: "))!= "stop":
print("Received directive", directive)
Если вы запустите этот код, Python будет постоянно просить вас вводить текст с клавиатуры, пока вы не наберете слово stop
. Пример сеанса может выглядеть так:
>>> while (directive:= input("Enter text: "))!= "stop":... print("Received directive", directive)...
Enter text: hello
Received directive hello
Enter text: example
Received directive example
Enter text: stop
>>>
Выражение присваивания (directive:= input("Enter text: "))
связывает значение directive
со значением, полученным пользователем через функцию input
. Свяжите возвращаемое значение с directive
переменной, которую вы печатаете в теле цикла while
. Цикл while
завершается каждый раз, когда вы набираете stop
.
Если бы вы не использовали выражение присваивания, вы могли бы написать эквивалентный цикл input
, например:
directive = input("Enter text: ")
while directive!= "stop":
print("Received directive", directive)
directive = input("Enter text: ")
Этот код функционально идентичен коду с выражениями присваивания, но для него требуется всего четыре строки (вместо двух строк). Он также дублирует input("Enter text: ")
в двух местах. Конечно, существует много способов написать эквивалентный цикл while
, но представленный ранее вариант выражения присваивания компактен и хорошо отражает цель программы.
До сих пор вы использовали выражения присваивания в if
и циклах while
. В следующем разделе вы будете использовать выражение присваивания в списке понимания.
Используйте выражения присваивания в понимании списка
Мы также можем использовать выражения присваивания в понимании списка. Понимание списков позволяет вам кратко создавать списки, перебирая последовательность и потенциально добавляя элементы в список, которые соответствуют определенным условиям. Как и при понимании списков, мы можем использовать выражения присваивания, чтобы улучшить читаемость и сделать наш код более кратким.
Рассмотрим следующий пример, в котором используется понимание списка и выражение присваивания для создания списка перемноженных целых чисел:
def slow_calculation(x):
print("Multiplying", x, "*", x)
return x * x
[result for i in range(3) if (result:= slow_calculation(i)) > 0]
Если вы запустите приведенный выше код, вы получите следующее:
Multiplying 0 * 0
Multiplying 1 * 1
Multiplying 2 * 2
[1, 4]
Мы определяем функцию slow_calculation
, которая умножает заданное число x
само на себя. Список понимания итерации, затем через 0
, 1
и 2
, возвращаемый range(3)
. Выражение присваивания связывает result
значения с возвратом slow_calculation
с i
. Добавьте result
во вновь созданный список, если он больше 0
. В этом примере 0
, 1
и 2
кратны сами себе, но только результаты 1
( 1 * 1
) и 4
( 2 * 2
) удовлетворяют условию больше 0
и становятся частью окончательного списка [1, 4]
.
Функция slow_calculation
не обязательно медленная в абсолютном выражении, но она призвана проиллюстрировать важный момент, касающийся эффективности. Рассмотрим альтернативную реализацию предыдущего примера без выражений присваивания:
def slow_calculation(x):
print("Multiplying", x, "*", x)
return x * x
[slow_calculation(i) for i in range(3) if slow_calculation(i) > 0]
Запустив его, вы получите следующий вывод:
Multiplying 0 * 0
Multiplying 1 * 1
Multiplying 1 * 1
Multiplying 2 * 2
Multiplying 2 * 2
[1, 4]
В этом варианте предыдущего кода выражения присваивания не используются. Вместо этого slow_calculation
вызывается до двух раз: один раз, чтобы убедиться, что slow_calculation(i)
больше 0
, и, возможно, второй раз, чтобы добавить результат вычисления в окончательный список. 0
умножается сам на себя один раз, потому что 0 * 0
не больше 0
. Другие результаты, с другой стороны, вычисляются дважды, потому что они удовлетворяют условию больше 0, поэтому результаты пересчитываются, чтобы стать частью окончательного списка [1, 4]
.
Вы объединили выражения присваивания со списками для создания эффективных и лаконичных блоков кода.
Вывод
В этом руководстве вы использовали выражения присваивания для создания компактных разделов кода Python, которые присваивают значения переменным в if
, циклах while
и понимании списка.
Для получения дополнительной информации о других выражениях присваивания вы можете просмотреть PEP 572, документ, в котором первоначально предлагалось добавить выражения присваивания в Python.