Строки в Python: кавычки, переносы и экранирование

Обновлено:

Строки мы уже изучали, но будем возвращаться к ним ещё много раз.

На этом уроке строковые методы не рассматриваются. Наша задача — подробнее изучить:

  • способы создания строк;
  • сравнение строк;
  • повторение строк;
  • многострочный текст;
  • кавычки внутри строки;
  • экранирование;
  • оформление длинного текста внутри функции.

1. Строки можно создавать разными способами

Обычную строку можно записать с помощью:

  • одинарных кавычек;
  • двойных кавычек;
  • тройных одинарных кавычек;
  • тройных двойных кавычек;
  • класса str.

Создадим одну и ту же строку восемью способами:

text_1 = 'Hello World'
text_2 = "Hello World"
text_3 = '''Hello World'''
text_4 = """Hello World"""

text_5 = str('Hello World')
text_6 = str("Hello World")
text_7 = str('''Hello World''')
text_8 = str("""Hello World""")

Выведем значения:

print(text_1)
print(text_2)
print(text_3)
print(text_4)
print(text_5)
print(text_6)
print(text_7)
print(text_8)

Результат будет одинаковым:

Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World

Все переменные ссылаются на строки с одинаковым значением.


2. Все строки равны

Проверим равенство:

print(text_1 == text_2)
print(text_2 == text_3)
print(text_3 == text_4)
print(text_4 == text_5)
print(text_5 == text_6)
print(text_6 == text_7)
print(text_7 == text_8)

Результат:

True
True
True
True
True
True
True

Способ записи кавычек не становится частью строки.

Например:

'Hello World'

и:

"Hello World"

являются равными строками.


3. Равенство и одинаковый id() — не одно и то же

В некоторых версиях Python и некоторых средах можно увидеть одинаковые идентификаторы:

print(id(text_1))
print(id(text_2))

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

Но одинаковый id() для отдельно записанных равных строк не гарантируется.

Например, Python может создать:

  • один объект и несколько ссылок;
  • несколько разных объектов с одинаковым значением.

Главное правило:

Одинаковое значение строк проверяется с помощью ==.
Одинаковый id означает, что это один и тот же объект.

Нельзя строить логику программы на предположении, что равные строки обязательно имеют одинаковый id().


4. Повторение строки

Строку можно умножить на целое число:

print('Python' * 3)

Результат:

PythonPythonPython

Число показывает, сколько раз нужно повторить строку.


5. Умножение строки на единицу

print('Python' * 1)

Результат:

Python

Строка повторилась один раз, поэтому значение не изменилось.


6. Умножение строки на ноль

print('Python' * 0)

Результатом будет пустая строка:

''

При обычном выводе мы ничего не увидим:

result = 'Python' * 0

print(result)

В терминале появится только пустая строка.

Проверим длину:

print(len(result))

Результат:

0

7. Умножение строки на отрицательное число

result = 'Python' * -5

Результатом также будет пустая строка:

''

Проверим:

print(result)
print(len(result))

Результат:

0

При умножении строки на ноль или отрицательное целое число Python возвращает пустую строку.


8. Многострочный текст

Многострочный текст состоит из нескольких строк.

Например:

Результаты вычислений:
Площадь круга: 78.54 см²
Диаметр круга: 10 см
Длина окружности: 31.42 см

Такой текст нельзя просто перенести на новую строку внутри обычных одинарных кавычек:

result = 'Результаты вычислений:
Площадь круга: 78.54 см²'

Программа не запустится.

Появится:

SyntaxError

Обычная одинарная или двойная кавычка не позволяет вставлять настоящий перенос строки таким способом.


9. Первый способ: записать всё в одну строку

Можно удалить переносы:

result = 'Результаты вычислений: Площадь круга: 78.54 см²'

Код будет работать, но текст больше не является многострочным.

При выводе всё появится в одной строке:

Результаты вычислений: Площадь круга: 78.54 см²

Для уведомлений, отчётов и сообщений такой вариант часто неудобен.


10. Второй способ: символ \n

Служебная последовательность:

\n

обозначает перенос строки.

Пример:

result = 'Первая строка\nВторая строка\nТретья строка'

print(result)

Результат:

Первая строка
Вторая строка
Третья строка

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


11. Как строка с \n выглядит в IDLE

Создадим строку:

result = 'Первая строка\nВторая строка'

Если просто обратиться к переменной в IDLE:

result

мы увидим техническое представление:

'Первая строка\nВторая строка'

IDLE показывает, что внутри строки находится \n.

Если использовать print():

print(result)

получим настоящий перенос:

Первая строка
Вторая строка

12. Третий способ: тройные кавычки

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

result = """Результаты вычислений:
Площадь круга: 78.54 см²
Диаметр круга: 10 см
Длина окружности: 31.42 см"""

Выведем строку:

print(result)

Результат:

Результаты вычислений:
Площадь круга: 78.54 см²
Диаметр круга: 10 см
Длина окружности: 31.42 см

Python сохранил переносы строк.


13. Два вида тройных кавычек

Можно использовать тройные двойные кавычки:

text = """Первая строка
Вторая строка
Третья строка"""

Или тройные одинарные:

text = '''Первая строка
Вторая строка
Третья строка'''

Обе записи создают обычные объекты класса str.

print(type(text))

Результат:

<class 'str'>

14. Python сохраняет переносы

Создадим строку:

message = """Hello
World"""

В IDLE:

message

можно увидеть:

'Hello\nWorld'

Python представляет настоящий перенос строки как \n.

При выводе:

print(message)

получим:

Hello
World

15. Начальный перенос строки тоже сохраняется

Рассмотрим:

message = """
Первая строка
Вторая строка
"""

После открывающих кавычек мы сразу нажали Enter.

Поэтому в начале строки появился перенос.

Перед закрывающими кавычками тоже находится перенос.

При выводе появится пустая строка до текста и после него:

print(message)

Результат будет выглядеть примерно так:

Первая строка
Вторая строка

Чтобы не создавать лишний перенос в начале, текст обычно начинают сразу после открывающих кавычек:

message = """Первая строка
Вторая строка"""

16. Одинарная кавычка внутри текста

Рассмотрим английский текст с апострофом:

I'm learning Python

Такой вариант приведёт к ошибке:

message = 'I'm learning Python'

Python воспринимает апостроф после буквы I как закрывающую кавычку:

'I'

Оставшаяся часть строки становится непонятной для Python.

Результат:

SyntaxError

17. Используем другой вид внешних кавычек

Если внутри текста есть одинарная кавычка, снаружи удобно поставить двойные:

message = "I'm learning Python"

print(message)

Результат:

I'm learning Python

Двойные кавычки обозначают границы строки.

Апостроф внутри становится обычным символом.

Это не экранирование в строгом смысле. Мы просто выбрали другой ограничитель строки, поэтому экранировать апостроф не потребовалось.


18. Как строка выглядит в IDLE

message = "I'm learning Python"

При обращении в IDLE:

message

Python может показать:

"I'm learning Python"

При выводе:

print(message)

кавычки не печатаются:

I'm learning Python

Внешние кавычки являются частью синтаксиса Python, но не частью строкового значения.


19. Двойные кавычки внутри текста

Предположим, нужно сохранить:

Он сказал: "Привет"

Удобно использовать снаружи одинарные кавычки:

message = 'Он сказал: "Привет"'

print(message)

Результат:

Он сказал: "Привет"

Двойные кавычки внутри являются обычными символами.


20. Ошибка с двойными кавычками

Неправильно:

message = "Он сказал: "Привет""

Вторая двойная кавычка закрывает строку раньше времени.

Python не сможет правильно разобрать оставшийся код.

Результат:

SyntaxError

Исправленный вариант:

message = 'Он сказал: "Привет"'

21. Когда внутри есть оба вида кавычек

Предположим, нужно сохранить текст:

Он сказал: "I'm ready"

Внутри присутствуют:

  • двойные кавычки;
  • одинарная кавычка в слове I'm.

Обычного выбора другого вида внешних кавычек уже может быть недостаточно.

Можно использовать экранирование.


22. Экранирование с помощью обратного слеша

Обратный слеш:

\

позволяет экранировать кавычку.

Если строка открыта одинарной кавычкой, внутреннюю одинарную кавычку можно записать так:

\'

Пример:

message = 'Он сказал: "I\'m ready"'

print(message)

Результат:

Он сказал: "I'm ready"

Обратный слеш сообщает Python:

Эта кавычка является частью текста и не закрывает строку.


23. Экранирование двойной кавычки

Если строка открыта двойными кавычками, внутреннюю двойную кавычку можно экранировать:

\"

Пример:

message = "Он сказал: \"I'm ready\""

print(message)

Результат:

Он сказал: "I'm ready"

При необходимости каждая конфликтующая кавычка экранируется отдельно.


24. Как экранированная строка выглядит в IDLE

message = 'Он сказал: "I\'m ready"'

При обращении к переменной IDLE может показать:

'Он сказал: "I\'m ready"'

Обратный слеш виден в техническом представлении, чтобы программист понял, что кавычка находится внутри строки.

При обычном выводе:

print(message)

обратный слеш не отображается:

Он сказал: "I'm ready"

Он нужен для записи строки в исходном коде, но не является частью выводимого текста.


25. Тройные кавычки и кавычки внутри текста

Вместо большого количества обратных слешей иногда удобно использовать тройные кавычки:

message = """Он сказал: "I'm ready"."""

print(message)

Результат:

Он сказал: "I'm ready".

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

  • одиночные одинарные кавычки;
  • одиночные двойные кавычки.

Проблема появится только при последовательности из трёх двойных кавычек, потому что она закроет строку.


26. Тройные одинарные кавычки

Можно использовать и тройные одинарные кавычки:

message = '''Он сказал: "I'm ready".'''

print(message)

Результат будет таким же:

Он сказал: "I'm ready".

Выбор между тройными одинарными и тройными двойными кавычками зависит от содержимого текста и принятого стиля проекта.


27. Длинная строка с несколькими \n

Создадим отчёт в одной строке исходного кода:

result = 'Результаты вычислений:\nПлощадь круга: 78.54 см²\nДиаметр круга: 10 см\nДлина окружности: 31.42 см'

print(result)

Программа работает, но строка в файле получается очень длинной.

Такой код неудобно читать.


28. Явное продолжение строки через \

В Python существует явное продолжение строки:

result = "Результаты вычислений:\n" \
    "Площадь круга: 78.54 см²\n" \
    "Диаметр круга: 10 см\n" \
    "Длина окружности: 31.42 см"

Соседние строки объединятся.

Результат:

Результаты вычислений:
Площадь круга: 78.54 см²
Диаметр круга: 10 см
Длина окружности: 31.42 см

Такой синтаксис остаётся допустимым, но он достаточно хрупкий.

После обратного слеша нельзя случайно поставить пробел или комментарий.

В современном коде обычно предпочитают круглые скобки.


29. Строки внутри круглых скобок

Более удобный вариант:

result = (
    'Результаты вычислений:\n'
    'Площадь круга: 78.54 см²\n'
    'Диаметр круга: 10 см\n'
    'Длина окружности: 31.42 см'
)

print(result)

Соседние строковые литералы внутри круглых скобок автоматически объединяются в одну строку.

Знак + ставить не требуется.

Обратный слеш в конце строк тоже не требуется.


30. Важно не забыть \n

В этом примере:

result = (
    'Первая строка'
    'Вторая строка'
    'Третья строка'
)

строки соединятся без пробелов и переносов:

Первая строкаВторая строкаТретья строка

Чтобы получить многострочный результат, добавляем \n:

result = (
    'Первая строка\n'
    'Вторая строка\n'
    'Третья строка'
)

Результат:

Первая строка
Вторая строка
Третья строка

Обычно \n добавляется в конец каждой строки, кроме последней.


31. Почему нельзя ставить запятые

Правильно:

result = (
    'Первая строка\n'
    'Вторая строка\n'
    'Третья строка'
)

Между строками нет запятых.

Если поставить запятые:

result = (
    'Первая строка\n',
    'Вторая строка\n',
    'Третья строка',
)

будет создан не один объект str, а кортеж из трёх строк.

На этом уроке нам нужна одна строка, поэтому запятые не используем.


32. Многострочная строка внутри функции

Рассмотрим функцию:

def get_calculation_report():
    report = """Результаты вычислений:
    Площадь круга: 78.54 см²
    Диаметр круга: 10 см
    Длина окружности: 31.42 см"""
    return report

Вызовем:

print(get_calculation_report())

Результат:

Результаты вычислений:
    Площадь круга: 78.54 см²
    Диаметр круга: 10 см
    Длина окружности: 31.42 см

Первая строка начинается сразу после кавычек.

Остальные строки содержат четыре пробела, потому что они были написаны с отступом внутри функции.

Эти пробелы стали частью строкового значения.


33. Почему нельзя убрать отступ у текста

Можно попытаться написать:

def get_calculation_report():
    report = """Результаты вычислений:
Площадь круга: 78.54 см²
Диаметр круга: 10 см
Длина окружности: 31.42 см"""
    return report

Код может работать, потому что текст внутри кавычек является частью строкового литерала.

Но визуально структура функции становится менее понятной.

Строки текста больше не соответствуют обычному отступу тела функции.

Такой код сложнее читать и поддерживать.


34. Удобный вариант внутри функции

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

def get_calculation_report():
    report = (
        'Результаты вычислений:\n'
        'Площадь круга: 78.54 см²\n'
        'Диаметр круга: 10 см\n'
        'Длина окружности: 31.42 см'
    )
    return report

Вызов:

print(get_calculation_report())

Результат:

Результаты вычислений:
Площадь круга: 78.54 см²
Диаметр круга: 10 см
Длина окружности: 31.42 см

Код внутри функции имеет правильные отступы.

Лишние пробелы в вывод не попадают.


35. Более живой пример

def get_order_message():
    message = (
        'Ваш заказ успешно оформлен!\n'
        'Номер заказа: 1250\n'
        'Количество товаров: 3\n'
        'Статус: передан в обработку'
    )
    return message


print(get_order_message())

Результат:

Ваш заказ успешно оформлен!
Номер заказа: 1250
Количество товаров: 3
Статус: передан в обработку

Функция возвращает один объект класса str.


36. Круглые скобки не становятся частью строки

message = (
    'Hello '
    'World'
)

Результат:

'Hello World'

Круглые скобки помогают оформить выражение на нескольких строках.

Они не добавляются в строковое значение.

Проверим:

print(message)
print(type(message))

Результат:

Hello World
<class 'str'>

37. Обратный слеш используется в разных ролях

Важно не путать два случая.

Экранирование внутри строки

message = 'I\'m ready'

Обратный слеш экранирует кавычку.

Продолжение строки кода

message = 'Hello ' \
    'World'

Обратный слеш сообщает, что выражение продолжается на следующей строке.

Это два разных применения одного символа.

Для длинных строк кода обычно удобнее круглые скобки:

message = (
    'Hello '
    'World'
)

38. Когда использовать обычные кавычки

Одинарные или двойные кавычки подходят для коротких однострочных строк:

message = 'Hello World'
message = "Hello World"

Выбираем тот вариант, который позволяет записать строку понятнее и использовать меньше экранирования.


39. Когда использовать тройные кавычки

Тройные кавычки удобны, когда:

  • текст занимает несколько строк;
  • нужно сохранить исходное форматирование;
  • внутри встречаются разные одиночные кавычки;
  • строка находится на удобном уровне отступа.

Пример:

message = """Первая строка
Вторая строка
Третья строка"""

40. Когда использовать круглые скобки

Круглые скобки и несколько строковых литералов удобны, когда:

  • длинную строку нужно оформить на нескольких строках кода;
  • строка находится внутри функции;
  • отступы не должны попадать в результат;
  • нужно явно контролировать \n;
  • тройные кавычки ухудшают форматирование.

Пример:

message = (
    'Первая строка\n'
    'Вторая строка\n'
    'Третья строка'
)

41. Основные правила урока

Одинаковую строку можно создать с разными кавычками:

'Hello'
"Hello"
'''Hello'''
"""Hello"""

Их значения равны:

'Hello' == "Hello"

Результат:

True

Равные строки не обязаны иметь одинаковый id().

Повторение строки:

'Python' * 3

Результат:

'PythonPythonPython'

Умножение на ноль или отрицательное число возвращает пустую строку:

'Python' * 0
'Python' * -5

Многострочный текст:

message = """Первая строка
Вторая строка"""

Перенос строки:

\n

Экранирование кавычки:

\'
\"

Аккуратная длинная строка внутри функции:

def get_message():
    return (
        'Первая строка\n'
        'Вторая строка\n'
        'Третья строка'
    )

Домашнее задание

Задание 1. Разные способы создания строки

Создать одну и ту же строку:

Python Developer

восемью способами:

  1. одинарные кавычки;
  2. двойные кавычки;
  3. тройные одинарные кавычки;
  4. тройные двойные кавычки;
  5. четыре варианта с использованием str().

Сохранить строки в разные переменные.

Проверить:

  • значения через print();
  • тип через type();
  • равенство с помощью ==;
  • идентификаторы с помощью id().

Объяснить, почему равенство строк гарантируется, а одинаковый id() — нет.


Задание 2. Повторение строки

Сначала самостоятельно определить результат, затем проверить в IDLE:

'Python' * 1
'Python' * 3
'Python' * 0
'Python' * -1
'Python' * -100
'' * 10

Для результатов с пустой строкой дополнительно проверить длину с помощью len().


Задание 3. Многострочное сообщение

Создать строку:

Урок завершён!
Изученная тема: строки
Количество выполненных задач: 5
Результат: успешно

Сделать два варианта:

  1. с использованием \n;
  2. с использованием тройных кавычек.

Вывести оба варианта и проверить их равенство с помощью ==.


Задание 4. Кавычки внутри строки

Сохранить и вывести следующие строки:

I'm learning Python
Он сказал: "Привет"
Она ответила: "I'm ready"

Использовать:

  • подходящий вид внешних кавычек;
  • экранирование там, где оно необходимо;
  • тройные кавычки для одного из вариантов.

Задание 5. Найти и исправить ошибки

В коде допущены синтаксические ошибки:

first_message = 'I'm ready'
second_message = "Он сказал: "Привет""
third_message = 'Первая строка
Вторая строка'

print(first_message)
print(second_message)
print(third_message)

Нужно:

  1. найти причину каждой ошибки;
  2. исправить строки;
  3. добиться успешного запуска программы.

Задание 6. Строки внутри круглых скобок

Создать одну строку с помощью круглых скобок:

Отчёт о программе:
Файл успешно обработан
Найдено строк: 250
Ошибок: 0

Каждую часть записать в отдельных кавычках.

Не использовать:

  • тройные кавычки;
  • явное продолжение строки через обратный слеш.

Не забыть поставить \n в необходимых местах.


Задание 7. Функция с многострочным результатом

Создать функцию:

get_delivery_message()

Функция ничего не принимает и возвращает строку:

Заказ передан в службу доставки
Номер заказа: 4587
Статус: в пути
Ожидаемое время доставки: 2 дня

Строку внутри функции оформить с помощью круглых скобок и отдельных строковых литералов.

Сохранить результат функции в переменную и вывести через print().


Задание 8. Сравнение способов оформления

Создать одну и ту же многострочную строку тремя способами:

  1. одна длинная строка с \n;
  2. тройные кавычки;
  3. круглые скобки с отдельными строковыми литералами.

Проверить равенство всех трёх результатов:

first_text == second_text == third_text

Результатом должно быть:

True