что такое литерал в python
Литералы строк
Литералы строк позволяют интерпретатору Python убедиться что перед ним действительно находится строка. Такой подход называется «утиной» типизацией – если что-то плавает как утка, крякает ка утка и откладывает яйца как утка, то скорее всего это действительно утка. То же самое и с литералами строк – если что-то соответствует литералам строк, то это можно считать строкой. Вот и все.
В самом простом случае, строкой является последовательность символов заключенная в апострофы, кавычки, тройные кавычки или тройные апострофы:
Если внутри строки должны содержаться апострофы или кавычки, то сама строка должна обрамляться кавычками или апострофами соответственно:
Тем не менее если вам нужно использовать внутри стрроки кавычки или апострофы, то лучше всего экранировать их специальным символом \ :
В этом случае можно точно гарантировать, что интерпретатор поймет все правильно и никаких ошибок не произойдет.
Каквычки и апострофы служат для создания «коротких» строк, а тройные кавычки и тройные апострофы для «длинных». Лучше всего это можно продемонстрировать с помощью функции print() и специальных непечатаемых символов, например таких как \n – символ переноса строки, \t – символ табуляции (отступа).
При создании «длинных» строк нам не нужно вводить все непечатаемые символы вручную, т.е. мы можем печатать текст так, как привыкли это делать, спокойно используя клавиши Tab и Enter:
Причем, обычный вывод снова печатает строку «как есть», обозначая все символы переноса и табуляции:
А вот функция print() выполняет интерпретацию всех непечатаемых символов, выполняя все необходимые преобразования, в местах где они встречаются:
Ввод длинных строк
Наличие очень длинных строк в коде, очень затрудняет его чтение, поэтому в Python, предусмотренно несколько способов ввода таких строк. Допустим у нас есть какая-то очень длинная строка и по каким-то причинам мы не можем вставлять внутрь символ » \n «, что автоматически означает невозможность использования тройных кавычек или тройных апострофов. Ну не вводить же эту строку вот так:
Следует сразу отметить, что символ переноса строки » \n » для интерпретатора означает конец инструкции, но только в том случае если этот символ не находится внутри: круглых ( () ), квадратных ( [] ) и фигурных ( <> ) скобок, а так же тройных кавычках или тройных апострофах. Это очень удобно, если нам необходимо вводить очень длинные последовательности, например матрица 6×6 может быть введена вот так:
И в коде это будет смотреться гораздо лучше чем вот это:
Но для одинарных кавычек или апострофов этот способне не подойдет. Здесь на помощь приходит символ » \ » (newline), который интерпретируется как «новая строка«, а не перевод на новую строку. Этот символ позволяет писать очень длинные «однострочные» иструкции в нескольких строках кода. И если вернуться к нашей строке:
То с помощью символа » \ » и оператора конкатенации мы можем записать ее вот так:
Второй способ, связан с тем, что если две строки присутствуют рядом в одной строке кода и разделены только пробелами, то они автоматически объединяются:
Надо сразу отметить, что этот трюк работает только для строковых литералов:
А если вспомнить, что символ » \n » игнорируется внутри круглых скобок, то наша длинная строка может быть записана и так:
Именно этот способ рекомендуется использовать в коде. Причем данный способ (в отличие от предыдущего) допускает комментирование:
Префиксы
Так же к литералам строк можно отнести префиксы (в скобках указаны альтернативные способы их написания):
Нужно сразу уточнить, что между префиксом и строкой не может быть знаков пробела.
Префикс u
Префикс u обозначает строки Юникода и существует лишь для совместимости строк в коде Python3 и Python2. Так что если вы имеете дело только с Python3, то можете смело забыть об этом префиксе.
Префикс r
Префикс r обозначает неформатируемые (или необрабатываемые) строки, в которых подавляется действие символов экранирования. Такие строки очень удобны, для хранения путей к файлам в Windows, например:
Такие строки можно спокойно использовать для работы с файловой системой. Единственное, что следует помнить так это то что неформатированная строка не может заканчиваться символом обратного слеша, т.е. строка r’D:\\мои документы\книги\’ является недопустимой (как и любая друга строка, заканчивающаяся нечетным количеством обратных слешей). В этой ситуации можно поступить тремя способами.
Можно добавить экранированный символ обратного слеша \\ вручную:
Или вообще вместо экранированных строк использовать обычные, в которых каждый символ обратного слеша экранирован:
Так же неформатированные строки очень часто используются для хранения разметки LATEX, которая может быть использована для создания математических формул. Например, строка \sum_
А в Python использовать такую строку можно так:
Префикс b
Префикс f
Работа данного префикса основана том же микроязыке спецификаторов форматирования, который использует метод format() (см смотрите str.format() — метод форматирования строк). На первый взгляд, этот язык выглядит довольно замысловатой штукой, но если разобраться, то все станет довольно просто.
Действительно замысловато, но в определенных ситуациях весьма и весьма удобно:
В общем, будем считать, что с префиксом f мы немного познакомились, но по хорошему, он заслуживает отдельной страницы.
Префикс fr
Префикс fr определяет литералы форматируемых (!) неформатируемых строк. Иногда, строки с префиксом r действительно называют неформатируемыми, подразумевая, что экранированные последовательности не обрабатываются, а раз они содержат необработанные экранированные последовательности, то их и называют «сырыми». Таким образом, префикс fr это форматируемая «сырая строка».
Существуют ситуации, в которых такие строки могут оказаться весьма удобны. Например, формирование путей к файлам:
Однако, для работы с разметкой LATEX (для математических) формул этот префикс вряд ли подойдет. Тем не менее он все равно используется, даже несмотря на то что вызывает много путаницы. Например у нас есть формула:
Для сохранения каждой фигурной скобки, нам пришлось ее дублировать, т.к. если этого не делать то интерпретатор может ее счесть за начало указателя для вставки поля:
Конечно мы могли бы воспользоваться оператором конкатенации и собрать необходимую строку по частям, но и этот способ может оказаться вполне жизнеспособным.
Префикс br
Префикс br определяет «сырые» строки байтов, в которых каждый байт всегда выводится в шестнадцатеричном формате, а символы обратного слеша дополнительно экранируются. Обычные строки байтов могут содержать ASCII символы, но иногда это нежелательно:
И вот здесь я должен честно признаться, что вообще не понимаю для чего это может пригодиться. Но раз этот префикс добавили, значит, это кому-нибудь нужно.
Но все же, допустим у нас есть строка байтов b’\x61′ :
Добавим префикс br :
Посмотрим на длины строк:
То поймем, что обращение к символам по индексу возвращает числовые коды Юникода. А это лишний раз подтверждает, что я вообще не понимаю для чего нужен этот префикс.
Python Литералы
Python Литералы пришли в язык Python из других языков программирования, но я впервые узнал о них только в 2017-м году. Авторы учебников обычно избегают давать чёткие определения — приходится искать в Интернете.
Литерал (англ. literal ) — запись в исходном коде компьютерной программы, представляющая собой фиксированное значение.
Литералами также называют представление значения некоторого типа данных.
Описание
Литералы представляют собой константы, включаемые непосредственно в текст программы, в отличие от прочих элементов языка (констант, переменных). Литералы не могут быть изменены в тексте программы.
В следующем примере 1 и Кот это литералы, а a1, c и cat — переменные:
int a1 = 1;
int c = a1;
string cat = «Кот»;
Литерал в языке Python — это выражение, создающее объект.
Типы литералов
Почти все языки программирования допускают использование тех или иных литералов для примитивных типов. Однако, синтаксис литералов может значительно отличаться.
Обычно выделяют следующие элементарные типы литералов:
Числовые литералы — литералы для записи чисел. Иногда числовые литералы подразделяются на целые литералы, дробные литералы и т. п. с различной точностью представления и в различных системах счисления (например, битовые литералы в PL/I).
В программах числовые литералы обычно записываются в привычном для числа виде. В следующем примере 100 и 3.1415 — числовые литералы:
int a = 100;
float b = 3.1415;
Строковые литералы обычно представляют собой строку символов, заключённую в кавычки или скобки.
В некоторых языках программирования выделяют символьные литералы, включающие один символ. В разных языках программирования допускаются различные типы кавычек.
Например, в следующем примере на языке JavaScript один и два — строковые литералы, записанные с использованием различных допустимых типов кавычек:
var one = «один»;
var two = ‘два’;
Логические литералы, Логические значения — два литерала: true и false или их аналоги — T, t, Y, y, F, f, N, n, NIL и т. п.. Например:
bool t = true;
bool f = false;
Литерал ссылочного типа, адрес в памяти — обычно, числовые литералы, указывающие на ячейку в памяти.
Null-литерал, Пустое значение — особый тип литерала, в зависимости от языка программирования, относящийся к ссылочному либо объектному типу. Единственное допустимое значение этого типа литералов null, или аналог, например NIL, None, Nothing — ссылка никуда не ведёт либо объект отсутствует.
Регулярные выражения. В некоторых языках программирования регулярные выражения представляют собой литерал особого типа, включающий две части: шаблон для поиска и замену. Например:
В некоторых объектно ориентированных языках программирования (например, ECMAScript третьей версии) допускается использовать выражения, которые служат массивами-литералами и объектами-литералами. Например:
[1, 2, 3, 4, 5] // Инициализатор массива
Иногда анонимные функции относят к литералам-функциям, а анонимные объекты к литералам-объектам.
Приведенная цитата разъяснила мне многое, вопросов пока что нет.
Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В хороших комментариях сохраняю ссылку на сайт автора!
И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта. Продолжение тут…
Работа со строками в Python: литералы
Строки в Python — упорядоченные последовательности символов, используемые для хранения и представления текстовой информации, поэтому с помощью строк можно работать со всем, что может быть представлено в текстовой форме.
Это первая часть о работе со строками, а именно о литералах строк.
Литералы строк
Работа со строками в Python очень удобна. Существует несколько литералов строк, которые мы сейчас и рассмотрим.
Строки в апострофах и в кавычках
Строки в апострофах и в кавычках — одно и то же. Причина наличия двух вариантов в том, чтобы позволить вставлять в литералы строк символы кавычек или апострофов, не используя экранирование.
Экранированные последовательности — служебные символы
Экранированные последовательности позволяют вставить символы, которые сложно ввести с клавиатуры.
Экранированная последовательность | Назначение |
---|---|
\n | Перевод строки |
\a | Звонок |
\b | Забой |
\f | Перевод страницы |
\r | Возврат каретки |
\t | Горизонтальная табуляция |
\v | Вертикальная табуляция |
\N | Идентификатор ID базы данных Юникода |
\uhhhh | 16-битовый символ Юникода в 16-ричном представлении |
\Uhhhh… | 32-битовый символ Юникода в 32-ричном представлении |
\xhh | 16-ричное значение символа |
\ooo | 8-ричное значение символа |
\0 | Символ Null (не является признаком конца строки) |
«Сырые» строки — подавляют экранирование
Если перед открывающей кавычкой стоит символ ‘r’ (в любом регистре), то механизм экранирования отключается.
Но, несмотря на назначение, «сырая» строка не может заканчиваться символом обратного слэша. Пути решения:
Строки в тройных апострофах или кавычках
Главное достоинство строк в тройных кавычках в том, что их можно использовать для записи многострочных блоков текста. Внутри такой строки возможно присутствие кавычек и апострофов, главное, чтобы не было трех кавычек подряд.
Это все о литералах строк и работе с ними. О функциях и методах строк в следующей статье.
§3 Алфавит Python. Литералы. Идентификаторы. Ключевые слова
Лексический анализ
Первый шаг интерпретации программы на языке Python – лексический анализ кода. Символы алфавита любого языка программирования образуют лексемы. Если декларация кодировки отсутствует, то, по умолчанию, для построения лексем используются символы кодировки UTF-8. Лексический анализатор получает поток лексем. Лексема (token) – это минимальная единица языка, имеющая самостоятельный смысл. Лексемы – формируют базовый словарь языка, понятный компилятору. Если исходный файл не может быть расшифрован, то будет выдано сообщение об ошибке.
Всего существует пять видов лексем:
- Ключевые слова (keywords) Идентификаторы (identifiers) Литералы (literals) Операции (operators) Знаки пунктуации (разделители, punctuators)
Строки исходного файла
Физическая строка исходного файла – это строка заканчивающаяся символом признака конца строки. Этот признак – специальный символ, зависящий от платформы. В Unix, использует ASCII LF (перевод строки), в Windows – последовательность ASCII CR LF (возврат каретки с последующим переводом строки) и Macintosh – ASCII CR (возврат каретки). Все эти формы можно использовать в равной степени, независимо от платформы.
Логические строки
Программа Python разделена на несколько логических строк. Логическая строка содержит одну или более физических строк, соединяющихся правилами языка. (В интерактивном режиме продолжение логической строки на новой физической строке будет начинаться с символов . ).
Отступы в начале строки
Ведущие пробельные символы (пробелы и табуляции) в начале строки используются в Python для определения группы инструкций, как единого целого – составной инструкции или блока. Отступы в пределах блока должны быть равной символьной длины, иначе это приведет к ошибке. Для совместимости на разных платформах не следует применять смесь из пробелов и табуляций.
Например:
Комментарии
Объединение нескольких физических строк
Две (или более) физические строки могут быть объединены в одну логическую строку с использованием обратного слэша ( «\» ), а именно: когда физическая строка заканчивается символом «\» и он не является частью строки (т. е. не находится в пределах » » ) или комментария, он присоединяет следующую физическую строку, образуя одну логическую строку. После символа «\» должен следовать символ признака конца строки (т. е. физическая строка должна заканчиваться). Например:
Не явное объединение физических строк
Выражения в скобках, в квадратных скобках, либо в фигурных скобках можно разделить на несколько физических строк без использования обратной косой черты. Например:
Идентификаторы
Идентификатор – это имя программного объекта: переменной, константы, массива, функции, класса и т. п.
При выборе имени для объекта необходимо руководствоваться следующими правилами:
Примечание: Python позволяет переопределять имена встроенных объектов, поэтому необходимо знать допустимость использования того или иного идентификатора. Для того, чтобы узнать весь список имен встроенных объектов python, можно использовать функцию dir() с параметром __builtins__ :
Литералы
Литералы, иначе константы – это неизменяемые величины.
Целочисленные литералы
Действительные литералы
Escape-последовательности
Операции
Список литералов, используемых для операций в языке Python:
Разделители
Эти литералы используются в качестве разделителей:
Разделители сокращенного присваивания могут выступать и как разделители и как операции.
Неиспользуемые символы
Эти символы ASCII не используются в языке Python:
Их появление за пределами строковых литералов и комментариев является безусловной ошибкой.
Вопросы
Темы сообщений
Презентация
Учебник
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Новинки аннотаций типов в Python 3.8 (Protocol, Final, TypedDict, Literal)
Сегодня ночью вышел Python 3.8 и аннотации типов получили новые возможности:
Если вы ещё не знакомы с аннотациями типов, рекомендую обратить внимание на мои предыдущие статьи (начало, продолжение)
И пока все переживают о моржах, я хочу кратко рассказать о новинках в модуле typing
Протоколы
В Python используется утиная типизация и от классов не требуется наследование от некоего интерфейса, как в некоторых других языках.
К сожалению, до версии 3.8 мы не могли выразить необходимые требования к объекту с помощью аннотаций типов.
PEP 544 призван решить эту проблему.
Такие термины как «протокол итератора» или «протокол дескрипторов» уже привычны и используются давно.
Теперь можно описывать протоколы в виде кода и проверять их соответствие на этапе статического анализа.
Стоит отметить, что начиная с Python 3.6 в модуль typing уже входят несколько стандартных протоколов.
Например, SupportsInt (требующего наличие метода __int__ ), SupportsBytes (требует __bytes__ ) и некоторых других.
Описание протокола
Протокол описывается как обычный класс, наследующийся от Protocol. Он может иметь методы (в том числе с реализацией) и поля.
Реальные классы, реализующие протокол могут наследоваться от него, но это не обязательно.
Мы можете комбинировать протоколы с помощью наследования, создавая новые.
Однако в этом случае вы так же должны явно указать Protocol как родительский класс
Дженерики, self-typed, callable
Протоколы как и обычные классы могут быть Дженериками. Вместо указания в качестве родителей Protocol и Generic[T, S. ] можно просто указать Protocol[T, S. ]
Ещё один важный тип протоколов — self-typed (см. PEP 484). Например,
Кроме того, протоколы могут использоваться в тех случаях, когда синтаксиса Callable аннотации недостаточно.
Просто опишите протокол с __call__ методом нужной сигнатуры
Проверки в рантайме
Хотя протоколы и рассчитаны в первую очередь на использование статическими анализаторами, иногда бывает нужно проверить принадлежность класса нужному протоколу.
Чтобы это было возможно, примените к протоколу декоратор @runtime_checkable и isinstance / issubclass проверки начнут проверять соответствие протоколу
Однако такая возможность имеет ряд ограничений на использование. В частности, не поддерживаются дженерики
Типизированные словари
Аналогично датаклассам или типизированным кортежам есть два способа объявить типизированный словарь. Путем наследования или с помощью фабрики:
Типизированные словари поддерживают наследование:
По умолчанию все ключи словаря обязательны, но можно это отключить передав total=False при создании класса.
Это распространяется только на ключи, описанные в текущем кассе и не затрагивает наследованные
Использование TypedDict имеет ряд ограничений. В частности:
Модификатор Final
PEP 591 вводит модификатор final (в виде декоратора и аннотации) для нескольких целей
Literal
Например, Literal[42] означает, что в качестве значения ожидается только 42.
Важно, что проверяется не только равенство значения, но и его тип (например, нельзя будет использовать False, если ожидается 0).
В скобках при этом можно передать несколько значений, что эквивалентно использованию Union (типы значений при этом могут не совпадать).
В качестве значения нельзя использоваться выражения (например, Literal[1+2] ) или значения мутабельных типов.
Обработка типов в рантайме
Если вы хотите во время работы программы обрабатывать различную информацию о типах (как я),
теперь доступны функции get_origin и get_args.
К сожалению, функцию для __parameters__ не сделали