Как использовать выражения присваивания в Python

12 set 2022 4 min di lettura
Как использовать выражения присваивания в Python
Indice dei contenuti

Введение

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.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.