На этом шаге мы рассмотрим различные способы задания строк.
Создать строку можно следующими способами:
>>> str(), str([1, 2]), str((3, 4)), str({'x': 1}) ('', '[1, 2]', '(3, 4)', "{'x': 1}") >>> str(b'\xf1\xf2\xf0\xee\xea\xe0') "b'\\xf1\\xf2\\xf0\\xee\\xea\\xe0'"
Обратите внимание на преобразование объекта типа bytes. Мы получили строковое представление объекта, а не нормальную строку. Чтобы получить из объектов типа bytes и bytearray именно строку, следует указать кодировку во втором параметре:
>>> str(b'\xf1\xf2\xf0\xee\xea\xe0', 'cp1251') 'строка'
В третьем параметре могут быть указаны значения:
>>> obj1 = bytes('строка1', 'utf-8') >>> obj2 = bytes('строка2', 'utf-8') >>> str(obj1, 'utf-8'), str(obj2, 'utf-8') ('строка1', 'строка2') >>> str(obj1, 'ascii', 'strict') Traceback (most recent call last): File "<pyshell#20>", line 1, in <module> str(obj1, 'ascii', 'strict') UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128) >>> str(obj1, 'ascii', 'ignore') '1'
>>> 'строка', "строка", '"x": 5', "'x': 5" ('строка', 'строка', '"x": 5', "'x': 5") >>> print('Строка1\nСтрока2') Строка1 Строка2 >>> print("Строка1\nСтрока2") Строка1 Строка2
В некоторых языках программирования (например, в РНР) строка в апострофах отличается от строки в кавычках тем, что внутри апострофов специальные символы выводятся как есть, а внутри кавычек они интерпретируются. В языке Python никакого отличия между строкой в апострофах и строкой в кавычках нет. Это одно и то же. Если строка содержит кавычки, то ее лучше заключить в апострофы, и наоборот. Все специальные символы в таких строках интерпретируются. Например, последовательность символов \n преобразуется в символ новой строки. Чтобы специальный символ выводился как есть, его необходимо экранировать с помощью слеша:
>>> print("Строка1\\nСтрока2") Строка1\nСтрока2 >>> print('Строка1\\nСтрока2') Строка1\nСтрока2
Кавычку внутри строки в кавычках и апостроф внутри строки в апострофах также необходимо экранировать с помощью защитного слеша:
>>> "\"x\": 5", '\'x\': 5' ('"x": 5', "'x': 5")
Следует также заметить, что заключить объект в кавычки или апострофы на нескольких строках нельзя. Переход на новую строку вызовет синтаксическую ошибку:
>>> "string SyntaxError: EOL while scanning string literal
Чтобы расположить объект на нескольких строках, следует перед символом перевода строки указать символ \, поместить две строки внутри скобок или использовать конкатенацию внутри скобок:
>>> "string1\ string2" # После \ не должно быть никаких знаков 'string1 string2' >>> ("string1" "string2") # Неявная конкатенация строк 'string1string2' >>> ("string1" + "string2") # Явная конкатенация строк 'string1string2'
Кроме того, если в конце строки расположен символ \, то его необходимо экранировать, иначе будет выведено сообщение об ошибке:
>>> print("string\") SyntaxError: EOL while scanning string literal >>> print("string\\") string\
>>> print('''Строка1 Строка2''') Строка1 Строка2 >>> print("""Строка1 Строка2""") Строка1 Строка2
Если строка не присваивается переменной, то она считается строкой документирования. Такая строка сохраняется в атрибуте __doc__ того объекта, в котором расположена. В качестве примера создадим функцию со строкой документирования, а затем выведем содержимое строки:
>>> def test(): '''Это описание функции''' pass >>> print(test.__doc__) Это описание функции
Поскольку выражения внутри таких строк не выполняются, то утроенные кавычки (или утроенные апострофы) очень часто используются для комментирования больших фрагментов кода на этапе отладки программы.
Если перед строкой разместить модификатор r, то специальные символы внутри строки выводятся как есть. Например, символ \n не будет преобразован в символ перевода строки. Иными словами, он будет считаться последовательностью двух символов: \ и n:
>>> print("Строка1\nСтрока2") Строка1 Строка2 >>> print(r"Строка1\nСтрока2") Строка1\nСтрока2 >>> print(r"""Строка1\nСтрока2""") Строка1\nСтрока2
Такие неформатированные строки удобно использовать в шаблонах регулярных выражений, а также при указании пути к файлу или каталогу:
>>> print(r"C:\Python34\Lib") C:\Python34\Lib
Если модификатор не указать, то все слеши при указании пути необходимо экранировать:
>>> print("C:\\Python34\\Lib") C:\Python34\Lib
Если в конце неформатированной строки расположен слеш, то его необходимо экранировать. Однако следует учитывать, что этот слеш будет добавлен в исходную строку. Пример:
>>> print(r"C:\Python34\Lib\") SyntaxError: EOL while scanning string literal >>> print(r"C:\Python34\Lib\\") C:\Python34\Lib\\
Чтобы избавиться от лишнего слеша, можно использовать операцию конкатенации строк, обычные строки или удалить слеш явным образом:
>>> print(r"C:\Python34\Lib" + "\\") # Конкатенация C:\Python34\Lib\ >>> print("C:\\Python34\\Lib\\") # Обычная строка C:\Python34\Lib\ >>> print(r"C:\Python34\Lib\\"[:-1]) # Удаление слеша C:\Python34\Lib\
На следующем шаге мы рассмотрим специальные символы.