Текстовые строки: синтаксис и методы
Строки (тип str) являются одним из фундаментальных типов данных в Python. Они представляют неизменяемую последовательность символов Unicode. Это означает, что после создания строку нельзя изменить: любая операция, изменяющая строку, создает новый объект. Строки широко используются для хранения и обработки текстовой информации.
Эффективное форматирование строк
Как создать строку с подстановкой переменных современным способом?
Наиболее эффективный и читаемый способ форматирования строк в Python - это f-строки (f-strings), введенные в версии 3.6. Они позволяют встраивать выражения внутрь строкового литерала, используя синтаксис f"... {выражение} ...".
name = 'Анна'
age = 30
message = f'Привет, {name}! Тебе {age} лет.'
print(message)
строки в языке python (строки в языке python)
Привет, Анна! Тебе 30 лет.
В фигурных скобках можно размещать не только переменные, но и любые выражения Python: арифметические операции, вызовы функций, обращение к элементам списков и словарей.
a = 5
b = 3
result = f'Сумма {a} и {b} равна {a + b}.'
print(result)
Сумма 5 и 3 равна 8.
Типичные ошибки:
- Забыли префикс f перед строкой - тогда фигурные скобки останутся как текст.
- Для вывода символа фигурной скобки применяются двойные скобки: {{ и }}.
value = 100
text = f'Значение: {{value}} равно {value}'
print(text)
Значение: {value} равно 100
Цель: Современное, быстрое и читаемое форматирование с возможностью встраивания вычислений. Рекомендуется для всех задач, где требуется подстановка значений.
Как отформатировать строку без f-строк, используя оператор %?
Оператор % - способ форматирования, заимствованный из языка C. Он подставляет значения в строку по шаблону, где спецификаторы типа начинаются с %, например %s для строки, %d для целого числа.
name = 'Иван' age = 25 text = 'Меня зовут %s, мне %d лет.' % (name, age) print(text)
Меня зовут Иван, мне 25 лет.
Можно использовать словарь для именованных подстановок.
data = {'name': 'Ольга', 'age': 22}
text = 'Имя: %(name)s, возраст: %(age)d' % data
print(text)
Имя: Ольга, возраст: 22
Возможные проблемы:
- Несоответствие типа спецификатора и значения: %s принимает любой тип, но %d требует целое число. Ошибка TypeError при несовместимости.
- Меньшая читаемость при большом количестве аргументов.
Цель: Обратная совместимость с кодом на Python 2 или использование в библиотеках логирования, где этот стиль остается популярным.
Как использовать метод format() для гибкого форматирования?
Метод str.format() предлагает более мощный и расширяемый синтаксис. Позиционные и именованные аргументы, спецификация выравнивания, числовые форматы.
name = 'Максим'
age = 28
text = 'Привет, {}. Тебе {} лет.'.format(name, age)
print(text)
Привет, Максим. Тебе 28 лет.
С именованными аргументами:
text = 'Привет, {n}. Тебе {a} лет.'.format(n=name, a=age)
print(text)
Привет, Максим. Тебе 28 лет.
Поддержка форматирования чисел с фиксированной точностью:
pi = 3.14159265
print('Число π: {:.2f}'.format(pi))
Число π: 3.14
Типичные ошибки:
- Количество аргументов не совпадает с количеством плейсхолдеров - IndexError.
- Неправильный спецификатор формата (например, :d для строки) вызывает ValueError.
Цель: Подходит для ситуаций, когда шаблон строки определяется заранее (например, читается из файла) или требует сложного выравнивания и заполнения.
Как объединить строки через конкатенацию и метод join?
Простейший способ - оператор +. Однако при объединении многих строк в цикле это неэффективно из-за создания множества промежуточных строк.
words = ['Python', 'строка', 'объединение']
result = ''
for w in words:
result += w + ' '
print(result.strip())
Python строка объединение
Лучший способ - метод str.join(), который принимает итерируемый объект и вставляет разделитель между элементами.
words = ['Python', 'строка', 'объединение'] result = ' '.join(words) print(result)
Python строка объединение
Ошибки:
- При использовании join элементы должны быть строками. Если в списке есть числа, потребуется преобразование: ", ".join(str(x) for x in list).
- Соединение пустой строки с разделителем даёт пустую строку, что иногда неожиданно.
Цель: join - наиболее эффективный способ объединения большого количества строк. Конкатенация уместна только для 2-3 частей.
Дополнительные примеры работы со строками
Ниже приведены примеры различных операций и методов, которые расширяют возможности работы со строками.
Срезы строк
Срезы позволяют извлекать подстроки. Синтаксис: str[start:stop:step].
text = 'Программирование' print(text[0:5]) # первые 5 символов print(text[-6:]) # последние 6 print(text[::-1]) # обратный порядок print(text[::2]) # каждый второй символ
Програм ование еинавориммаргоП Пораиоае
Методы изменения регистра
s = 'Привет Мир' print(s.lower()) print(s.upper()) print(s.title()) print(s.swapcase())
привет мир ПРИВЕТ МИР Привет Мир пРИВЕТ мИР
Проверка свойств символов
s = 'abc123' print(s.isalpha()) # есть ли только буквы print(s.isdigit()) # только цифры print(s.isalnum()) # буквы и цифры print(s.isspace()) # пробельные символы
False False True False
Поиск и замена
s = 'один два один три'
print(s.find('один')) # первое вхождение
print(s.rfind('один')) # последнее
print(s.replace('один', 'раз', 1)) # замена одного вхождения
print(s.count('один'))
0 10 раз два один три 2
Удаление пробелов и разделение
s = ' пробелы вокруг '
print(repr(s.strip()))
print(repr(s.lstrip()))
print(repr(s.rstrip()))
words = 'яблоко,груша,вишня'.split(',')
print(words)
'пробелы вокруг' 'пробелы вокруг ' ' пробелы вокруг' ['яблоко', 'груша', 'вишня']
Многострочные и сырые строки
multiline = '''Первая строка Вторая строка Третья''' print(multiline) raw_path = r'C:\Users\name\new_folder' print(raw_path)
Первая строка Вторая строка Третья C:\Users\name\new_folder
Кодировка и декодировка
text = 'Привет, мир!'
utf8_bytes = text.encode('utf-8')
print(utf8_bytes)
decoded = utf8_bytes.decode('utf-8')
print(decoded)
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xbc\xd0\xb8\xd1\x80!' Привет, мир!
Форматирование чисел с помощью f-строк
value = 123.456789
print(f'Цена: {value:.2f} руб.')
print(f'Курс: {value:+.2f}')
print(f'Процент: {value:.1%}')
Цена: 123.46 руб. Курс: +123.46 Процент: 12345.7%
Выравнивание текста
name = 'Python'
print(f'|{name:<10}|')
print(f'|{name:>10}|')
print(f'|{name:^10}|')
|Python | | Python| | Python |
Использование translate для замены символов
trans_table = str.maketrans('abc', '123')
s = 'a b c'
print(s.translate(trans_table))
1 2 3
Работа с Unicode и эмодзи
emoji = '??'
print(len(emoji)) # длина в символах (не байтах)
print(emoji[0]) # первый символ
print(emoji.encode('unicode-escape'))
2 ? b'\\U0001f60a\\U0001f44d'
Интернирование строк и сравнение
a = 'hello' b = 'hello' print(a is b) # обычно True из-за интернирования коротких строк c = 'hello ' + 'world' d = 'hello world' print(c is d) # может быть False, строки разные объекты print(c == d) # True
True False True
Динамическое формирование имени атрибута через getattr
class Person:
name = 'Анна'
age = 30
p = Person()
attr = 'age'
print(f'Возраст: {getattr(p, attr)}')
Возраст: 30
Создание строки из байтов с указанием кодировки
byte_data = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
text = byte_data.decode('utf-8')
print(text)
Привет