Str: примеры (PYTHON)
str(object): strОсновы функции str
Функция str() в Python предназначена для создания строкового представления объекта. Это одна из встроенных функций, которая часто используется для преобразования данных различных типов в строки, что необходимо для конкатенации, форматирования вывода или сериализации.
Функция вызывается с одним обязательным аргументом – объектом, который требуется преобразовать. Она также принимает два необязательных именованных аргумента: encoding и errors. Эти параметры актуальны только при преобразовании объектов типа bytes или bytearray в строку.
- object (обязательный): Любой объект Python. Если объект не указан, возвращается пустая строка.
- encoding (необязательный): Кодировка, используемая для декодирования байтовых объектов (например, 'utf-8', 'ascii'). По умолчанию используется кодировка системы.
- errors (необязательный): Способ обработки ошибок декодирования. Возможные значения: 'strict' (вызывает UnicodeError), 'ignore', 'replace', 'backslashreplace', 'xmlcharrefreplace' и другие.
Возвращаемое значение – строка (str). Если объект является строкой, возвращается та же самая строка. Для других типов данных функция вызывает метод __str__() объекта, а если его нет – метод __repr__().
Базовые примеры использования
Преобразование различных типов данных в строку.
print(str(123))'123'
print(str(45.67))'45.67'
print(str([1, 2, 3]))'[1, 2, 3]'
Использование с байтами и указанием параметров.
byte_data = b'Hello \xd0\x9c\xd0\xb8\xd1\x80'
print(str(byte_data, encoding='utf-8', errors='replace'))'Hello Мир'
print(str(b'Test \xff', encoding='utf-8', errors='ignore'))'Test '
Похожие функции в Python
- repr(): Возвращает строку, содержащую печатаемое представление объекта. Часто эта строка выглядит как валидный код Python для воссоздания объекта. Используется для отладки.
s = 'текст'
print(repr(s))"'текст'"
- format() и f-строки: Предназначены для форматированного вывода, но также преобразуют объекты в строки в рамках заданного формата.
value = 10/3
print(f'{value:.2f}')'3.33'
- ascii(): Возвращает строку, содержащую представление объекта, в котором все не-ASCII символы экранированы. Полезна для безопасного вывода.
Функцию str() предпочтительнее использовать для общего преобразования в читаемую строку, а repr() – для отладочной информации.
Аналоги функции в других языках
- PHP: (string) или функция strval(). Преобразование происходит в контексте строки.
echo strval(123); // '123'
echo (string) [1,2]; // 'Array' (не подробное представление) - JavaScript: String() или toString(). Часто используется конкатенация с пустой строкой.
String(123); // '123'
(456).toString(); // '456'
'' + true; // 'true' - Java: String.valueOf() или метод toString() у объектов.
String.valueOf(123); // "123"
Integer.toString(456); // "456" - SQL: Функция CAST или CONVERT.
-- PostgreSQL
SELECT CAST(123 AS TEXT); -- '123' - C#: ToString() – метод, унаследованный всеми типами от Object.
123.ToString(); // "123" - Lua: tostring() – глобальная функция.
tostring(10) -- '10' - Golang: Пакет strconv, например, strconv.Itoa() для целых чисел.
s := strconv.Itoa(123) // "123" - Kotlin: toString() – метод любого объекта.
123.toString() // "123"
В отличие от Python, во многих языках преобразование в строку реализовано как метод объекта, а не как глобальная функция.
Распространенные ошибки
- Попытка преобразования объекта bytes без указания кодировки (в Python 3).
str(b'hello')"b'hello'" (Возвращается repr-представление, а не декодированная строка)
- Использование неверной кодировки для декодирования байтов, что приводит к ошибке UnicodeDecodeError.
str(b'\xff', encoding='ascii')UnicodeDecodeError: 'ascii' codec can't decode byte 0xff...
- Рекурсивный вызов __str__ в пользовательском классе.
class A:
def __str__(self):
return str(self) # Рекурсия!
print(A())RecursionError: maximum recursion depth exceeded
- Ожидание детального строкового представления для контейнеров с не-ascii символами при неявном вызове (например, в print списка). Функция print для элементов списка использует repr.
items = ['кошка', 'собака']
print(items) # Используется repr для элементов['кошка', 'собака']
Изменения в новых версиях Python
- В Python 3 функция str() стала использоваться исключительно для текстовых строк (тип unicode), в отличие от Python 2, где str представлял байтовые строки. Для работы с байтами были введены типы bytes и bytearray.
- Начиная с Python 3.4, у объектов pathlib.Path метод __str__() возвращает строковое представление пути как обычную строку, что делает использование str(path) более удобным.
- В Python 3.7 и выше улучшена производительность преобразования чисел с плавающей точкой в строку.
- В Python 3.11 были внесены внутренние оптимизации для уменьшения накладных расходов при вызове встроенных функций, включая str().
Расширенные примеры и нюансы
Работа с пользовательскими классами. Приоритет имеет метод __str__.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __str__(self):
return f'"{self.title}" by {self.author}'
def __repr__(self):
return f'Book({self.title!r}, {self.author!r})'
book = Book('1984', 'G. Orwell')
print(str(book))
print(repr(book))"1984" by G. Orwell
Book('1984', 'G. Orwell')
Использование параметра errors при декодировании.
data = b'Price: 100\xe2\x82\xac' # Евро символ в UTF-8
print(str(data, encoding='ascii', errors='replace'))
print(str(data, encoding='ascii', errors='backslashreplace'))
print(str(data, encoding='ascii', errors='xmlcharrefreplace'))Price: 100���
Price: 100\xe2\x82\xac
Price: 100€
Вызов функции без аргументов возвращает пустую строку. Это полезно для инициализации.
empty_string = str()
print(repr(empty_string))''
Преобразование логических значений.
print(str(True), str(False), sep=', ')True, False
Неявный вызов str в f-строках и методе format.
from datetime import datetime
now = datetime.now()
print(f'Сейчас: {now}') # Автоматически вызывается str(now)Сейчас: 2023-10-26 14:30:00.123456
Разница между str и repr для строк с управляющими символами.
s = 'Line1\nLine2'
print(str(s)) # Интерпретирует символ новой строки
print(repr(s)) # Показывает escape-последовательностьLine1
Line2
'Line1\nLine2'