Лутц М. - Изучаем Python (1077325), страница 44
Текст из файла (страница 44)
198 Глава?, Строки Функции 1лт и ()озт преобразуют только числа, но это ограничение означает, что они обычно выполняют эту работу быстрее (и безопаснее, потому что они не принимают программный код произвольного выражения). Как было показано в главе б, выражение форматирования строки также обеспечивает возможность преобразования чисел в строки. Форматирование будет обсуждаться ниже, в этой же главе. Преобразование кодов символов Возможно также выполнить преобразование одиночного символа в его целочисленный код АЯСП, для чего нужно передать этот символ функции огз — она возвращает фактическое числовое значение соответствующего байта в памяти. Обратное преобразование выполняется с помощью функции ОЛ г, она получает целочисленный код АЯСН и преобразует его в соответствующий символ: »> ого( е ) !15 »> свг(115) Эти функции можно применить ко всем символам строки в цикле.
Они могут также использоваться для реализации своего рода строковой математики. Например, чтобы получить следующий по алфавиту символ, его можно преобразовать в число и выполнить математическое действие над ним: »>3= '5' »> 8 = сот(ого(3) + 1) »> 3 '6' »> 3 = слг(огс(8) + 1) »> 3 '7' Следующий пример преобразования представляет собой альтернативу встроенной функции тлт, по крайней мере для односимвольных строк, для преобразования строки в целое число: »> 1от('5') 5 »> огс('5') - огс('О') 5 Такие преобразования могут использоваться в сочетании с оператором цикла — для получения целочисленных значений из строковых представлений двоичных чисел — в каждой итерации текущее значение умножается на 2 и затем к нему прибавляется числовое значение следующей цифры: »> 8 = '1161' »> 1 = О »> тгл(1е В: Строки в действии 199 1 = 1 * 2 + (ого(В(О)) - ого('0')) В = В(1:) »> 13 Оператор побитового сдвига влево (1 «1) мог бы дать тот же эффект, что и операция умножения на 2.
Но, пока мы еще не познакомились с циклами, оставим реализацию этого упражнения как есть. Изменение строк Помните термин «неизменяемая последовательность»? Слово»неизменяемая» означает, что вы не можете изменить содержимое самой строки в памяти (то есть невозможно изменить элемент строки, выполнив присваивание по индексу): »> 3 = 'зраш' »> 8(0) = "к" Возникает ошибка' Тогда каким образом в языке РусЬоп производить изменение текстовой информации7 Чтобы изменить строку, необходимо создать новую строку с помощью таких операций, как конкатенация и извлечение подстроки, и затем, если это необходимо, присвоить результат первоначальному имени: »> 3 = 8 + 'ЗРАН!' а 'ттсбн нзненить строку, нуино создать новую »> 3 'зрашЗРАЮ ' »> 8 = 8(:4) + 'Всгрег' + 3(-1) »> 3 'зрашВсгОег» Первый пример добавляет подстроку в конец строки 8 с помощью операции конкатенации. В действительности здесь создается новая строка, которая затем присваивается имени 8, но вы можете представить себе это действие как »изменение» первоначальной строки.
Второй пример замещает четыре символа шестью новыми — с помощью операций извлечения подстроки и конкатенации. Как будет показано далее в этой главе, похожего эффекта можно добиться с помощью строкового метода гер1асе. Вот как это выглядит: »> 8 'зр1от' »> 8 = З.гер1асе('р1', 'раша1') »> 3 'зраша1от' Как и всякая операция, создающая новую строку, строковые методы создают новые строковые объекты.
Если вам необходимо сохранить эти объекты, вы можете присвоить их переменной. Создание нового объекта строки для каждого изменения — операция не столь неэффек- Глава 7. Строки тинная, как может показаться, — вспомните, в предыдущей главе говорилось, что интерпретатор автоматически производит сборку мусора (освобождает память, занятую неиспользуемыми строковыми объектами), поэтому новые объекты повторно используют память, ранее занятую прежними значениями. Интерпретатор РузЬоп во многих случаях работает гораздо быстрее, чем можно было бы ожидать. Наконец, дополнительно существует возможность сборки текстовых значений с помощью выражений форматирования строк: »> 'таат 1з зз зз ыга! ' х (1, 'ззаа') а напоиинает Функцию зргтитг в заике с тлат 1з 1 Озае Ы ггп Это очень мощная операция! В следующем разделе рассказывается о том, как она работает.
форматирование строки В языке РуФЬоп имеется двухместный оператор %, предназначенный для работы со строками (вы можете вспомнить, что для чисел он еще является оператором деления по модулю или получения остатка от деления). Когда этот оператор применяетея к строкам, он играет роль функции зрг1лтг в языке С и обеспечивает простой способ форматирования значений в строке согласно заданной строке формата.
Проще говоря, оператор % обеспечивает возможность компактной записи программного кода, выполняющего множественную подстановку строк. Чтобы отформатировать строку, требуется: 1. Слева от оператора % указать строку формата, содержащую один или более спецификатор формата, каждый из которых начинается с символа%(например,%о). 2. Справа от оператора % указать объект (или объекты, в круглых скобках), которые будут подставляться на место спецификатора (или спецификаторов) в левой части выражения. Например, в последнем примере предыдущего раздела мы видели, что целое число 1 подставляетея на место спецификатора %О в строке формата, расположенной в левой части выражения, а строка "оеао" подставляется на место спецификатора %а.
В результате получаетея новая строка, которая содержит эти две подстановки. Строго говоря, выражения форматирования строк не являются абсолютно необходимыми — все, что можно сделать с их помощью, точно так же можно сделать с помощью серии преобразований и операций конкатенации. Однако операция форматирования позволяет объединить множество шагов в одной инструкции. Мощные возможности этой операции заслуживают того, чтобы рассмотреть еще несколько примеров: »> зко)ааат1ол = "и1" Форматирование строки »> Тае Кп19ата еао аау Ха!" Х ехо)ааат1оп 'ТПЕ КП19жа нлс аау ЗП ' »> "ХИ Ха ХИ уоо" Х (1, 'араа', 4) '1 ераа 4 уоо' »> "Ха -- Ха -- Ха" Х (42, 3. 14159, (1, 2, 3]) 42 -- 3 14159 -- (1 2 3] В первом примере строка "и'1" подключается к целевой строке слева, замещая спецификатор %3. Во втором примере в целевую строку вставляются три значения.
Обратите внимание: когда вставляется более одного значения, в правой части выражения их необходимо сгруппировать с помощью круглых скобок (то есть создать из них кортеж). В третьем примере также вставляются три значения — целое число, объект числа с плавающей точкой и объект списка, но, обратите внимание, что в левой части выражения всем значениям соответствует спецификатор %3, который соответствует операции преобразования в строку. Объекты любого типа могут быть преобразованы в строку (это происходит, например, при выводе на экран), поэтому для любого объекта может быть указан спецификатор %9. Вследствие этого вам не придется выполнять специальное форматирование, в большинстве случаев вам достаточно будет знать только о существовании спецификатора %3, Имейте в виду, что выражение форматирования всегда создает новую строку, а не изменяет строку, расположенную в левой части. Нескольку строки являются неизменяемыми, этот оператор вынужден работать именно таким способом.
Как уже говорилось ранее, если вам требуется сохранить полученный результат, присвойте его переменной. Дополнительные возможности форматирования строки Для реализации более сложного форматирования в выражениях форматирования можно использовать любые спецификаторы формата, представленные в табл. 7.3. Большинство из них окажутся знакомы программистам, использовавшим язык С, потому что операция форматирования строк в языке РуХЬоп поддерживает все наиболее типичные спецификаторы формата, которые допускается использовать в функции р гт п1 т языка С (в отличие от которой выражение в языке Ру(Ьоп возвращает результат, а не выводит его на экран). Некоторые спецификаторы из табл.
7.3 предоставляют альтернативные способы форматирования данных одного и того же типа, например, %е, %[ и %9 обеспечивают альтернативные способы форматирования чисел с плавающей точкой. Фактически спецификаторы формата в левой части выражения поддерживают целый набор операций преобразования с достаточно сложным собственным синтаксисом. В общем виде синтаксис использования спецификатора формата выглядит следующим образом: %([лапе)][ Г]аде][юдтпк .ргес!ехол]соде Глава 7. Строки Таблица 7.3. Спецификаторгя формата Спецнфнкатор Назначение Строка (нли любой объект) в, но использует функцию герг, а не вт г Символ Десятичное (целов) число Целое число Целое число без знака Восьмеричное целое число Шестнадцатеричное целое число х, но шестнадцатеричные цифры возвращаются в верхнем ре- гистре Число с плавающей точкой в зкспоненциальной форме е, но алфавитные символы возвращаются з верхнем регистре Число с плавающей точкой в десятичном представлении Число с плавающей точкой е нлн Е Число с плавающей точкой Е нли Е Символ % тте »> х 1234 »> гвв = "цлтебегз: ...БЗ...Х-БСГ..ВОБЗ" Х (х, х.
х) »> Гвз 'штесегз ...1234...1234 . 001234' Спецификаторы ттв, 3(Г и 340 отображают числа с плавающей точкой раз- ными способами, как демонстрируется в следующем примере: »> х = 1.234бб789 »> х Символ спецификатора формата (оогте) из табл. 7.3 располагается в самом конце. Между символом я и символом спецификатора можно добавлять следующую информацию: ключ в словаре (паве); список флагов (Г)ада), которые могут определять, например, признак выравнивания (-), знак числа (4), наличие ведущих нулей (О); общую ширину поля и число знаков после десятичной точки и многое другое. Полное описание синтаксиса спецификаторов формата вы найдете в стандартном руководстве по языку РуьЬоп, а сейчас для демонстрации наиболее типичных случаев их использования приведем несколько примеров.
В первом примере сначала применяется форматирование целого числа с параметрами по умолчанию, а затем целое число выводится в поле шириной в шесть символов, с выравниванием по левому краю и с дополнением ведущими нулями: Форматирование строки 1.2345678899999999 »> 'Хе ( ХГ ( Хц' Х (х, х, х) '1.234568е+000 ( 1.234568 ) 1.2345?' Для чисел с плавающей точкой можно реализовать дополнительные эффекты форматирования, указав необходимость выравнивания по левому краю, знак числа, ширину поля и число знаков после десятичной точки. Для простых задач можно было бы использовать простые функции преобразования чисел в строки с применением выражения форматирования или встроенной функции 81 г, продемонстрированной ранее: »> ' Х-6.