📦 Репозиторий занятия 14

Урок 14. Знакомство со строками

Как работать с репозиторием

Каждая карточка говорит, о чём файл, что он выводит и что в нём искать. Код виден прямо здесь: его можно скопировать одной кнопкой, скачать файл или открыть его целиком.

Маршрут изучения

  1. Прочитайте описание: по нему уже понятно, о чём файл и что он выведет.
  2. Предскажите вывод: сравните своё предположение со строкой «Что выводит».
  3. Запустите: скачайте файл или скопируйте код кнопкой и выполните его у себя.
  4. Измените: поменяйте одно условие или значение и объясните новый результат.

Файлы: рекомендуемый порядок

1
MarkdownРазбор концепции25 строк

Строки неизменяемы: доказательство через id() и переход ASCII → Unicode

less_08__str_datatype/theory_01__str_is_immutable__ascii_unicode.md

Ссылается на предыдущее доказательство immutable-типов через id() (из урока про арифметику) и повторяет его именно для строк: s += ' world!' меняет адрес переменной в памяти, значит исходная строка не модифицируется, а создаётся заново. Вторая часть — короткая историческая справка: Python 2 использовал ASCII, Python 3 перешёл на Unicode для поддержки всех символов, а не только латиницы.

  • id(s) до и после s += ' world!' — адрес меняется
  • Строка изменяется только через создание новой ячейки памяти
  • Python 2: кодировка ASCII
  • Python 3: переход на Unicode
Показать начало файла (25 строк всего)
## Строки - неизменяемый (`immutable`) тип данных.  

Доказательства находится [здесь](../less_03__arithmetic_operations__type_conversion/theory_03__augmented_assignment_operators.md)

**Важно:**  
Из этого вовсе не следует, что нельзя проводить операции по изменению строк!  
Просто результат этого изменения будет находиться в новой (другой) ячейке памяти:

```python
s = 'Hello'
print(id(s))  # 139908104970544
print(s)      # Hello
s += ' world!'
print(id(s))  # 139907897652336
print(s)      # Hello world!
```

## Различные кодировки строк

Строка - это упорядоченный набор символов.  
Каждый символ имеет свой код.  
В Python 2 использовалась [кодировка `ascii`](https://en.wikipedia.org/wiki/ASCII#Printable_character_table)

Именно для перевода строк в другую кодировку, а именно в [кодировку `Unicode`](https://en.wikipedia.org/wiki/UTF-8#Description),    
перешли на Python 3.
Проверьте себя: Если s = 'Hello' и s = s + '!' создают новую строку по новому адресу, экономнее ли использовать список символов вместо многократной конкатенации строк?
2
MarkdownРазбор концепции81 строк

encode/decode, ord/chr и len(): строки, байты и Unicode-коды символов

less_08__str_datatype/theory_02__encode_decode_ord_chr_len.md

Пять связанных инструментов работы с представлением текста: encode() переводит str в bytes по заданной кодировке (с параметром errors для обработки сбоев), decode() — обратная операция; ord() и chr() — пара функций «символ → код» и «код → символ»; len() показывает разницу между количеством символов в строке и количеством байт после encode('utf-8') — для кириллицы это разные числа (6 символов = 12 байт).

  • text.encode("utf-8") — str → bytes, вывод b'\xd0\x9f...'
  • encoded_text.decode("utf-8") — bytes → str обратно
  • ord("A") == 65, ord("я") == 1103
  • chr(65) == "A", chr(1103) == "я"
  • len("Привет") == 6 против len("Привет".encode("utf-8")) == 12
Показать начало файла (81 строк всего)
### 1. `encode()`

Метод `encode()` используется для преобразования строки (`str`) в байты (`bytes`)  
с использованием определённой кодировки (обычно UTF-8).

**Синтаксис:**

```python
string.encode(encoding="utf-8", errors="strict")
```

* `encoding` — кодировка (по умолчанию `utf-8`).
* `errors` — как обрабатывать ошибки (`strict`, `ignore`, `replace`).

**Пример:**

```python
text = "Привет"
encoded_text = text.encode("utf-8")
print(encoded_text)  # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
```

Теперь `encoded_text` — это байтовая строка (`bytes`).

---

### 2. `decode()`

Метод `decode()` применяется к байтам (`bytes`), чтобы снова получить строку (`str`).

**Пример:**

```python
decoded_text = encoded_text.decode("utf-8")
print(decoded_text)  # Привет
```

---

### 3. `ord()`

Функция `ord()` возвращает Unicode-код (число) для символа.

**Пример:**

```python
print(ord("A"))  # 65
print(ord("я"))  # 1103
```

---

### 4. `chr()`

Функция `chr()` делает обратное — из кода возвращает символ.

**Пример:**

```python
print(chr(65))    # A
…
Проверьте себя: Почему len(text) и len(text.encode('utf-8')) дают разные числа для кириллицы 'Привет', но совпадут для латиницы 'Hello'?
3
MarkdownРазбор концепции114 строк

Срезы строк: синтаксис [начало:конец:шаг], индексы и реверс

less_08__str_datatype/theory_03__slicing.md

Полный разбор синтаксиса строка[начало:конец:шаг] с индексацией и слева направо (0…len-1), и справа налево (-1…-len). Прогрессия примеров: базовые срезы без шага, срезы с положительным и отрицательным шагом (включая text[::-1] для разворота строки), срезы с отрицательными индексами и подборка частых приёмов (последний символ, все кроме последнего, удаление первого и последнего). Завершается напоминанием, что срез — это всегда новая строка, а не изменение исходной.

  • text[начало:конец:шаг] — синтаксис и значения по умолчанию
  • Индексация слева направо (0…5) и справа налево (-6…-1) на примере 'Python'
  • text[0:2], text[:4], text[2:], text[:] — базовые срезы
  • text[::2], text[1::2], text[::-1] — срезы с шагом и реверс
  • text[-4:], text[:-3], text[-5:-2] — отрицательные индексы
  • s[:-1], s[1:-1], s[::3] — частые приёмы срезов
  • part = text[1:4] — срез создаёт новую строку, исходная не меняется
Показать начало файла (114 строк всего)
## 1. Что такое slicing

**Slicing** — это способ получить подстроку из строки, указывая диапазон индексов.  
Синтаксис:

```python
строка[начало:конец:шаг]
```

* **начало** → индекс, с которого начинаем (включительно)
* **конец** → индекс, до которого берём (не включая)
* **шаг** → через сколько символов брать

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

* начало = 0
* конец = конец строки
* шаг = 1

---

## 2. Индексация в строках

В Python:

* Индексация **слева направо**: с 0 до `len(строка)-1`
* Индексация **справа налево**: с -1 до -`len(строка)`

Пример:

```python
text = "Python"
#  P   y   t   h   o   n
#  0   1   2   3   4   5
# -6  -5  -4  -3  -2  -1
```

---

## 3. Базовые примеры срезов

```python
text = "Python"

print(text[0:2])    # 'Py' → с 0 до 2 (2 не включается)
print(text[:4])     # 'Pyth' → от начала до 4
print(text[2:])     # 'thon' → от 2 до конца
print(text[:])      # 'Python' → копия всей строки
```

---

## 4. С шагом (step)

```python
text = "Python"

print(text[::2])    # 'Pto' → каждый второй символ
print(text[1::2])   # 'yhn' → начиная с индекса 1, каждый второй
print(text[::-1])   # 'nohtyP' → реверс строки
…
Проверьте себя: Что вернёт s[::3] для строки 'Hello, World!' и почему в результате оказывается символ пробела?
4
MarkdownРазбор концепции35 строк

Операторы in и not in для проверки вхождения

less_08__str_datatype/theory_04__in__not_in.md

Определяет in/not in как проверку присутствия/отсутствия элемента и перечисляет, для каких коллекций они работают: строки (подстрока), списки, кортежи, множества (быстрый поиск), словари (по ключу). Все примеры — на строках, с явным акцентом на чувствительность к регистру ('Python' in text даёт True, 'python' in text — False).

  • "Python" in text — True, регистрозависимая проверка подстроки
  • "Java" not in text — True
  • if "язык" in text: — использование в условии
  • Кратко: in/not in работают со списками, кортежами, множествами (быстро) и словарями (по ключу)
Показать начало файла (35 строк всего)
## Теория: `in` и `not in` для коллекций в Python

В Python операторы `in` и `not in` используются для **проверки вхождения элемента** в коллекцию.

* **`in`** → возвращает `True`, если элемент **присутствует** в коллекции
* **`not in`** → возвращает `True`, если элемент **отсутствует** в коллекции

Работают с большинством коллекций:

* **Строки** → проверяется, содержится ли подстрока в строке
* **Списки** → проверяется наличие элемента
* **Кортежи** → аналогично спискам
* **Множества** → проверяется наличие элемента (работает быстро)
* **Словари** → проверяется наличие ключа

---

## Примеры для строк

```python
text = "Python — мощный язык программирования"

# Проверка наличия подстроки
print("Python" in text)        # True
print("python" in text)        # False (регистр важен)

# Проверка отсутствия
print("Java" not in text)      # True
print("мощный" not in text)    # False

# Условие
if "язык" in text:
    print("В тексте есть слово 'язык'")
```
Проверьте себя: Почему для множеств в файле отдельно отмечено, что in работает «быстро» — чем поиск в set отличается от поиска в списке или строке?