Лутц М. - Изучаем Python (1077325), страница 42
Текст из файла (страница 42)
Вторая и третья инструкции делают то же самое, но используют 2-байтовое и 4-байтовое представление в виде экранированных последовательностей. Даже если вы полагаете, что вам не понадобятся символы Юникода, вам, возможно, хотя бы неявно придется использовать их. Поскольку На практике строки символов Юникода поддерживают все обычные операции над строками, которые встретятся вам в следующем разделе, поэтому для вашего программного кода различия в типах играют несущественную роль. Подобно обычным строкам, строки символов Юникода могут объединяться, из них можно извлекать отдельные символы и подстроки, производить поиск по шаблону с помощью модуля ге и т.
д., и эти строки также являются неизменяемыми. Даже если у вас возникнет необходимость явно выполнить преобразо. ванне между этими двумя типами, вы можете использовать встроенную функцию оптсобе: 189 Литералы строк некоторые программные интерфейсы (например, СОМ АР1 в «т'1пс(отта и некоторые синтаксические анализаторы ХМ1 ) представляют текст в кодировке Юникод, это может повлечь за собой необходимость выполнять преобразование между обычной кодировкой и кодировкой Юникод при передаче текста таким АР1 или при получении результатов.
В большинстве случаев интерпретатор Ру$Ьоп рассматривает эти два типа строк как взаимозаменяемые, поэтому присутствие строк символов Юникода часто проходит незамеченным для вашего программного кода — в большинстве случаев вы можете просто игнорировать тот факт, что текст передается между программными компонентами в виде объектов строк символов Юникода, и использовать обычные строковые операции. Поддержка Юникода — это полезное встроенное дополнение в языке Ру1Ьоп, поэтому данные в кодировке Юникод легко обрабатываются в сценариях. Безусловно, о Юникоде можно рассказать больше.
Например: ° Объекты строк Юникода предоставляют метод, выполняющий преобразования строки символов Юникода в обычную строку 8-битовых символов с использованием указанной кодировки. ° Встроенная функция зл(собе и модуль собеса поддерживают зарегистрированные «кодеки» («сос(ес», от слов «СОс(егз» и «ПЕСобегз») Юникода. ° Функция орел из модуля собес позволяет обрабатывать текстовые файлы в кодировке Юникод, где каждый символ может быть представлен более чем одним байтом. ° Модуль ол(созесата предоставляет доступ к базе данных символов Юникода. ° Модуль зуз включает функции для получения и изменения схемы кодирования Юникод (по умолчанию обычно используется АЗСП).
° Допускается комбинировать форматы представления неформатированных строк и строк символов Юникода (например, ос ' атэтс '). Поскольку тема использования кодировки Юникод является достаточно сложной, и это не самый распространенный инструмент, мы не будем обсуждать ее далее в этой вводной книге. Дополнительные сведения о Юникоде вы найдете в стандартном руководстве по языку РутЬоп. о В Ру«Ьоп 3.0 строковый тип претерпит некоторые изменения: в версии 3.0 текущий тип зт г всегда будет представлять строки символов Юникода, а также появится новый тнп — «байты», изменяемая последовательность малых целых чисел, удобная для представления коротких строк символов.
Некоторые операции чтения из файла будут возвращать байты вместо типа зт г (например, прн чтении двоичных файлов). Однако все зто пока только в планах, поэтому подробности вам следует искать в примечаниях к выпуску 3.0. Глава 7. Строки 190 Строки вдействии Как только с помощью литеральных выражений, с которыми мы только что познакомились, строка будет создана, вам наверняка потребуется выполнять какие-либо операции с ее участием.
В этом и в следующих двух разделах демонстрируются основы работы со строками, форматирование и методы — первая линия инструментальных средств обработки текста в языке Ру()топ. Базовые операции Давайте запустим интерактивный сеанс работы с интерпретатором Ру- $)топ, чтобы проиллюстрировать базовые операции над строками, которые были перечислены в табл.
7.1. Строки можно объединять с помощью оператора конкатенации + и дублировать с помощью оператора повторения *: и рутпоп »> 1вп('ввс') 3 »> 'вЬЬ' + 'Овт' 'аЬсвет' »> 'иы' и 'И(! ИП ИП ИП ' В длина: число алвивнтов В Конкатенация: новая строка В Повторение: подобно "Ит! " + ут! " + В отличие от массивов символов з языке С, при работе со строками з языке Ру()топ звм не нужно выделять илн управлять памятью массивов — зы просто создаете объекты строк, когда в этом возникает необходимость, и позволяете интерпретатору самому управлять памятью, выделяемой для этих объектов. Квк уже говорилось з предыдущей главе, Ру()топ автоматически освобождает память, занятую ненужными объектами, используя стрвтегвю сборки мусора, основанную нв подсчете количества ссылок.
Каждый объект следит зв количеством имен, структур данных и другими компонентами, которые ссылаются на него. Когда количество ссылок уменьшается до нуля, интерпретатор освобождает намять, занятую объектом. Зто означает, что интерпретатору не требуется останавливаться в просматривать всю память з поисках неиспользуемого пространства (дополяительвый компонент сборки мусора собирает также циклические объекты).
Формально операция сложения двух строковых объектов создает новый строковый объект, объединяющий содержимое операндов, Операция повторения напоминает многократное сложение строки с самой собой. В обоих случаях Ру()топ позволяет создавать строки произвольного размера — нет никакой необходимости предварительно объявлять что бы то ни было, включая размеры структур данных.' Встроенная функция 1вп возвращает длину строки (или любого другого объекта, который имеет длину). Операция повторения на первый взгляд выглядит несколько странно, но она очень удобна в очень широком диапазоне применений. Напри- 191 Строки в действии В ВО дефисов, сложный способ В ВО дефисов, простой способ »> рг1пт '--- — — ...иного дефисов... »> рг1п1 '-' ° 80 Обратите внимание: здесь работает механизм перегрузки операторов: мы используем те же самые операторы + и *, которые используются для выполнения операций сложения и умножения с числами.
Интерпретатор выполняет требуемую операцию, потому что ему известны типы объектов, к которым применяются операции сложения и умножения. Но будьте внимательны: правила не так либеральны, как может показаться. Например, интерпретатор не позволяет смешивать строки и числа в выражениях сложения: ' аЬс ' + 9 вызовет ошибку вместо того, чтобы автоматически преобразовать число 9 в строку.
Как показано в последней строке табл. 7.1, допускается выполнять обход элементов строки в цикле, используя инструкцию рог, и проверять вхождение подстроки в строку с помощью оператора выражения 1п, который, по сути, выполняет операцию поиска: »> ау)оэ = "Паскег" »> тог с 1п ау)оь: рг1пс с, й Обход элеиентов строки в цикле и а с к е г »> "К" 1п ау)оа Тгце »> "а" 1п ау)ЬЬ Га!эе й Найдено Ф Не найдено Оператор цикла ро г присваивает переменной очередной элемент последовательности (в данном случае — строки) и для каждого элемента выполняет одну или более инструкций. В результате переменная с превращается в своего рода курсор, который постепенно перемещается по строке.
Далее в этой книге мы подробнее рассмотрим средства выполнения итераций, подобных этим. Доступ по индексам и извлечение подстроки Так как строки определены как упорядоченные коллекции символов, мы можем обращаться к элементам строк по номерам позиций. В языке РуЖоп символы извлекаются из строк с помощью операции ивдексироеония — указанием числового смещения требуемого компонента в квадратных скобках после имени строки. В результате операции вы получаете строку, состоящую из одного символа, находящегося в указанной позиции. Как и в языке С, в языке Ру1поп смещения символов в строках начинают исчисляться с О, а последний символ в строке имеет смещение на единицу меньше длины строки.
Однако, в отличие от С, Ру1)топ также позволяет извлекать элементы последовательностей, таких как строки, мер, чтобы вывести строку из 80 символов дефиса, можно самому сосчитать до 80, а можно возложить эту работу на плечи интерпретатора: Строки в действии 193 Как же выполняется операция получения среза? Когда производится индексирование объекта последовательности, такого как строка, парой смещений, разделенных двоеточием, интерпретатор РуФ[топ возвращает новый объект, содержащий непрерывную область, определяемую парой смещений. Значение смещения слева от двоеточия обозначает левую границу (включительно), а справа — верхнюю границу (она не входит в срез). Интерпретатор извлекает все элементы от нижней границы до верхней, но верхняя граница в срез не включается.
Если левая и правая граница опущены, по умолчанию принимаются значения, равные О и длине объекта, из которого извлекаетея срез, соответственно. Например, для только что рассмотренного примера выражение 8[1: 3] вернет элементы ео смещениями 1 и 2. То есть будут извлечены второй и третий элементы, и операция остановится перед четвертым элементом со смещением, равным 3. Выражение 8[1: ] вернет все элементы, расиололсенные эа первым, — за значение верхней границы, которая в выражении опущена, по умолчанию принимается длина строки. Наконец, выражение 8[: -1] вернет все элементы, кроме последнего.
— за значение нижней границы по умолчанию принимается О, а индекс -1 соответствует последнему элементу, который в срез не включается. Все это может показатьея на первый взгляд слишком замысловатым, но операции извлечения отдельных элементов и срезов превратятся в простые и мощные инструменты, как только вы ими овладеете. Если вы забыли, как выполняется срез, попробуйте получить его в интерактивном сеансе. В следующей главе вы увидите, что существует возможность изменить целый раздел определенного объекта одной инструкцией, достаточно лишь выполнить операцию присваивания срезу.
Далее приводится краткий обзор для справки: ° Операция индексирования (8[1]) извлекает компоненты по их смещениям: ° Первый элемент имеет смещение, равное О. ° Отрицательные индексы определяют смещения в обратном порядке — от конца, или справа. ° Выражение 8[0] извлекает первый элемент. ° Выражение Я[-2] извлекает второй с конца элемент (так же как и выражение 8[1еп(8)-2]). ° Операция извлечения подстроки (8[1:]]) извлекает непрерывный раздел последовательности: ° Элемент с индексом, равным верхней границе, не включается в срез.