💻 Практические примеры

⚡ Строки за один экран

text = "Python"
print(text[0], text[-1])      # P n
print(text[:4])                # Pyth
print(text[::-1])              # nohtyP
print(text + "!", "-" * 3)     # Python! ---
print("th" in text)            # True
print(len(text))               # 6
ПриёмЧто делаетПример
text[i]символ по индексу (-1 — с конца)text[0] → "P"
text[a:b:s]срез — новая строка, b не включаетсяtext[::-1] → "nohtyP"
+, *конкатенация и повторение"ab" * 3 → "ababab"
in, not inпроверка вхождения подстроки"th" in text → True
len(text)количество символовlen("Python") → 6
Топ-3 ошибки: попытка изменить символ через text[0] = "x" (TypeError) · индекс за пределами строки (IndexError) · граница среза end не включается, поэтому text[0:3] — это 3 символа, а не 4.

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

Пример 1. Создание строк: кавычки, тройные строки, тип str

Строку можно записать в одинарных, двойных или тройных кавычках — Python не различает их по смыслу, тройные удобны для многострочного текста.

📄 examples/string_literals.py
single = 'Hello'
double = "Hello"
multi = """First line
Second line"""
empty = ""

print(single)          # Hello
print(double)           # Hello
print(multi)
# First line
# Second line
print(repr(empty))      # ''
print(type(single))     # <class 'str'>
print(len(single), len(multi))  # 5 22

Что происходит: все три способа записи создают один и тот же тип str; len(multi) считает символ перевода строки \n внутри тройных кавычек, поэтому длина больше, чем просто сумма букв на экране.

Пример 2. Неизменяемость строк

Ключевое свойство строк: после создания их содержимое изменить нельзя. Любая «модификация» на самом деле создаёт новый объект в памяти.

📄 examples/immutability.py
s = "Hello"
print(id(s))          # 2171595019120 (адрес будет другим при каждом запуске)

s2 = s + " world!"
print(s)               # Hello — исходная строка не изменилась
print(s2)               # Hello world!
print(id(s2))            # 2171597817904 — другой объект
print(s is s2)            # False

try:
    s[0] = "h"
except TypeError as error:
    print("TypeError:", error)
    # 'str' object does not support item assignment

Что происходит: s + " world!" не трогает старую строку, а выделяет новую ячейку памяти — id(s) и id(s2) различаются. Прямое присваивание по индексу s[0] = "h" запрещено интерпретатором и завершается реальным TypeError, а не предупреждением.

Пример 3. Индексация строк

Доступ к одному символу по его позиции: индексы считаются с 0 слева и с -1 справа.

📄 examples/indexing_demo.py
text = "Python"
print(text[0])   # P
print(text[2])   # t
print(text[-1])  # n
print(text[-3])  # h

index = 10
if index < len(text):
    print(text[index])
else:
    print("Index out of range")
# Index out of range

try:
    print(text[10])
except IndexError as error:
    print("IndexError:", error)
    # string index out of range

Что происходит: строка "Python" длиной 6 имеет индексы 0..5 и -6..-1; проверка index < len(text) предотвращает ошибку, а без неё text[10] реально роняет программу с IndexError.

Пример 4. Срезы строк

Срез text[start:end:step] возвращает подстроку — новую строку, не изменяя исходную. start включается, end — нет.

📄 examples/slicing_demo.py
text = "Python programming"
print(text[0:6])      # Python
print(text[:6])       # Python — с начала строки
print(text[7:])       # programming — до конца строки
print(text[:])        # Python programming — копия всей строки
print(text[-11:])     # programming — отрицательный индекс
print(text[0:12:2])   # Pto rg — с шагом 2
print(text[::-1])     # gnimmargorp nohtyP — разворот строки

print(repr(text[14:7]))    # '' — start после end: пустая строка, не ошибка
print(repr(text[-4:-11]))  # ''

Что происходит: срезы никогда не выбрасывают IndexError, даже если границы выходят за пределы строки или заданы в неправильном порядке — в этом случае Python просто возвращает пустую строку.

Пример 5. Конкатенация и повторение

Оператор + склеивает строки, оператор * повторяет строку заданное число раз — оба возвращают новую строку.

📄 examples/concat_repeat.py
first = "Py"
second = "thon"
print(first + second)   # Python

print("=" * 10)          # ==========
print("ab" * 3)           # ababab

line = "-" * 20
print(line)               # --------------------

Что происходит: * для строки и целого числа — это не арифметическое умножение, а повторение содержимого; "ab" * 3 склеивает три копии "ab" подряд.

Пример 6. Escape-последовательности и raw-строки

Обратный слэш \ запускает специальный символ: \n — новая строка, \t — табуляция, \\ — сам слэш. Префикс r отключает эту обработку — полезно для путей Windows.

📄 examples/escape.py
text = "Line 1\nLine 2\tTabbed"
print(text)
# Line 1
# Line 2	Tabbed

quote = 'It\'s ok'
print(quote)              # It's ok

path = r"C:\Users\Admin\file.txt"
print(path)                # C:\Users\Admin\file.txt — слэши не экранируются

print("Backslash: \\")      # Backslash: \

Что происходит: без r строка "C:\Users..." испортилась бы на escape-последовательностях вроде \U; raw-строка сохраняет каждый символ буквально.

Пример 7. len(), ord(), chr() и кодировка UTF-8

len() считает символы. ord() и chr() переводят символ Unicode в код и обратно. encode()/decode() переводят строку в байты и обратно по заданной кодировке.

📄 examples/len_ord_chr.py
text = "Python"
print(len(text))    # 6
print(len(""))       # 0

print(ord("A"))       # 65
print(ord("a"))        # 97
print(chr(65))          # A
print(chr(97))           # a

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

decoded = encoded.decode("utf-8")
print(decoded)    # Привет

Что происходит: каждая русская буква в UTF-8 занимает 2 байта, поэтому строка из 6 букв кодируется в 12 байт; decode("utf-8") восстанавливает исходный текст из этих байтов.

Пример 8. Оператор in и перебор строки в цикле

Строка — это последовательность символов, поэтому к ней применимы проверка вхождения через in и перебор циклом for.

📄 examples/membership_iteration.py
text = "Python programming"
print("Python" in text)     # True
print("Hello" in text)       # False
print("Java" not in text)     # True

phrase = "Hello, World!"
vowels = "aeiou"
count = 0
for char in phrase.lower():
    if char in vowels:
        count += 1
print(f"Vowels: {count}")     # Vowels: 3

symbol = "o"
count2 = 0
for char in phrase:
    if char == symbol:
        count2 += 1
print(f"Symbol '{symbol}' appears {count2} time(s).")
# Symbol 'o' appears 2 time(s).
print(phrase.count(symbol))     # 2 — то же самое встроенным методом

Что происходит: ручной подсчёт циклом и вызов .count() дают одинаковый результат 2 — метод делает то же самое, но короче и без риска опечататься в условии.

Пример 9. f-строки — современный способ подставить значения

f-строка вычисляет выражения в фигурных скобках прямо внутри текста. Подробное сравнение со старыми способами (+, %, .format()) — на странице «Старый vs Новый», форматы чисел — в уроке 22.

📄 examples/fstrings.py
name = "Alice"
age = 30
print(f"Hello, {name}! Next year you will be {age + 1}.")
# Hello, Alice! Next year you will be 31.

pi = 3.14159265
print(f"Pi rounded: {pi:.2f}")  # Pi rounded: 3.14

Что происходит: {age + 1} — это не текст, а выражение Python, оно вычисляется на месте; :.2f после двоеточия — спецификатор формата, округляющий число до двух знаков.

Пример 10. Базовые строковые методы

Методы возвращают новую строку и не трогают исходную. Здесь — только самые частые; полный список с таблицами — в справочнике урока и подробно, метод за методом, в уроке 20.

📄 examples/methods_demo.py
raw = "  Hello, Python!  "
print(repr(raw.strip()))                 # 'Hello, Python!'
print(raw.upper())                        # "  HELLO, PYTHON!  "
print(raw.lower())                         # "  hello, python!  "
print(raw.replace("Python", "World"))       # "  Hello, World!  "
print(raw.find("Py"))                        # 9
print(raw.startswith("  He"))                 # True
print(raw.split(", "))                         # ['  Hello', 'Python!  ']

print(raw)  # "  Hello, Python!  " — исходная строка не изменилась

Что происходит: ни один вызов не поменял raw — последний print(raw) печатает исходную строку с пробелами по краям, потому что методы строк, как и срезы, всегда создают новый объект.

Пример 11. Задача из лекции: палиндром

Строка — палиндром, если читается одинаково слева направо и справа налево. Классическая задача на срезы с шагом -1.

📄 examples/palindrome.py
def check_palindrome(value):
    return value == value[::-1]


for sample in ("radar", "hello"):
    result = "The string is a palindrome" if check_palindrome(sample) else "The string is not a palindrome"
    print(f"{sample!r}: {result}")
# 'radar': The string is a palindrome
# 'hello': The string is not a palindrome

Что происходит: value[::-1] — это та же строка в обратном порядке (пример 4); если она совпадает с оригиналом посимвольно, строка симметрична.

Пример 12. Задача из лекции: дешифровка шифра Цезаря

Программа сдвигает код каждого символа зашифрованного текста назад на заданное число позиций, используя ord() и chr() из примера 7.

📄 examples/caesar_decrypt.py
def caesar_decrypt(encrypted_text, shift):
    decrypted_text = ""
    i = 0
    while i < len(encrypted_text):
        char = encrypted_text[i]
        decrypted_char = chr(ord(char) - shift)
        decrypted_text += decrypted_char
        i += 1
    return decrypted_text


print(caesar_decrypt("khoor", 3))  # hello

Что происходит: код каждой буквы ord(char) уменьшается на shift, а chr() переводит новый код обратно в символ; результат собирается конкатенацией (пример 5) в новую строку decrypted_text.

Как запустить в VS Code

  1. Создайте файл example.py в папке урока.
  2. Скопируйте код из примера выше.
  3. Откройте терминал в VS Code (Ctrl + `).
  4. Убедитесь, что активировано виртуальное окружение: venv\Scripts\activate (Windows) или source venv/bin/activate (Mac/Linux).
  5. Запустите: python example.py