Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 55
Текст из файла (страница 55)
Здесь будет представлен основной строковыйтип str, который применяется для работы с текстовыми данными ASCII и принцип действия которого не изменяется в разныхверсиях Python. То есть эта глава преднамеренно ограничивается изучением основных способов обработки строк, которые применяются в большинстве сценариев на языке Python.С более формальной точки зрения, ASCII����������������������������������������������������� – это всего лишь разновидность текста Юникода. Различие между текстовыми и двоичными данными в языке Python обеспечивается за счет поддержки различных типов данных:•• В Python 3.0 существует три строковых типа: str – для представления текста Юникода (содержащего символы в кодировкеASCII и символы в других кодировках), bytes – для представления двоичных данных (включая кодированный текст) и bytearray – изменяемый вариант типа bytes.•• В Python 2.6 для представления текста Юникода используетсятип unicode, а для представления двоичных и текстовых данных, состоящих из 8-битных символов, используется тип str.210Глава 7.
СтрокиТип bytearray также доступен в версии 2.6, но не в более ранних версиях,и он не так тесно связан с двоичными данными, как в версии 3.0. Поскольку большинству программистов не требуется полное знание всех тонкостейкодирования Юникода или форматов представления двоичных данных,я поместил описание всех этих тонкостей в раздел «Расширенные возможности» этой книги, в главу 36.Если вам действительно потребуется знание расширенных концепций работы со строками, таких как альтернативные наборы символов или упакованные двоичные данные и файлы, после знакомства с материалом, которыйприводится здесь, обращайтесь к главе 36. А теперь мы сосредоточимся наосновном строковом типе и на его операциях. Основы, которые мы будемздесь рассматривать, в равной степени относятся и к дополнительным строковым типам в языке Python.Литералы строкВообще говоря, работать со строками в языке Python достаточно удобно.
Самое сложное, пожалуй, – это наличие множества способов записи строк в программном коде:•• Строки в апострофах: ‘spa”m’•• Строки в кавычках: “spa’m”•• Строки в тройных кавычках: ‘’’... spam ...’’’, “””... spam ...”””•• Экранированные последовательности: “s\tp\na\0m”•• Неформатированные строки: r”C:\new\test.spm”•• Строки байтов в версии 3.0 (глава 36): b’sp\x01am’•• Строки символов Юникода, только в версии 2.6 (глава 36): u’eggs\u0020spam’Варианты представления строк в апострофах и кавычках являются наиболеетипичными, остальные играют особую роль, и мы отложим обсуждение последних двух форм до главы 36.
Давайте коротко рассмотрим каждый из этихвариантов.Строки в апострофах и в кавычках – это одно и то жеКавычки и апострофы, окружающие строки, в языке Python������������������������������������являются взаимозаменяемыми. То есть строковые литералы можно заключать как в апострофы, так и в кавычки – эти две формы представления строк ничем не отличаются, и обе они возвращают объект того же самого типа. Например, следующиедве строки совершенно идентичны:>>> ‘shrubbery’, “shrubbery”(‘shrubbery’, ‘shrubbery’)Причина наличия двух вариантов состоит в том, чтобы позволить вставлятьв литералы символы кавычек и апострофов, не используя для этого символ обратного слеша.
Вы можете вставлять апострофы в строки, заключенные в кавычки, и наоборот:>>> ‘knight”s’, “knight’s”(‘knight”s’, “knight’s”)Литералы строк211Между прочим, Python автоматически объединяет последовательности строковых литералов внутри выражения, хотя нет ничего сложного в том, чтобы добавить оператор + между литералами и вызвать операцию конкатенации явно:>>> title = “Meaning “ ‘of’ “ Life” # Неявная конкатенация>>> title‘Meaning of Life’Обратите внимание, если добавить запятые между этими строками, будет получен кортеж, а не строка.
Кроме того, заметьте, что во всех этих примерахинтерпретатор предпочитает выводить строки в апострофах, если их нет внутри строки. Кавычки и апострофы можно вставлять в строки, экранируя ихсимволом обратного слеша:>>> ‘knight\’s’, “knight\”s”(“knight’s”, ‘knight”s’)Чтобы понять, зачем, вам необходимо узнать, как работает механизм экранирования вообще.Экранированные последовательностипредставляют служебные символыВ последнем примере кавычка и апостроф внутри строк предваряются символом обратного слеша.
Это частный случай более общей формы: символы обратного слеша используются для вставки специальных символов, известных какэкранированные последовательности.Экранированные последовательности позволяют вставлять в строки символы,которые сложно ввести с клавиатуры. В конечном строковом объекте символ\ и один или более следующих за ним символов замещаются единственнымсимволом, который имеет двоичное значение, определяемое экранированнойпоследовательностью.
Например, ниже приводится строка из пяти символов,в которую вставлены символ новой строки и табуляции:>>> s = ‘a\nb\tc’Последовательность \n образует единственный символ – байт, содержащийдвоичное значение кода символа новой строки в используемом наборе символов (обычно ASCII-код 10). Аналогично последовательность \t замещается символом табуляции.
Как будет выглядеть такая строка при печати, зависит оттого, как она выводится. Функция автоматического вывода в интерактивнойоболочке отобразит служебные символы как экранированные последовательности, а инструкция print будет интерпретировать их:>>> s‘a\nb\tc’>>> print(s)abcЧтобы окончательно убедиться, сколько байтов входит в эту строку, можновоспользоваться встроенной функцией len – она возвращает фактическое число байтов в строке независимо от того, как строка отображается на экране:>>> len(s)5212Глава 7. СтрокиДлина этой строки составляет пять байтов: она содержит байт ASCII-символаa, байт символа новой строки, байт ASCII-символа b и так далее.
Обратите внимание, что символы обратного слеша не сохраняются в памяти строкового объекта – они используются лишь для того, чтобы вынудить интерпретатор сохранить значения байтов в строке. Для представления служебных символов языкPython обеспечивает полный набор экранированных последовательностей,перечисленных в табл. 7.2.Таблица 7.2.
Экранированные последовательностиПоследовательностьНазначение\newlineИгнорируется (продолжение на новой строке)\\Сам символ обратного слеша (остается один символ \)\’Апостроф (остается один символ ‘)\”Кавычка (остается один символ “)\aЗвонок\bЗабой\fПеревод формата\nНовая строка (перевод строки)\rВозврат каретки\tГоризонтальная табуляция\vВертикальная табуляция\xhhСимвол с шестнадцатеричным кодом hh(не более 2 цифр)\oooСимвол с восьмеричным кодом ooo (не более 3 цифр)\0Символ Null (не признак конца строки)\N{id}Идентификатор ID базы данных Юникода\uhhhh16-битный символ Юникода в шестнадцатеричномпредставлении\Uhhhhhhhh32-битный символ Юникода в шестнадцатеричномпредставленииa\другоеНе является экранированной последовательностью(символ обратного слеша сохраняется)Некоторые экранированные последовательности позволяют указывать абсолютные двоичные значения в байтах строк.
Например, ниже приводится пример строки из пяти символов, содержащей два нулевых байта:aЭкранированная последовательность \Uhhhhhhhh состоит ровно из восьми шестнадцатеричных цифр (h). Последовательности \u и \U могут использоваться только в литералах строк символов Юникода.Литералы строк213>>> s = ‘a\0b\0c’>>> s‘a\x00b\x00c’>>> len(s)5В языке Python нулевой байт (символ null) не является признаком завершениястроки, как в языке C. Интерпретатор просто сохраняет в памяти как текстсамой строки, так и ее длину.
Фактически в языке Python вообще нет символа,который служил бы признаком завершения строки. Ниже приводится строка,полностью состоящая из экранированных кодов, – двоичные значения 1 и 2(записаны в восьмеричной форме), за которыми следует двоичное значение 3(записано в шестнадцатеричной форме):>>> s = ‘\001\002\x03’>>> s‘\x01\x02\x03’>>> len(s)3Обратите внимание, что интерпретатор �����������������������������������Python�����������������������������отображает непечатаемые символы в шестнадцатеричном представлении, независимо от того, в каком видеони были указаны внутри литерала. Вы без ограничений можете комбинировать абсолютные экранированные значения с другими типами экранированных последовательностей, которые приводятся в табл. 7.2.