Примеры идут от простого к сложному: сначала создание строк и их ключевое свойство — неизменяемость, затем доступ к содержимому (индексы, срезы), операции над строками целиком и полезные функции, а в конце — обе задачи из лекции целиком. Весь вывод в комментариях получен запуском кода, а не набран по памяти.
Пример 1. Создание строк: кавычки, тройные строки, тип str
Строку можно записать в одинарных, двойных или тройных кавычках — Python не различает их по смыслу, тройные удобны для многострочного текста.
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. Неизменяемость строк
Ключевое свойство строк: после создания их содержимое изменить нельзя. Любая «модификация» на самом деле создаёт новый объект в памяти.
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 справа.
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 — нет.
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. Конкатенация и повторение
Оператор + склеивает строки, оператор * повторяет строку заданное число раз — оба возвращают новую строку.
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.
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() переводят строку в байты и обратно по заданной кодировке.
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.
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.
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.
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.
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.
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
- Создайте файл
example.pyв папке урока. - Скопируйте код из примера выше.
- Откройте терминал в VS Code (Ctrl + `).
- Убедитесь, что активировано виртуальное окружение:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите:
python example.py