Символьный тип данных str: от основ до продвинутых возможностей
Основы строкового типа str
Наиболее распространённый способ работы с текстом в Python - использование строкового типа str. Строка представляет собой неизменяемую последовательность символов Unicode. Основной синтаксис создания - заключение текста в одинарные (' ') или двойные (" ") кавычки. Такой подход даёт минимальные накладные расходы и полностью покрывает базовые потребности.
message = 'Привет, мир!'
answer = "Hello, world"Python символьный тип (символьный тип (str) в python)
Если внутри строки требуется использовать кавычку, её можно экранировать обратной косой чертой или выбрать другой тип кавычек.
quote = "He said, \"Python is great!\""
quote2 = 'He said, "Python is great!"'
Типичная ошибка: забыть экранировать внутреннюю кавычку, что приводит к синтаксической ошибке SyntaxError: EOL while scanning string literal. Решение - использовать другой вид кавычек или экранирование.
Как создать многострочную строку?
Для строк, занимающих несколько строк, применяются тройные кавычки (одинарные или двойные). Текст может содержать переносы строк и сохраняет форматирование.
poem = """Вот моя деревня,
Вот мой дом родной."""
Если нужно избежать лишнего перевода строки в начале или конце, используется обратная косая черта в конце строки.
text = """Первая строка \
Вторая строка"""
Проблема: отступы внутри тройных кавычек сохраняются, что может добавить лишние пробелы. Решение - выравнивать код или использовать textwrap.dedent.
Как избежать интерпретации escape-последовательностей?
Сырые (raw) строки, помеченные префиксом r или R, отключают обработку обратной косой черты. Это удобно для регулярных выражений и путей Windows.
path = r'C:\Users\Name\Documents'
regex = r'\d+\.\d+'
Ограничение: raw-строка не должна заканчиваться нечётным количеством обратных косых черт - иначе будет ошибка. Выход - добавить пробел или использовать обычную строку с экранированием.
Как преобразовать другие типы данных в строку?
Функция str() возвращает строковое представление любого объекта. Для более точного контроля применяется repr() или f-строки.
number = 42
s = str(number) # '42'
pi = 3.1415
s_pi = f'{pi:.2f}' # '3.14'
Ошибка: попытка конкатенации строки и числа без явного преобразования вызывает TypeError. Решение - использовать str() или f-строки.
Как вставить переменные в строку без конкатенации?
Современный и эффективный способ - f-строки (f''). Внутри фигурных скобок можно размещать любые выражения.
name = 'Анна'
age = 25
info = f'Меня зовут {name}, мне {age} лет.'
Альтернативы: метод format() и оператор %.
info2 = 'Меня зовут {}, мне {} лет.'.format(name, age)
info3 = 'Меня зовут %s, мне %d лет.' % (name, age)
Проблема: если надо вывести фигурные скобки, они удваиваются: {{ }}. Также f-строки не поддерживаются в Python младше 3.6.
Как получить символ по его индексу?
Индексация начинается с 0. Отрицательные индексы отсчитывают с конца.
s = 'Python'
first = s[0] # 'P'
last = s[-1] # 'n'
Ошибка: при выходе за пределы строки возникает IndexError. Перед доступом можно проверять длину через len().
Как извлечь подстроку (срез)?
Синтаксис [start:stop:step]. По умолчанию start=0, stop=длина строки, step=1.
word = 'Программирование'
sub = word[3:10] # 'раммир'
rev = word[::-1] # 'еинавориммаргоП'
Типичная ошибка: путать stop и step - stop не включается, а step задаёт шаг. Если step отрицательный, start должен быть больше stop для корректного среза.
Как изменить регистр или проверить свойства символов?
Методы строк позволяют легко манипулировать регистром и проверять содержимое.
text = 'Python 3.12'
upper_text = text.upper() # 'PYTHON 3.12'
is_digit = text.isdigit() # False
is_alpha = 'abc'.isalpha() # True
Нюанс: методы регистра работают с учётом Unicode, но для некоторых языков (например, турецкого) требуют специальной обработки. Проверки isdigit и isalpha учитывают только буквы/цифры текущего алфавита.
Как разбить строку на части или объединить несколько строк?
Метод split() разбивает строку по разделителю и возвращает список. Метод join() объединяет список строк в одну.
sentence = 'Я изучаю Python'
words = sentence.split() # ['Я', 'изучаю', 'Python']
joined = ' '.join(words) # 'Я изучаю Python'
Ошибка: split() без аргумента разделяет по любым пробельным символам (включая табуляцию и переносы). Если нужен только пробел, следует указать split(' ').
Как удалить лишние пробелы в начале и конце строки?
Методы strip(), lstrip(), rstrip() удаляют пробелы (или указанные символы) с соответствующих сторон. Строка остаётся неизменной, возвращается новая.
messy = ' привет '
clean = messy.strip() # 'привет'
Важно: метод strip() не изменяет исходную строку. Если нужно заменить исходную переменную, результат следует присвоить.
Как найти подстроку или заменить её?
Метод find() возвращает индекс первого вхождения или -1. index() работает аналогично, но кидает исключение. replace() заменяет все вхождения одной подстроки на другую.
text = 'Python - отличный язык'
pos = text.find('отличный') # 9
new_text = text.replace('отличный', 'замечательный')
Различие: find() при отсутствии подстроки возвращает -1, а index() вызывает ValueError. Выбор зависит от требуемого поведения.
Как проверить, содержит ли строка подстроку?
Оператор in возвращает True или False. Это наиболее читаемый способ.
if 'Python' in 'Я люблю Python':
print('Да')
Расширенные примеры работы со строками
В данном разделе приведены неочевидные и продвинутые сценарии использования строк в Python.
Работа с Unicode и эмодзи
Строки Python поддерживают любые символы Unicode, включая эмодзи. Длина строки считается в символах, но некоторые эмодзи могут состоять из нескольких кодовых точек (например, флаги).
emoji = '?'
print(len(emoji)) # 1 (один символ)
flag = '??' # флаг России состоит из двух региональных индикаторов
print(len(flag)) # 2 (две кодовые точки)
1 2
Кодирование и декодирование строк
Для преобразования строки в байты используется метод encode(), для обратного - decode(). Важно указать кодировку (по умолчанию UTF-8).
text = 'Привет'
bytes_utf8 = text.encode('utf-8') # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
decoded = bytes_utf8.decode('utf-8') # 'Привет'
# Ошибка при неверной кодировке
try:
bytes_cp1251 = text.encode('cp1251')
decoded_wrong = bytes_cp1251.decode('utf-8')
except UnicodeDecodeError as e:
print('Ошибка:', e)
Ошибка: 'utf-8' codec can't decode byte 0xcf in position 0: invalid continuation byte
Форматирование чисел с помощью f-строк
F-строки поддерживают спецификаторы формата, аналогичные методу format().
price = 49.995
print(f'Цена: {price:.2f} руб.') # два знака после запятой
print(f'Процент: {0.256:.1%}') # 25.6%
print(f'Число: {1000000:,}') # 1,000,000 с разделителями тысяч
Цена: 50.00 руб. Процент: 25.6% Число: 1,000,000
Использование методов maketrans и translate для массовой замены символов
Эти методы позволяют заменить или удалить набор символов за один проход.
# Транслитерация: замена русских букв на латиницу
trans_table = str.maketrans({
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
'е': 'e', 'ё': 'yo', 'ж': 'zh', 'з': 'z', 'и': 'i'
})
original = 'привет'
result = original.translate(trans_table)
print(result) # privet
privet
Сравнение строк в зависимости от регистра
При сравнении строк по умолчанию учитывается регистр. Чтобы провести сравнение без учёта регистра, можно привести обе строки к одному регистру.
s1 = 'Python'
s2 = 'python'
print(s1 == s2) # False
print(s1.lower() == s2.lower()) # True
# Лексикографическое сравнение: 'A' < 'a' (код 65 < 97)
print('A' < 'a') # True
False True True
Объединение элементов списка с разными разделителями
Метод join() работает быстро и экономит память по сравнению с конкатенацией в цикле.
items = ['apple', 'banana', 'cherry']
# Соединить через запятую и пробел
csv = ', '.join(items)
print(csv) # apple, banana, cherry
# Для URL параметров
params = ['key1=value1', 'key2=value2']
query_string = '&'.join(params)
print(query_string) # key1=value1&key2=value2
apple, banana, cherry key1=value1&key2=value2
Сырые строки в регулярных выражениях
При использовании модуля re raw-строки позволяют не думать о лишнем экранировании.
import re
pattern = r'\b\w{3}\b' # слово из трёх букв
text = 'cat dog elephant'
matches = re.findall(pattern, text)
print(matches) # ['cat', 'dog']
['cat', 'dog']
Удаление префиксов и суффиксов (Python 3.9+)
Методы removeprefix() и removesuffix() удаляют заданную подстроку только если она стоит в начале или конце строки.
url = 'https://example.com'
clean_url = url.removeprefix('https://')
print(clean_url) # example.com
filename = 'report.pdf'
name = filename.removesuffix('.pdf')
print(name) # report
example.com report
Ширина выравнивания и заполнение
Методы center(), ljust(), rjust() и zfill() помогают форматировать строки фиксированной ширины.
title = 'Python'
print(title.center(20, '-')) # -------Python-------
print(title.rjust(10)) # ' Python'
number = '42'
print(number.zfill(5)) # '00042'
-------Python-------
Python
00042
Проверка строк на палиндром с помощью срезов
def is_palindrome(s):
cleaned = ''.join(c.lower() for c in s if c.isalnum())
return cleaned == cleaned[::-1]
print(is_palindrome('А роза упала на лапу Азора')) # True
print(is_palindrome('Python')) # False
True False