# Глава 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. Здесь можно задавать вопросы и общаться.
Задонатить. Если вам нравится курс, вы можете поддержать развитие площадки!