Саммерфилд - Программирование на Python 3 (1077331), страница 18
Текст из файла (страница 18)
сошр11е(г" ((?: [(]хо+[) ])?уз*хо»(?: -хо»)?)3' ) 86 Глава 2. Типы данных Таблица 2.6. Экранированные последовательности в языке РуГИоп Последовательность Значение Экранирует (то есть игнорирует) символ перевода строки Символ обратного спеша (т) Апостроф (') Кавычка (") Символ АЯСП «сигнал» (Ье!1, ВЕ1.) Символ АЯСП «забой» (Ьас)карасе, ВБ) Символ АЯСП «перевод формата* (1огш(вед, гр) Символ АБСП «перевод строки» (11це(сед, 1.г) Символ Юникода с заданным названием Чгеревод строки (в (ь 1п (Н(название) 'топо Символ с заданным восьмеричным кодом Символ АБСП «возврат каретки» (сагг1аяе гегшгп, СВ) (г Символ АБСП «табуляция* (ФаЬ, ТАВ) Символ Юннкода с указанным 16-битовым шестнадца- теричным значением ,ылллл Символ Юннкода с указанным 32-битовым шестнадца- теричным значением Флплппппл Символ АБСП «вертикальная табуляция» (чег11са! ЬаЬ, ЧТ) 'хч Символ с указанным Я-битовым шестнадцатеричным значением (хпп Если потребуется записать длинный строковый литерал, занимающий две или более строк, но без использования тройных кавычек, то можно использовать один из приемов, показанных ниже: т = тбто нв свный лучший способ объединений двух длинных строк, "потому что он основан нв использовании неуклюжего зкрвнироввнил" в = (Гэто отличный способ обьединить двв длинные строки, " потому что он основан нв конкатенации строковых литералов.") Обратите внимание, что во втором случае для создания единственного выражения мы должны были использовать круглые скобки — без этих скобок переменной в была бы присвоена только первая строка, а наличие второй строки вызвало бы исключение 1пбеп(зг(опЕггог.
В руководстве «161ошв апг) Ап(1-1Й1ошв», которое можно отыскать в документации к языку Ру(Ьоп, рекомендуется вместо зкранирования перевода строки всегда использовать круглые скобки для объединения операторов, не умещающихся в одну строку; именно этой рекомендации мы и будем следовать. Строки ву Поскольку содержимое файлов .ру по умолчанию представляет собой текст в кодировке 1)ТУ-8 Юникод, мы можем использовать в строковых литералах любые символы Юникода.
Мы можем даже помещать в строковые литералы символы Юникода, используя шестнадцатеричные экранированные последовательности или названия символов Юникода, например: »> еогоа = 7В 1З(еого 810п) 1О20АС 10000020АС" »> ргтпт(еогоа) В Я В данном случае мы не можем использовать обычную шестнадцатеричную экранированную последовательность, так как она ограничена двумя цифрами и не может представлять символы с кодом больше„чем Охгг. Обратите внимание, что названия символов Юникода не чувствительны к регистру и пробелы внутри них являются необязательными. Для определения кода символа Юникода (целое число, связанное с символом в кодировке Юникод) в строке, охааопоа можно использовать встроенную функцию ого(). Напри- сто.112 мер: »> ого(еогоа(0)) 8364 »> Пах(огс(еигоа(0))) 'Ох20ао' Точно так же можно преобразовать любое целое число, представляющее собой допустимый код некоторого символа Юникода, воспользовавшись функцией с)т г ( ) т »> а = "апагоП1ата аге " + оог(8734) + оог(Ох238?) »> а 'апагоыата ага » l' »> даот1(а) "'апагоыжа ага 'то221а>о23Ь?'" Если ввести а в среде 101 Е, содержимое объекта будет Матса отг.
выведено в строковой форме; для строк это означает, что тогаат() содержимое выводится в кавычках. Если нам потребует- отр.100 ся вывести только символы АЯСП, мы можем воспользоваться встроенной функцией аас11(), которая возвращает репрезентативную форму своего аргумента, используя 7-битовые символы АЯСП, где это возможно; в противном случае используется наиболее краткая экранированная последовательность из возможных: >тхдо, >,огтДПП или ~,УОПОПП000.
Ниже в этой главе будет показано, как получить полный контроль над выводом строк. вв Глава 2. Типы данных Сравнение строк Строки поддерживают обычные операторы сравнения «, =, ==, ! =, > и >кп Эти операторы выполняют побайтовое сравнение строк в памяти. К сожалению, возникают две проблемы при сравнении, например, строк в отсортированных списках. Обе проблемы проявляются во всех языках программирования и не являются характерной особенностью Ру1Ьоп. о Первая проблема связана с тем, что символы Юникода Кодировки оиивоиов могут быть представлены двумя и более последовательстр.112 ностями байтов. Например, ««(символ Юникода с кодом ОхООС5) в кодировке Т)ТР-8 может быть представлен тремя различными способами: (ОхЕ2, Ох84, ОхА8], (ОхСЗ, Ох85] и(Ох41, ОхСС, Ох8А].
Ксчастью, мы можем решить эту проблему. Если импортировать модуль ил(собедаГа и вызвать функцию ол1сооеоага. по<за!же() со значением «МРКП» в первом аргументе (эта аббревиатура определяет способ нормализации «Могша11хаС1оп Рогт Сотра$1Ь1!Иу Песотроэ111оп» вЂ” нормализация в форме совместимой декомпозиции), то, передав ей строку, содержащую символ ч, представленный любой из допустимых последовательностей байтов, мы получим строку с символами в кодировке ПТР-8, где интересующий нас символ всегда будет представлен последовательностью (Ох41, ОхСС, Ох8А]. Вторая проблема заключается в том, что порядок сортировки некоторых символов зависит от конкретного языка. Например, в шведском языке при сортировке символ а следует после символа г, тогда как в немецком языке символ а сортируется так, как если бы он был представлен последовательностью символов ае.
Еще один пример: в английском языке символ Ф сортируется как символ о, а в датском и норвежском языках он следует после символа г. Со строками Юникода связана масса проблем, которые становятся трудноразрешимыми, когда одним и тем же приложением могут пользоваться люди разных национальностей (привыкшие к различным порядкам расположения символов),когда строки содержат текст сразу на нескольких языках (например, часть строки на испанском, а часть на английском), и особенно, если учесть, что некоторые символы (такие как стрелки, декоративные и математические символы) не имеют определенного порядка сортировки.
Будучи настоящим политиком, во избежание трудноуловимых ошибок РуФЬоп не делает никаких предположений. В смысле сравнения строк это означает, что выполняется побайтовое сравнение строк в памяти. При таком подходе порядок сортировки определяется кодами Юникода, что для английского языка дает сортировку в соответствии с кодами АЯСП. Перевод всех символов строк в нижний или в верхнии 89 Строки регистр обеспечит более естественный порядок сортировки для английского языка. Нормализация может потребоваться, только когда текстовые строки поступают из внешних источников, таких как файлы или сетевые сокеты, но даже в этих случаях едва ли стоит применять ее, если нет веских доказательств в ее необходимости.
При этом мы, конечно, можем настроить методы сортировки, как будет показано в главе 3. Проблема сортировки строк Юникода подробно рассматривается вдокументе «1)п1сос)е СоПа$1оп А1дог11)тт«(ип!сот1е,огя/герог2в/тг1 0). Получение срезов строк Из описания составляющей №3 нам известно, что от- СоставлвюДЕЛЬНЫЕ ЭЛЕМЕНТЫ ПОСЛЕДОВатЕЛЬНОСтИ, а, СЛЕДОВатЕЛЬ- щек лт3 но, и отдельные символы в строках, могут извлекаться стр. 32 с помощью оператора доступа к элементам ([]). В действительности этот оператор намного более универсальный и может использоваться для извлечения не только одного символа, но и целых комбинаций (подпоследовательностей) элементов или символов, когда этот оператор используется в контексте оператора извлечения среза.
Для начала мы рассмотрим возможность извлечения отдельных символов. Нумерация позиций символов в строках начинается с 0 и продолжается до значений длины строки минус 1. Однако допускается использовать и отрицательные индексы — в этом случае отсчет начинается с последнего символа и ведется в обратном направлении к первому символу. На рис.
2.1 показано, как нумеруются позиции символов в строке, если предположить, что было выполнено присваивание 3 = "ст9от Гзу'. Рис. 2.1. Номера позиций символов в сатрапе Отрицательные индексы удивительно удобны, особенно индекс -1, который всегда соответствует последнему символу строки. Попытка обращения к индексу, находящемуся за пределами строки 1или к любому индексу в пустой строке), будет вызывать исключение 1ооекЕггог.
Оператор получения среза имеет три формы записи: 90 Глава 2. Типы данных вес [а тагт1 зер[зтагкепв] вер[зтагттепсезтер] Ссылка вер может представлять любую последовательность, такую как список, строку или кортеж. Значения в[агт, епд и взор должны быть целыми числами (или переменными, хранящими целые числа). Мы уже использовали первую форму записи оператора доступа к элементам: с ее помощью извлекается элемент последовательности с индексом атаги Вторая форма записи извлекает подстроку, начиная с элемента с индексом втагз и заканчивая элементом с индексом епс), не включая его.
Третью форму записи мы рассмотрим очень скоро. При использовании второй формы записи (с одним двоеточием) мы можем опустить любой из индексов. Если опустить начальный индекс, по умолчанию будет использоваться значение О. Если опустить конечный индекс, по умолчанию будет использоваться значение 1еп(вес). Это означает, что если опустить оба индекса, например, в[: ], это будет равносильно выражению в[0:1еп(в)], и в результате будет извлечена, то есть скопирована, последовательность целиком.
На рис. 2.2 приводятся некоторые примеры извлечения срезов из строки в, которая получена в результате присваивания в = "Тйе ыахиогК еап". Рис. 2.2. Извлечение срезов из последовательности Один из способов вставить подстроку в строку состоит в смешивании операторов извлечения среза и операторов конкатенации. Например: »> в = в[.'12] + "ыо" + в[12:1 »> в 'Тле ыахыогх ыоиап' Кроме того, поскольку текст»что» присутствует в оригинальной строке, тот же самый эффект можно было бы получить путем присваивания значениявыражения в[;12]» в[7:9]» в[12:]. о Операторы Оператор конкатенации + и добавления подстроки += не а иаюпы особенно эффективны, когда в операции участвует мностроа,стр.вв жество строк. Для объединения большого числа строк обычно лучше использовать метод зтг. ) о[п[), с которым мы познакомимся в следующем подразделе. 91 Строки Рис.
2.3. Извлечение разреженных срезов Третья форма записи (с двумя двоеточиями) напоминает вторую форму, но в отличие от нее значение втер определяет, с каким шагом следует извлекать символы. Как и при использовании второй формы записи, мы можем опустить любой из индексов. Если опустить начальный индекс, по умолчанию будет использоваться значение О, при условии, что задано неотрицательное значение атер; в противном случае начальный индекс по умолчанию получит значение -1.