Литералы в программировании: что это и какие бывают

Литералы в программировании: что это и какие бывают Полезное

Литерал — это запись конкретного значения прямо в исходном коде: число 42, строка "Привет", логическое True. Компилятор или интерпретатор берет значение буквально, как оно написано, без обращения к имени. В этой статье разберем, чем литерал отличается от переменной и константы, и пройдем по всем видам литералов: числовым, строковым, логическим, null, символьным и литералам коллекций. Основные примеры — на Python 3.14, рядом — параллели в Java, C, C++ и JavaScript.

Литерал, переменная и константа — разные вещи

Эти три понятия легко путают, поэтому разведем их сразу на одной цепочке:

  • литерал — само значение в тексте программы (42), у него нет имени;
  • переменная — именованная ячейка, в которую значение положили и которое можно заменить (age = 42, потом age = 43);
  • константа — именованное значение, которое по договоренности не переприсваивают (MAX_AGE = 100).
age = 42          # 42 - литерал, age - переменная
age = 43          # переменную можно переприсвоить
MAX_AGE = 100     # константа по соглашению (имя капсом)
print(age, MAX_AGE)
43 100

Важная оговорка: в Python нет ключевого слова для настоящей константы. Договоренность — писать имя капсом (MAX_AGE), а строгую пометку typing.Final проверяет только статический анализатор (например, mypy), но не сам интерпретатор в момент запуска. То есть MAX_AGE = 100; MAX_AGE = 200 в Python выполнится без ошибки. Для сравнения: в Java final int MAX = 100; и в C++ const int MAX = 100; запрещают переприсваивание уже на этапе компиляции. Литерал же в любом языке нельзя изменить в принципе: значение 42 не превратится в 43, меняется только то, что в переменной.

Виды литералов: сводная таблица

Ниже — карта основных видов литералов с формой записи в Python и параллелями. Дальше каждый вид разберем на рабочем коде.

Вид литерала Запись в Python В других языках Пример
Целочисленный 255, 0xFF, 0o377, 0b1111_1111 Java/C/C++/JS: 0xFF, 0b... 0xFF = 255
Вещественный 3.14, 2.5e-3 так же в Java, C, JS 2.5e-3 = 0.0025
Комплексный 3 + 4j нет в Java/C (есть в C99 через тип) 3+4j
Строковый "текст", 'текст' двойные кавычки везде "Привет"
Сырой (raw) r"C:\new" C#: @"...", JS: String.raw r"\n"
Многострочный """...""" JS: обратные кавычки тройные кавычки
Шаблонный f"{name}" JS: `${name}`, C#: $"{name}" интерполяция
Логический True, False true, false True
Пустой None null, C++: nullptr None
Символьный нет (строка длины 1) Java/C/C++: 'A' 'A'
Коллекций [1,2], (1,2), {"a":1}, {1,2} JS: [], {} [1, 2, 3]

Числовые литералы

Числовые литералы бывают целыми, вещественными и (в части языков) комплексными. Начнем с целых. Одно и то же число записывается в разных системах счисления через префиксы, но значение от этого не меняется — меняется только форма записи:

decimal = 255
hexad = 0xFF          # 16-ричная, префикс 0x
octal = 0o377         # 8-ричная, префикс 0o
binary = 0b1111_1111  # 2-ичная, префикс 0b
print(decimal, hexad, octal, binary)
255 255 255 255

Все четыре литерала — это число 255, просто записанное четырьмя способами. Подчеркивания _ внутри числа — разделители разрядов для читаемости (0b1111_1111); на значение они не влияют и поддерживаются в Python с версии 3.6. Похожий прием есть и в других языках, но синтаксис разный: в Java и Python это 1_000_000, в C++14 — апостроф 1'000'000, в JavaScript (с ES2021) — тоже 1_000_000.

Частая ошибка — вписать в запись цифру, недопустимую для этой системы счисления:

value = 0b1012   # цифры 2 в двоичной записи быть не может
SyntaxError: invalid digit '2' in binary literal

Исправляем — в двоичной записи только нули и единицы:

value = 0b1011   # это 11 в десятичной
print(value)     # 11
11

Вещественные (с плавающей точкой) литералы записывают через точку или в научной форме с суффиксом e:

pi = 3.14
tiny = 2.5e-3      # 2.5 * 10^-3 = 0.0025
big = 1_000_000.0
print(pi, tiny, big)
3.14 0.0025 1000000.0

В Python есть еще комплексные литералы — с суффиксом j для мнимой части. В Java и C такого литерала на уровне языка нет (в C99 комплексные числа задаются через тип и заголовок <complex.h>, а не отдельным литералом):

z = 3 + 4j
print(z, abs(z))   # модуль = 5.0
(3+4j) 5.0

Строковые литералы

Строковый литерал — это набор символов в кавычках. В Python двойные и одинарные кавычки равнозначны, что удобно, когда внутри строки нужны кавычки другого вида. Служебные символы задают escape-последовательностями через обратный слеш (\n — перенос строки, \t — табуляция, \" — кавычка внутри строки):

plain = "Привет"
quoted = 'Он сказал "да"'   # двойные внутри одинарных
escaped = "строка\nс переносом"
print(quoted)
print(escaped)
Он сказал "да"
строка
с переносом

Когда обратный слеш нужен как обычный символ (пути Windows, регулярные выражения), удобны сырые (raw) литералы с префиксом r: в них \ не запускает экранирование. Многострочный текст в Python задают тройными кавычками:

raw = r"C:\new\test"        # слеши остаются как есть
multiline = """первая строка
вторая строка"""
print(raw)
print(multiline)
C:\new\test
первая строка
вторая строка

Отдельный вид — шаблонные (интерполируемые) литералы. В Python это f-строки (с версии 3.6): выражение в фигурных скобках вычисляется и подставляется в строку. В JavaScript аналог — шаблонные литералы в обратных кавычках с ${...}, в C# — $"{...}":

name = "Python"
templated = f"Язык {name}, длина имени {len(name)}"
print(templated)
Язык Python, длина имени 6

Аналог в JavaScript выглядит так:

const name = "JS";
console.log(`Язык ${name}`); // Язык JS

Логические литералы и null

Логический литерал принимает одно из двух значений. В Python это True и False (с заглавной буквы), в Java, C++ и JavaScript — true и false со строчной. Отдельный литерал None в Python (аналог null в Java, JavaScript и C#, nullptr в C++) обозначает отсутствие значения — ссылку, которая ни на что не указывает:

flag = True
empty = None
print(flag, empty is None)   # None сверяют через is, не через ==
True True

Здесь важна граница: None — это не то же самое, что 0, пустая строка "" или пустой список []. Все они дают ложь в условии if, но None означает именно «значения нет», а 0 — это конкретное число ноль. Проверять на None принято через is, а не через ==.

Символьные литералы

Символьный литерал — это одиночный символ в одинарных кавычках, например 'A'. Здесь языки расходятся принципиально. В Java, C и C++ символ — отдельный тип: в Java char занимает 16 бит (кодовая единица UTF-16), в C — как правило 1 байт. В Python отдельного символьного типа нет вообще: 'A' — это просто строка длины 1, и одинарные кавычки равнозначны двойным.

// Java: символьный литерал - отдельный тип
char letter = 'A';
int code = letter;   // 65 - код символа
# Python: 'A' - это строка длины 1, не отдельный тип char
letter = 'A'
print(type(letter), ord(letter))   # <class 'str'> 65
<class 'str'> 65

Функция ord() в Python и приведение char к int в Java дают код символа — в примере это 65 для латинской A.

Литералы коллекций

Многие языки позволяют записать целую структуру данных литералом, не вызывая конструктор. В Python это списки, кортежи, словари и множества:

nums = [1, 2, 3]                    # список (list)
point = (10, 20)                    # кортеж (tuple)
user = {"name": "Ann", "age": 25}   # словарь (dict)
unique = {1, 2, 2, 3}               # множество (set), дубли уходят
print(nums, point, user, unique)
[1, 2, 3] (10, 20) {'name': 'Ann', 'age': 25} {1, 2, 3}

Множество из литерала {1, 2, 2, 3} автоматически убирает повтор и хранит {1, 2, 3}. В JavaScript литералами задают массивы [1, 2, 3] и объекты {name: "Ann"} — именно объектный литерал JS стал основой формата JSON. В Java прямого литерала для «объекта на лету», как в JavaScript, нет: массив можно записать литералом {1, 2, 3} при инициализации, а произвольный объект создают через конструктор.

Выводы

  • Литерал — это конкретное значение, записанное прямо в коде; его нельзя изменить, в отличие от переменной, и у него нет имени, в отличие от константы.
  • Числовые литералы делятся на целые (в разных системах счисления через 0x, 0o, 0b), вещественные (точка и научная форма e) и комплексные; разделитель _ только улучшает читаемость.
  • Строковые литералы поддерживают экранирование, сырую форму (r"..."), многострочность (тройные кавычки) и интерполяцию (f-строки в Python, шаблонные литералы в JS).
  • Логические (True/False), None, символьные и литералы коллекций различаются по языкам: в Python нет отдельного типа char, а None не равно нулю или пустой строке.
  • Синтаксис литералов у языков близок, но не совпадает — префиксы систем счисления, разделители разрядов и интерполяция записываются по-разному.

Где применяется / связь с практикой

Литералы — первое, что набирает начинающий программист: любое значение в коде, от счетчика цикла до текста сообщения, начинается с литерала. Уверенное понимание видов литералов помогает не путать 0o17 и 17, читать чужой код с f-строками и raw-строками и не спотыкаться на разнице None, 0 и "". Дальше эти навыки складываются в работу с типами данных, коллекциями и форматами вроде JSON.

Освойте тему на практике

Системно разобрать синтаксис Python, включая все виды литералов, типы данных и структуры, можно на курсе Python Basic. Если хочется сначала посмотреть формат обучения и уровень задач, загляните на открытые уроки Otus — там разбирают темы вживую и отвечают на вопросы.

FAQ

Литерал и константа — это одно и то же?
Нет. Литерал — безымянное значение в коде (100), а константа — именованное значение, которое договорились не менять (MAX = 100). Константа хранит литерал, но у нее есть имя, а у литерала нет.

Почему 0xFF и 255 дают одно и то же число?
Это одно значение в разных системах счисления: 0xFF — шестнадцатеричная запись, 255 — десятичная. Префикс задает только форму записи в исходнике, в память попадает одинаковое целое.

В Python есть тип char для одного символа?
Нет, отдельного символьного типа в Python нет. Одиночный символ 'A' — это строка (str) длины 1. Отдельный тип char есть в Java, C и C++.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)