Книга: Как устроен Python. Гид для разработчиков, программистов и интересующихся
Назад: 8. Числа
Дальше: 10. dir, help и pdb

9. Строки

Строки представляют собой неизменяемые объекты для хранения символьных данных. Строка может содержать один символ, слово, последовательность слов, абзац, несколько абзацев, хотя может не содержать ни одного символа.

В Python строки заключаются между символами ' (одинарные кавычки), " (двойные кавычки), """ (тройные двойные кавычки) или ''' (тройные одинарные кавычки). Несколько примеров:

>>> character = 'a'

>>> name = 'Matt'

>>> with_quote = "I ain't gonna"

>>> longer = """This string has

... multiple lines

... in it"""

>>> latin = '''Lorum ipsum

... dolor'''

>>> escaped = 'I ain\'t gonna'

>>> zero_chars = ''

>>> unicode_snake = "I love \N{SNAKE}"

Обратите внимание: строки всегда начинаются и завершаются кавычками одного типа. Как показано в примере with_quote, одинарные кавычки могут находиться внутри строк, заключенных в двойные кавычки, и наоборот. Кроме того, если вам понадобится включить в строку кавычку того же типа, ее можно экранировать символом \ (обратная косая черта). При выводе экранированного символа обратная косая черта игнорируется.

ПРИМЕЧАНИЕ

У наблюдательного читателя может возникнуть вопрос — как включить в строку символ обратной косой черты? Чтобы включить обратную косую черту в обычную строку, ее необходимо экранировать… да, все верно — еще одной обратной косой чертой:

>>> backslash = '\\'

>>> print(backslash)

\

ПРИМЕЧАНИЕ

Несколько стандартных способов экранирования символов в Python:

Экранирующая последовательность

Вывод

\\

Обратная косая черта

\'

Одинарная кавычка

\"

Двойная кавычка

\b

ASCII-символ Backspace

\n

Новая строка

\t

Табуляция

\u12af

16-разрядный символ Юникода

\U12af89bc

32-разрядный символ Юникода

\N{SNAKE}

Символ Юникода

\o84

Символ в восьмеричной кодировке

\xFF

Шестнадцатеричный символ

 

СОВЕТ

Если вы не хотите применять экранирование, используйте необработанные (raw) строки, поставив перед строкой префикс r. Необработанные строки обычно встречаются в двух местах. Они используются в регулярных выражениях, в которых обратная косая черта также используется как экранирующий символ. Регулярные выражения применяются для поиска символов в тексте по шаблону (например, телефонных номеров, имен и т.д.). Модуль re из стандартной библиотеки Python предоставляет поддержку регулярных выражений. Кроме того, необработанные строки также используются в путях Windows, где обратная косая черта интерпретируется как разделитель.

В необработанных строках символы интерпретируются буквально (то есть без всякого экранирования). Следующий пример демонстрирует различия между необработанными и обычными строками:

>>> slash_t = r'\tText \\'

>>> print(slash_t)

\tText \\

 

>>> normal = '\tText \\'

>>> print(normal)

Text \

 

В Python также предусмотрен механизм тройных кавычек для определения строк. Тройные кавычки удобны для создания строк, разделенных на абзацы. Кроме того, строки в тройных кавычках часто используются в строках документации. Строки документации будут рассматриваться в главе, посвященной функциям. Ниже приведен пример строки в тройных кавычках:

>>> paragraph = """Lorem ipsum dolor

... sit amet, consectetur adipisicing

... elit, sed do eiusmod tempor incididunt

... ut labore et dolore magna aliqua. Ut

... enimad minim veniam, quis nostrud

... exercitation ullamco laboris nisi ut

... aliquip ex ea commodo consequat. Duis

... aute irure dolor in reprehenderit in

... voluptate velit esse cillum dolore eu

... fugiat nulla pariatur. Excepteur sint

... occaecat cupidatat non proident, sunt

... in culpa qui officia deserunt mollit

... anim id est laborum."""

Строки в тройных кавычках удобны тем, что в них можно вставлять одинарные и двойные кавычки без экранирования:

>>> """This string has double " and single

... quotes ' inside of it"""

'This string has double " and single\nquotes \' inside of it'

Впрочем, если кавычки приходятся на конец строки, последнюю кавычку в тексте необходимо экранировать:

>>> """He said, "Hello""""

File "<stdin>", line 1

"""He said, "Hello""""

^

SyntaxError: EOL while scanning string literal

 

>>> """He said, "Hello\""""

'He said, "Hello"'

9.1. Форматирование строк

Хранить строки в переменных удобно, но необходимо также иметь возможность собирать строки из других строк и выполнять с ними нужные манипуляции. Для этой цели можно воспользоваться механизмом форматирования строк.

В Python 3 предпочтительным способом форматирования считается использование метода .format. В следующем примере мы приказываем Python заменить {} (заполнитель) содержимым переменной name, то есть строкой Matt:

>>> name = 'Matt'

>>> print('Hello {}'.format(name))

Hello Matt

Другое полезное свойство форматирования заключается в том, что форматировать также можно нестроковые объекты — например, числа:

>>> print('I:{} R:{} S:{}'.format(1, 2.5, 'foo'))

I:1 R:2.5 S:foo

9.2. Синтаксис форматных строк

В форматных строках существует специальный синтаксис для полей-заполнителей. Если форматной строке передается объект, для поиска атрибутов может использоваться синтаксис .имя_атрибута. Также поддерживается возможность извлечения индексируемых элементов с использованием записи [индекс]. В документации Python они называются именами полей. Имена полей могут быть пустыми, содержать имя аргумента с ключевым словом, номер позиционного аргумента или индекс в списке или словаре (в квадратных скобках):

>>> 'Name: {}'.format('Paul')

'Name: Paul'

 

>>> 'Name: {name}'.format(name='John')

'Name: John'

 

>>> 'Name: {[name]}'.format({'name':'George'})

'Name: George'

В фигурные скобки ({ и }) также может быть заключено целое число. Оно определяет позицию аргумента, переданного .format (нумерация начинается с нуля). В следующем примере используются номера позиционных аргументов. Первый аргумент, .format, 'Paul', находится в позиции 0; второй, 'George', находится в позиции 1; наконец, 'John' находится в позиции 2:

>>> 'Last: {2} First: {0}'.format('Paul', 'George',

... 'John')

'Last: John First: Paul'

Существует целый язык форматирования строк. Поставив двоеточие после имени поля, вы сможете передать дополнительную форматную информацию. Формат описан ниже. Все, что заключено в квадратные скобки, не является обязательным.

:[[fill]align][sign][#][0][width][grouping_option][.precision][type]

В следующей таблице перечислены поля и их значения.

Поле

Описание

fill

Символ, используемый для заполнения из align (пробел по умолчанию)

align

Тип выравнивания вывода: < (по левому краю), > (по правому краю), ^ (по центру) или = (вставить дополнение после знака)

sign

Для чисел: + (выводить знак как для положительных, так и для отрицательных чисел), (по умолчанию, выводить знак только для отрицательных чисел) или пробел (начальные пробелы для положительных чисел, знак для отрицательных чисел)

#

Префикс для целых чисел: 0b (двоичные), 0o (восьмеричные) или 0x (шестнадцатеричные)

0

Дополняющие нули

width

Минимальная ширина поля

grouping_option

Разделители в числах: , (тысячи разделяются запятыми), _ (тысячи разделяются подчеркиваниями)

.precision

Для чисел с плавающей точкой (количество знаков в дробной части), для нечисловых данных (максимальная длина)

type

Числовой тип или s (строковый формат по умолчанию); см. таблицы форматирования для целых чисел и чисел с плавающей точкой

В следующих таблицах перечислены различные средства форматирования целых чисел и чисел с плавающей точкой.

Целые типы

Описание

b

Двоичный

c

Символьный — преобразуется в символ Юникода

d

Десятичный (по умолчанию)

n

Десятичный с разделителями для локального контекста

o

Восьмеричный

x

Шестнадцатеричный (нижний регистр)

X

Шестнадцатеричный (верхний регистр)

 

Типы с плавающей точкой

Описание

e/E

Экспоненциальная запись (буква «e» в нижнем/верхнем регистре)

f

Фиксированная точка

g/G

Универсальная запись. Фиксированная или экспоненциальная запись в зависимости от числа (по умолчанию g)

n

g с разделителями для локального контекста

%

Проценты (с умножением на 100)

9.3. Примеры форматирования

Ниже приведены некоторые примеры использования .format. Чтобы отформатировать строку в центре поля из 12 символов, окруженную символами *, используйте приведенный ниже код. Здесь * — символ-заполнитель, ^ — поле выравнивания, а 12 — поле ширины:

>>> "Name: {:*^12}".format("Ringo")

'Name: ***Ringo****'

Затем отформатируем число в процентах с шириной 10, одним знаком в дробной части и знаком перед дополнением ширины. Здесь = — поле выравнивания, + гарантирует, что в отформатированном значении всегда выводится знак (как для отрицательных, так и для положительных чисел), 10.1 — поля ширины и точности, а % — тип для преобразования числа в проценты:

>>> "Percent: {:=+10.1%}".format(-44/100)

'Percent: - 44.0%'

Далее следуют примеры двоичного и шестнадцатеричного преобразования. Полю типа целого числа присваиваются значения b и x соответственно:

>>> "Binary: {:b}".format(12)

'Binary: 1100'

 

>>> "Hex: {:x}".format(12)

'Hex: c'

ПРИМЕЧАНИЕ

Метод .format для строк предоставляет альтернативу для оператора %, сходную с функцией C printf. Оператор % также доступен, и некоторые пользователи предпочитают именно его, поскольку в простых случаях запись получается короче, а также из-за его сходства с C. Заполнители %s, %d и %x заменяются своими строковыми, целыми и шестнадцатеричными значениями соответственно. Несколько примеров:

>>> "Num: %d Hex: %x" % (12, 13)

'Num: 12 Hex: d'

 

>>> "%s %s" % ('hello', 'world')

'hello world'

 

СОВЕТ

Отличный источник информации о форматировании — встроенная справочная документация, доступная в REPL. Введите команду

>>> help()

Команда включает режим справочной информации и выводит приглашение help>. Введите команду

help> FORMATTING

Просмотрите вывод — вы найдете в нем много примеров. Если просто нажать Enter в приглашении help>, вы вернетесь к обычному приглашению.

Также немало полезной информации можно найти на сайте /. Здесь представлено много примеров форматирования как с использованием .format, так и с более старым оператором %.

Информация о форматировании строк также содержится в разделе STRINGS справочной информации.

9.4. F-строки

В Python 3.6 появилась новая разновидность строк — так называемые f-строки. Если поставить перед строкой префикс f, в заполнители можно будет включить код. Простой пример:

>>> name = 'matt'

>>> f'My name is {name}'

'My name is matt'

Python просматривает заполнитель и вычисляет содержащийся там код. В заполнитель можно включить вызовы функций, вызовы методов или любой другой произвольный код:

>>> f'My name is {name.capitalize()}'

'My name is Matt'

Также можно передать форматные строки после двоеточия (:):

>>> f'Square root of two: {2**.5:5.3f}'

'Square root of two: 1.414'

9.5. Итоги

В этой главе мы представили строки. Строки могут определяться с разными ограничителями. В отличие от других языков, в которых строки, заключенные в двойные кавычки " и одинарные кавычки ', могут работать по-разному, в Python их поведение не различается. Впрочем, строки в тройных кавычках могут состоять из нескольких физических строк (абзацев).

Мы также рассмотрели метод .format и разобрали несколько примеров форматирования строк. В завершение главы была представлена одна из новых возможностей Python 3.6 — f-строки.

9.6. Упражнения

1. Создайте переменную name, указывающую на ваше имя. Создайте другую переменную — age — с целым числом, соответствующим вашему возрасту. Выведите отформатированную строку с обоими значениями. Например, для имени Fred и возраста 23 должна быть выведена строка:

Fred is 23

2. Создайте переменную paragraph, которая содержит следующий текст:

"Python is a great language!", said Fred. "I don't

ever remember having this much fun before."

3. Посетите сайт и найдите в греческой таблице символов букву «омега». Создайте строку, которая содержит символ «омега», используя как кодовый пункт в Юникоде (форма \u), так и имя символа в Юникоде (форма \N). Кодовый пункт — шестнадцатеричное число в таблице, имя выводится жирным шрифтом после кодового пункта. Например, букве «тэта» соответствует кодовый пункт 03f4 и имя GREEK CAPITAL THETA SYMBOL.

4. Создайте переменную item, которая указывает на строку "car". Создайте переменную cost, которая указывает на число 13499.99. Выведите строку, в которой значение item выравнивается по левому краю поля из 10 символов, а cost — по правому краю поля из 10 символов с 2 цифрами в дробной части и разделением тысяч запятыми. Результат должен выглядеть так (без кавычек):

'car 13,499.99'

Назад: 8. Числа
Дальше: 10. dir, help и pdb