Главная / Курсы / Python / Объявление переменных, оператор моржа
# Глава 3. Объявление переменных, оператор моржа Разберем, как создавать и присваивать переменные. Обсудим появившийся в версии питона 3.8 оператор присваивания выражения `:=`. Из-за внешней схожести с отдыхающим на боку моржом он также известен как оператор моржа или просто «моржик». ## Объявление переменных При объявлении переменной тип не указывается: ```python height = 1.78 ``` Да, в питоне есть аннотации типов: с их помощью можно указать тип переменной, параметра функции, возвращаемого значения: ```python height: float = 1.78 ``` Однако аннотации типов не обязательны. В примере выше аннотация вообще избыточна: и так понятно, что перед нами значение с плавающей точкой. Более того, аннотации типов — всего лишь подсказки разработчику или анализатору кода. На поведение интерпретатора при выполнении кода они не влияют. Ведь как вы [помните,](/courses/python/chapters/python_chapter_0010#block-dynamic-typing) питон — язык с динамической типизацией, и всю информацию о типах интерпретатор получает после запуска программы. Более подробно аннотации типов и уместность их использования мы [рассмотрим](/courses/python/chapters/python_chapter_0330/) позже. Бывают случаи, когда нужно завести переменную и инициализировать значением по умолчанию. Для этого после оператора присваивания вызывается конструктор типа: ```python {.example_for_playground} height = float() print(height) ``` ``` 0.0 ``` 0.0 — дефолтное значение для `float`. Дефолтными значениями для целого, булевой переменной и какого-либо контейнера будут соответственно 0, `False` и пустой контейнер. Явный вызов конструктора используется редко. Но если к нему прибегают, то чаще всего не для простых типов данных, а для контейнеров: [списков,](/courses/python/chapters/python_chapter_0110/) [словарей](/courses/python/chapters/python_chapter_0150/) и [множеств.](/courses/python/chapters/python_chapter_0140/) Например, так выглядит заведение пустого множества: `users = set()`. А как быть с **константами?** В питоне их нет! Вместо констант — [распространенное соглашение](https://peps.python.org/pep-0008/#constants) код-стайла: переменные, предназначенные только для чтения, именовать заглавными буквами: {#block-consts} ```python HEIGHT = 1.78 WIDTH = 0.5 ``` Чисто технически ничто не остановит программиста от модификации такой переменной. Сохраняйте бдительность! Заведите константу `API_URL`, равную строке `"https://api.senjun.dev.ru"`. {.task_text} ```python {.task_source #python_chapter_0030_task_0010} ``` Синтаксис: переменная = значение {.task_hint} ```python {.task_answer} API_URL = "https://api.senjun.dev.ru" ``` ## Оператор моржа {#block-walrus} Оператор моржа (walrus) — неофициальное название для присваивания значения переменной в выражении. Оператор имеет вид морды отдыхающего на боку моржа `:=` и отличается от классического оператора `=` тем, что не только присваивает значение, но и **возвращает его.** За счет эффекта «два в одном» он делает код более лаконичным, а в каких-то случаях позволяет его ускорить. Рассмотрим пример: ```python res = calc_next_val() while res >= 0: print("Next iteration of calculation...", res) res = calc_next_val() ``` Переменной `res` на строке 1, а затем и в цикле `while` присваивается результат, который возвращает функция `calc_next_val()`. Если заменить присваивание на оператор моржа, мы избавимся от дублирования вызова функции `calc_next_val()` и сократим код: ```python while (res := calc_next_val()) >= 0: print("Next iteration of calculation...", res) ``` Обратите внимание, что выражение `res := calc_next_val()` взято в скобки. Так сделано, потому что приоритет оператора `:=` [ниже,](https://peps.python.org/pep-0572/#relative-precedence-of) чем у `>=`, `and`, `or` и всех прочих операторов кроме `,`. Перепишите условие с использованием оператора моржа. {.task_text} В данном коде у строки `title` вызывается метод `split()`, который разбивает строку по пробелам и возвращает список слов. К списку слов применяется встроенная функция `len()`, возвращающая количество элементов в контейнере. {.task_text} ```python {.task_source #python_chapter_0030_task_0020} title = "The walrus operator" words_count = len(title.split()) if words_count > 10: print("Too many words in paragraph title:", words_count) else: print("Paragraph title is suitable. Words count:", words_count) ``` Вызов функции для подсчета количества слов в предложении должен быть внутри оператора `if`. {.task_hint} ```python {.task_answer} title = "The walrus operator" if (words_count := len(title.split())) > 10: print("Too many words in paragraph title:", words_count) else: print("Paragraph title is suitable. Words count:", words_count) ``` Популярный сценарий использования оператора моржа — присваивание значения переменной и вызов функции с этим же значением в качестве аргумента. ```python {.example_for_playground} print("Status code:", code := 200) ``` ``` Status code: 200 ``` В этом примере значение 200 присваивается свежесозданной переменной `code`, которую можно использовать дальше по коду. И это же значение передается встроенной функции `print()` в качестве второго аргумента. В этом блоке кода в консоль выводится результат, возвращаемый встроенной функцией `min()`. Она принимает произвольные значения и возвращает наименьшее из них. {.task_text} При помощи оператора моржа перепишите код так, чтобы 4 переменные `a`, `b`, `c` и `d` создавались при вызове функции. {.task_text} ```python {.task_source #python_chapter_0030_task_0030} a = 8 b = -2 c = 4 d = 0 print(min(a, b, c, d)) ``` Пример использования оператора моржа при вызове функции `f()`, принимающей два аргумента: `f(x := 1, y := 2)`. {.task_hint} ```python {.task_answer} print(min(a := 8, b := -2, c := 4, d := 0)) ``` Также оператор моржа зачастую [используется](/courses/python/chapters/python_chapter_0240/#block-walrus) в списочных выражениях (list comprehensions) — культовой фишке питона, о которой мы поговорим [в одной из глав.](/courses/python/chapters/python_chapter_0240/) Кроме того, он полезен для лаконичного [заполнения коллекций.](/courses/python/chapters/python_chapter_0120/#block-walrus) ## Резюмируем - Варианты объявления переменной: `x = 0`, `x = int()`. - Оператор `=` присваивает значение переменной. - Оператор моржа `:=` совмещает присваивание значения переменной с возвратом этого значения. Позволяет сократить объем кода и в отдельных случаях оптимизировать работу программы. - Констант в питоне нет. Но есть джентльменское соглашение именовать предназначенные только для чтения переменные заглавными буквами: `TARGET_PATH="/tmp/data"`.
Отправка...
Наша группа в telegram. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!