> For the complete documentation index, see [llms.txt](https://opu.gitbook.io/101/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://opu.gitbook.io/101/sprint-1.-bazovye-znaniya-i-osnovy-programmirovaniya/2.-osnovy-python/stroki.md).

# Строки

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

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

{% hint style="info" %}
В отличие от многих других языков, в Python не предусмотрен отдельный тип для индивидуальных символов; взамен применяются односимвольные строки.
{% endhint %}

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

### Строковые литералы

{% hint style="info" %}
**Литерал** - запись в исходном коде компьютерной программы, представляющая фиксированное значение. Литералы представляют собой константы, включаемые непосредственно в текст программы. В отличие от прочих элементов языка, литералы не могут быть изменены в тексте программы.
{% endhint %}

В Python существует много способов записи строк в коде:

* одинарные кавычки - `'eat at joe"s'`;
* двойные кавычки - `"eat at joe's"`;
* утроенные кавычки - `""" eat at joe's """"`, `''' eat at joe's '''`;
* управляющие последовательности - `"j\n\o\a\e"`;
* неформатированные строки - `r"C:\temp\text.txt"`;
* байтовый литерал - `b'j\n\o\a\e'`.

### Строки в одинарных и двойных кавычках

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

```python
s1 = "text"
s2 = 'text'
```

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

```python
s1 = "joe's"
s2 = 'joe"s'
```

Обратите внимание, что Python выполнит *автоматическую конкатенацию* соседних строк в любом выражении (автоматическая конкатенация аналогична операции +)

```python
>>> "eat " "at " "joe's"
"eat at joe's"
```

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

```python
>>> "eat ", "at ", "joe's"
('eat ', 'at ', "joe's")
```

### Управляющие последовательности

Управляющие последовательности (escape sequences) позволяют внедрять в строки символы, которые не могут быть легко набраны на клавиатуре. Символ `\` и один или более следующих за ним символов в строковом литерале в итоговой строке заменяются *одиночным* символом, который имеет двоичное значение, указанное управляющей последовательностью.

Разберем  следующий пример

```python
>>> s = "j\no\te"
>>> print(s)
j
o       e
```

Два символа `\n` обозначают одиночный символ - символ новой строки в таблице символов. Последовательность `\t` заменяется символом табуляции.

Примечательно, что если получить длину строки с помощью функции `len()`, то она вернет нам фактическую длину строки, независимо от того, каким образом они кодируются или отображаются

```python
>>> len(s)
5
```

В нашем случае строка имеет длину 5 символов - "joe" + 1 символ переноса строки + 1 символ табуляции. Исходные символы обратной косой черты в предыдущем результате не хранятся со строкой в памяти; они используются лишь для описания значений специальных символов.

| Последовательность | Описание                                    |
| ------------------ | ------------------------------------------- |
| `\`                | продолжение строки в многострочном литерале |
| `\\`               | обратная косая черта (символ `\`)           |
| `\'`               | одинарная кавычка (`'`)                     |
| `\"`               | двойные кавычки (`"`)                       |
| `\a`               | звуковой сигнал                             |
| `\b`               | backspace                                   |
| `\f`               | новая страница (formfeed)                   |
| `\n`               | новая строка                                |
| `\r`               | возврат каретки                             |
| `\t`               | горизонтальная табуляция                    |
| `\v`               | вертикальная табуляция                      |

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

Python предлагает более развитый способ для объединения задач строковой обработки - **форматирование строк** позволяет выполнять множество подстановок, специфических для типов, в строке за единственный шаг. Механизм форматирования может быть очень удобным, особенно когда форматируемый текст подлежит отображению для пользователей программы.

Форматирование строк в Python 3 может осуществляться двумя способами. Первый метод основан на использовании функции `format()`. Эта функция объединяет форматную строку, содержащую поля-заменители в фигурных скобках `{}`, со значениями, взятыми из параметров функции `format()`. Если потребуется включить в строку литерал `{` или `}`, удвойте его (`{{` и `}}` соответственно).

```python
print("Данная строка будет выведена без проблем {}")
print("Привет, {}! Фигурные скобки {{ }}".format("Вася"))

Данная строка будет выведена без проблем {}
Привет, Вася! Фигурные скобки { }
```

Функция `format()` предоставляет мощный мини-язык форматирования строк, дающий почти бесконечные возможности для управления форматированием строк. С другой стороны, в большинстве стандартных ситуаций он достаточно прост в использовании, поэтом в этом разделе будут рассмотрены некоторые шаблоны. Если же вам потребуются нетривиальные возможности, обращайтесь к разделу, посвященному форматированию строк, в документации стандартной библиотеки.

#### Функция format() и позиционные параметры

Простой способ использования строкой функции `format()` связан с заменой нумерованных полей, соответствующих параметрам, переданным функции `format()`

```python
print("Привет, {0}, {1} и {2}!".format("Петя", "Саша", "Сережа"))
print("Порядок нумерованных полей может быть разным, {2}, {0} и {1}!".format("Петя", "Саша", "Сережа"))

Привет, Петя, Саша и Сережа!
Порядок нумерованных полей может быть разным, Сережа, Петя и Саша!
```

Пример выше содержим три поля-заменителя - `{0}`, `{1}` и `{2}`, - которые последовательно заменяются первым, вторым и третьим параметрами. Где бы в форматной строке ни размещалось поле `{0}`, оно всегда замещается первым параметром и так далее.

#### Именованные параметры

Метод `format()` также распознает именованные параметры и поля замены

```python
```

В этом случае параметр выбирается по совпадению имени поля-заменителя с именем параметра, переданного команде `format()`.

Допускается использование позиционных параметров вместе с именованными; в этих параметрах можно даже обращаться к атрибутам и элементам

```python
```

В данном случае первый параметр является позиционным, тогда как обозначение `user[1]` относится ко второму элементу именованного параметра `user`.

#### Спецификаторы формата

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

Спецификатор формата позволяет задать символ-заполнитель, тип выравнивания, знак, ширину, точность и тип данных при подстановке на место поля-заменителя. Как упоминалось ранее, синтаксис спецификаторов формата представляет отдельный мини-язык, слишком сложный для того, чтобы полностью описывать его в рамках данного курса. Приведем несколько примеров

```python
```

### Строковая интерполяция

В Python 3.6 появился механизм создания строковых констант, содержащих произвольные значения; он называется **строковой интерполяцией**. Строковая интерполяция позволяет включать значения выражений Python в строковые литералы. Эти f-строки (как они часто называются из-за префикса `f`) используют синтаксис, сходный с синтаксисом метода `format()`, но с несколько большей эффективностью. Приведем несколько примеров

```python
```

Как и в случае с методом `format()`, можно добавить спецификаторы формата

```python
```

Так как строковая интерполяция появилась в Python совсем недавно, пока неясно, как она будет использоваться.
