Документация Python неофициальный перевод

stdtypes.md

3668 строк · 320.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.12/library/stdtypes.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Встроенные типы89В следующих разделах описываются стандартные типы, встроенные в интерпретатор.1011Основные встроенные типы: числовые типы, последовательности, отображения, классы, экземпляры и исключения.1213Некоторые классы коллекций являются изменяемыми. Методы, которые добавляют, удаляют или перестраивают их элементы на месте и не возвращают конкретный элемент, никогда не возвращают сам экземпляр коллекции, а `None`.1415Некоторые операции поддерживаются несколькими типами объектов; в частности, практически все объекты можно сравнивать на равенство, проверять на истинность и преобразовывать в строку (с помощью функции [`repr()`](https://python-all.ru/3.12/library/functions.html#repr) или немного отличающейся функции [`str()`](https://python-all.ru/3.12/library/stdtypes.html#str)). Последняя функция неявно используется, когда объект выводится функцией [`print()`](https://python-all.ru/3.12/library/functions.html#print).1617## Проверка на истинность1819Любой объект можно проверить на истинность для использования в условии [`if`](https://python-all.ru/3.12/reference/compound_stmts.html#if) или [`while`](https://python-all.ru/3.12/reference/compound_stmts.html#while) или в качестве операнда булевых операций, описанных ниже.2021По умолчанию объект считается истинным, если только его класс не определяет либо [`__bool__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__bool__) метод, возвращающий `False`, или [`__len__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__len__) метод, который возвращает ноль при вызове с этим объектом. [\[1\]](https://python-all.ru/3.12/library/stdtypes.html#id12) Далее перечислены основные встроенные объекты, считающиеся ложными:2223- константы, определённые как ложные: `None` и `False`24- ноль любого числового типа: `0`, `0.0`, `0j`, `Decimal(0)`, `Fraction(0, 1)`25- пустые последовательности и коллекции: `''`, `()`, `[]`, `{}`, `set()`, `range(0)`2627Операции и встроенные функции, возвращающие булев результат, всегда возвращают `0` или `False` для ложного и `1` или `True` для истинного, если не указано иное. (Важное исключение: булевы операции `or` и `and` всегда возвращают один из своих операндов.)2829## Булевы операции – `and`, `or`, `not`3031Это булевы операции в порядке возрастания приоритета:3233| Операция | Результат | Примечания |34| --- | --- | --- |35| `x or y` | если *x* истинно, то *x*, иначе *y* | (1) |36| `x and y` | если *x* ложно, то *x*, иначе *y* | (2) |37| `not x` | если *x* ложно, то `True`, иначе `False` | (3) |3839Примечания:40411. Это оператор с сокращённым вычислением: второй аргумент вычисляется, только если первый ложен.422. Это оператор с сокращённым вычислением: второй аргумент вычисляется, только если первый истинен.433. `not` имеет более низкий приоритет, чем небулевы операторы, поэтому `not a == b` интерпретируется как `not (a == b)`, а `a == not b` является синтаксической ошибкой.4445## Сравнения4647В Python есть восемь операций сравнения. Все они имеют одинаковый приоритет (выше, чем у булевых операций). Сравнения можно произвольно объединять в цепочки; например, `x < y <= z` эквивалентно `x < y and y <= z`, за исключением того, что *y* вычисляется только один раз (но в обоих случаях *z* вообще не вычисляется, если `x < y` оказывается ложным).4849В этой таблице приведены операции сравнения:5051| Операция | Значение |52| --- | --- |53| `<` | строго меньше |54| `<=` | меньше или равно |55| `>` | строго больше |56| `>=` | больше или равно |57| `==` | равно |58| `!=` | не равно |59| `is` | идентичность объектов |60| `is not` | отрицание идентичности объектов |6162Объекты разных типов, кроме разных числовых типов, никогда не считаются равными. Оператор `==` всегда определён, но для некоторых типов объектов (например, объектов-классов) он эквивалентен [`is`](https://python-all.ru/3.12/reference/expressions.html#is). Операторы `<`, `<=`, `>` и `>=` определены только там, где они имеют смысл; например, они вызывают исключение [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError), если один из аргументов – комплексное число.6364Разные экземпляры класса обычно сравниваются как неравные, если только класс не определяет метод [`__eq__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__eq__).6566Экземпляры класса нельзя упорядочить относительно других экземпляров того же класса или объектов других типов, если только класс не определяет достаточное количество методов [`__lt__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__lt__), [`__le__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__le__), [`__gt__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__gt__) и [`__ge__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__ge__) (в общем случае достаточно [`__lt__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__lt__) и [`__eq__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__eq__), если нужны традиционные значения операторов сравнения).6768Поведение операторов [`is`](https://python-all.ru/3.12/reference/expressions.html#is) и [`is not`](https://python-all.ru/3.12/reference/expressions.html#is-not) не может быть настроено; кроме того, они применимы к любым двум объектам и никогда не вызывают исключение.6970Ещё две операции с тем же синтаксическим приоритетом, [`in`](https://python-all.ru/3.12/reference/expressions.html#in) и [`not in`](https://python-all.ru/3.12/reference/expressions.html#not-in), поддерживаются типами, которые являются [итерируемыми](https://python-all.ru/3.12/glossary.html#term-iterable) или реализуют метод [`__contains__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__contains__).7172## Числовые типы – [`int`](https://python-all.ru/3.12/library/functions.html#int), [`float`](https://python-all.ru/3.12/library/functions.html#float), [`complex`](https://python-all.ru/3.12/library/functions.html#complex)7374Существует три различных числовых типа: *целые числа*, *числа с плавающей запятой* и *комплексные числа*. Кроме того, логический тип является подтипом целых чисел. Целые числа имеют неограниченную точность. Числа с плавающей запятой обычно реализуются с помощью double в C; информация о точности и внутреннем представлении чисел с плавающей запятой для машины, на которой выполняется программа, доступна в [`sys.float_info`](https://python-all.ru/3.12/library/sys.html#sys.float_info). Комплексные числа имеют действительную и мнимую части, каждая из которых является числом с плавающей запятой. Чтобы извлечь эти части из комплексного числа *z*, используйте `z.real` и `z.imag`. (Стандартная библиотека включает дополнительные числовые типы: [`fractions.Fraction`](https://python-all.ru/3.12/library/fractions.html#fractions.Fraction) для рациональных чисел и [`decimal.Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal) для чисел с плавающей запятой с определяемой пользователем точностью.)7576Числа создаются с помощью числовых литералов или как результат встроенных функций и операторов. Обычные целочисленные литералы (включая шестнадцатеричные, восьмеричные и двоичные числа) дают целые числа. Числовые литералы, содержащие десятичную точку или знак экспоненты, дают числа с плавающей запятой. Добавление `'j'` или `'J'` к числовому литералу даёт мнимое число (комплексное число с нулевой действительной частью), которое можно прибавить к целому или вещественному числу, чтобы получить комплексное число с действительной и мнимой частями.7778Python полностью поддерживает смешанную арифметику: когда бинарный арифметический оператор имеет операнды разных числовых типов, операнд с более «узким» типом расширяется до другого типа, при этом целое число уже числа с плавающей запятой, которое, в свою очередь, уже комплексного числа. Сравнение чисел разных типов ведет себя так, как если бы сравнивались точные значения этих чисел. [\[2\]](https://python-all.ru/3.12/library/stdtypes.html#id13)7980Конструкторы [`int()`](https://python-all.ru/3.12/library/functions.html#int), [`float()`](https://python-all.ru/3.12/library/functions.html#float) и [`complex()`](https://python-all.ru/3.12/library/functions.html#complex) можно использовать для создания чисел определённого типа.8182Все числовые типы (кроме комплексных) поддерживают следующие операции (о приоритетах операций см. [Приоритет операций](https://python-all.ru/3.12/reference/expressions.html#operator-summary)):8384| Операция | Результат | Примечания | Полная документация |85| --- | --- | --- | --- |86| `x + y` | сумма *x* и *y* |  |  |87| `x - y` | разность *x* и *y* |  |  |88| `x * y` | произведение *x* и *y* |  |  |89| `x / y` | частное *x* и *y* |  |  |90| `x // y` | неполное частное *x* и *y* | (1)(2) |  |91| `x % y` | остаток от `x / y` | (2) |  |92| `-x` | *x* с обратным знаком |  |  |93| `+x` | *x* без изменений |  |  |94| `abs(x)` | абсолютное значение или модуль *x* |  | [`abs()`](https://python-all.ru/3.12/library/functions.html#abs) |95| `int(x)` | *x*, преобразованное в целое число | (3)(6) | [`int()`](https://python-all.ru/3.12/library/functions.html#int) |96| `float(x)` | *x*, преобразованное в число с плавающей запятой | (4)(6) | [`float()`](https://python-all.ru/3.12/library/functions.html#float) |97| `complex(re, im)` | комплексное число с действительной частью *re* и мнимой частью *im*. *im* по умолчанию равно нулю. | (6) | [`complex()`](https://python-all.ru/3.12/library/functions.html#complex) |98| `c.conjugate()` | сопряжённое комплексного числа *c* |  |  |99| `divmod(x, y)` | пара `(x // y, x % y)` | (2) | [`divmod()`](https://python-all.ru/3.12/library/functions.html#divmod) |100| `pow(x, y)` | *x* в степени *y* | (5) | [`pow()`](https://python-all.ru/3.12/library/functions.html#pow) |101| `x ** y` | *x* в степени *y* | (5) |  |102103Примечания:1041051. Также называется целочисленным делением. Для операндов типа [`int`](https://python-all.ru/3.12/library/functions.html#int) результат имеет тип [`int`](https://python-all.ru/3.12/library/functions.html#int). Для операндов типа [`float`](https://python-all.ru/3.12/library/functions.html#float) результат имеет тип [`float`](https://python-all.ru/3.12/library/functions.html#float). В общем случае результат – целое число, хотя его тип не обязательно [`int`](https://python-all.ru/3.12/library/functions.html#int). Результат всегда округляется в сторону минус бесконечности: `1//2` равно `0`, `(-1)//2` равно `-1`, `1//(-2)` равно `-1`, а `(-1)//(-2)` равно `0`.1062. Не для комплексных чисел. Вместо этого преобразуйте в числа с плавающей запятой с помощью [`abs()`](https://python-all.ru/3.12/library/functions.html#abs), если это уместно.1073. Преобразование из [`float`](https://python-all.ru/3.12/library/functions.html#float) в [`int`](https://python-all.ru/3.12/library/functions.html#int) усекает, отбрасывая дробную часть. См. функции [`math.floor()`](https://python-all.ru/3.12/library/math.html#math.floor) и [`math.ceil()`](https://python-all.ru/3.12/library/math.html#math.ceil) для альтернативных преобразований.1084. float также принимает строки “nan” и “inf” с необязательным префиксом “+” или “-” для Not a Number (NaN) и положительной или отрицательной бесконечности.1095. Python определяет `pow(0, 0)` и `0 ** 0` как `1`, что общепринято для языков программирования.1106. Принимаемые числовые литералы включают цифры от `0` до `9` или любой эквивалент в Unicode (кодовые точки со свойством `Nd`).111112   См. [стандарт Unicode](https://python-all.ru/3.12/library/stdtypes.html) для полного списка кодовых точек со свойством `Nd`.113114Все типы [`numbers.Real`](https://python-all.ru/3.12/library/numbers.html#numbers.Real) ([`int`](https://python-all.ru/3.12/library/functions.html#int) и [`float`](https://python-all.ru/3.12/library/functions.html#float)) также включают следующие операции:115116| Операция | Результат |117| --- | --- |118| [`math.trunc(x)`](https://python-all.ru/3.12/library/math.html#math.trunc) | *x*, усечённое до [`Integral`](https://python-all.ru/3.12/library/numbers.html#numbers.Integral) |119| [`round(x[, n])`](https://python-all.ru/3.12/library/functions.html#round) | *x*, округлённое до *n* знаков, с округлением до ближайшего чётного. Если *n* опущено, по умолчанию равно 0. |120| [`math.floor(x)`](https://python-all.ru/3.12/library/math.html#math.floor) | наибольшее [`Integral`](https://python-all.ru/3.12/library/numbers.html#numbers.Integral) \<= *x* |121| [`math.ceil(x)`](https://python-all.ru/3.12/library/math.html#math.ceil) | наименьшее [`Integral`](https://python-all.ru/3.12/library/numbers.html#numbers.Integral) \>= *x* |122123За дополнительными числовыми операциями обращайтесь к модулям [`math`](https://python-all.ru/3.12/library/math.html#module-math) и [`cmath`](https://python-all.ru/3.12/library/cmath.html#module-cmath).124125### Побитовые операции над целыми типами126127Побитовые операции имеют смысл только для целых чисел. Результат побитовых операций вычисляется так, как если бы они выполнялись в дополнительном коде с бесконечным количеством знаковых битов.128129Приоритеты двоичных побитовых операций ниже, чем у числовых операций, и выше, чем у сравнений; унарная операция `~` имеет тот же приоритет, что и другие унарные числовые операции (`+` и `-`).130131В этой таблице перечислены побитовые операции, отсортированные по возрастанию приоритета:132133| Операция | Результат | Примечания |134| --- | --- | --- |135| `x \| y` | побитовое *ИЛИ* для *x* и *y* | (4) |136| `x ^ y` | побитовое *исключающее ИЛИ* для *x* и *y* | (4) |137| `x & y` | побитовое *И* для *x* и *y* | (4) |138| `x << n` | *x*, сдвинутое влево на *n* битов | (1)(2) |139| `x >> n` | *x*, сдвинутое вправо на *n* битов | (1)(3) |140| `~x` | инвертированные биты *x* |  |141142Примечания:1431441. Отрицательные значения сдвига недопустимы и вызывают [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError).1452. Сдвиг влево на *n* битов эквивалентен умножению на `pow(2, n)`.1463. Сдвиг вправо на *n* битов эквивалентен целочисленному делению на `pow(2, n)`.1474. Выполнение этих вычислений с хотя бы одним дополнительным битом знакового расширения в конечном дополнительном коде (рабочая разрядность `1 + max(x.bit_length(), y.bit_length())` или более) достаточно для получения того же результата, как если бы было бесконечное количество знаковых битов.148149### Дополнительные методы для целых типов150151Тип int реализует [`numbers.Integral`](https://python-all.ru/3.12/library/numbers.html#numbers.Integral) [абстрактный базовый класс](https://python-all.ru/3.12/glossary.html#term-abstract-base-class). Кроме того, он предоставляет ещё несколько методов:152153#### `int.bit_length()`154155Возвращает количество битов, необходимое для представления целого числа в двоичном виде, без учёта знака и ведущих нулей:156157```python158>>> n = -37159>>> bin(n)160'-0b100101'161>>> n.bit_length()1626163```164165Более точно, если `x` ненулевое, то `x.bit_length()` – это единственное положительное целое `k`, такое что `2**(k-1) <= abs(x) < 2**k`. Эквивалентно, когда `abs(x)` достаточно мало, чтобы иметь правильно округлённый логарифм, то `k = 1 + int(log(abs(x), 2))`. Если `x` равно нулю, то `x.bit_length()` возвращает `0`.166167Эквивалентно следующему:168169```python170def bit_length(self):171    s = bin(self)       # двоичное представление:  bin(-37) --> '-0b100101'172    s = s.lstrip('-0b') # удалить ведущие нули и знак минус173    return len(s)       # len('100101') --> 6174```175176Добавлено в версии 3.1.177178#### `int.bit_count()`179180Возвращает количество единиц в двоичном представлении абсолютного значения целого числа. Также известно как population count. Пример:181182```python183>>> n = 19184>>> bin(n)185'0b10011'186>>> n.bit_count()1873188>>> (-n).bit_count()1893190```191192Эквивалентно следующему:193194```python195def bit_count(self):196    return bin(self).count("1")197```198199Добавлено в версии 3.10.200201#### `int.to_bytes(length=1, byteorder='big', *, signed=False)`202203Возвращает массив байтов, представляющий целое число.204205```python206>>> (1024).to_bytes(2, byteorder='big')207b'\x04\x00'208>>> (1024).to_bytes(10, byteorder='big')209b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'210>>> (-1024).to_bytes(10, byteorder='big', signed=True)211b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'212>>> x = 1000213>>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little')214b'\xe8\x03'215```216217Целое число представляется с использованием *length* байтов, по умолчанию – 1. Если целое число невозможно представить заданным количеством байтов, вызывается исключение [`OverflowError`](https://python-all.ru/3.12/library/exceptions.html#OverflowError).218219Аргумент *byteorder* определяет порядок байтов для представления целого числа, по умолчанию – `"big"`. Если *byteorder* равен `"big"`, старший байт находится в начале массива байтов. Если *byteorder* равен `"little"`, старший байт находится в конце массива байтов.220221Аргумент *signed* определяет, используется ли дополнительный код для представления целого числа. Если *signed* равен `False` и передано отрицательное целое число, вызывается исключение [`OverflowError`](https://python-all.ru/3.12/library/exceptions.html#OverflowError). Значение по умолчанию для *signed*`False`.222223Значения по умолчанию можно использовать для удобного преобразования целого числа в однобайтовый объект:224225```python226>>> (65).to_bytes()227b'A'228```229230Однако при использовании аргументов по умолчанию не следует пытаться преобразовать значение больше 255, иначе будет вызвано исключение [`OverflowError`](https://python-all.ru/3.12/library/exceptions.html#OverflowError).231232Эквивалентно следующему:233234```python235def to_bytes(n, length=1, byteorder='big', signed=False):236    if byteorder == 'little':237        order = range(length)238    elif byteorder == 'big':239        order = reversed(range(length))240    else:241        raise ValueError("byteorder must be either 'little' or 'big'")242243    return bytes((n >> i*8) & 0xff for i in order)244```245246Добавлено в версии 3.2.247248Изменено в версии 3.11: Добавлены значения аргументов по умолчанию для `length` и `byteorder`.249250#### `classmethod int.from_bytes(bytes, byteorder='big', *, signed=False)`251252Возвращает целое число, представленное заданным массивом байтов.253254```python255>>> int.from_bytes(b'\x00\x10', byteorder='big')25616257>>> int.from_bytes(b'\x00\x10', byteorder='little')2584096259>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)260-1024261>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)26264512263>>> int.from_bytes([255, 0, 0], byteorder='big')26416711680265```266267Аргумент *bytes* должен быть либо [bytes-подобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object), либо итерабельным объектом, производящим байты.268269Аргумент *byteorder* определяет порядок байтов для представления целого числа, по умолчанию – `"big"`. Если *byteorder* равен `"big"`, старший байт находится в начале массива байтов. Если *byteorder* равен `"little"`, старший байт находится в конце массива байтов. Чтобы использовать собственный порядок байтов хост-системы, укажите [`sys.byteorder`](https://python-all.ru/3.12/library/sys.html#sys.byteorder) в качестве значения порядка байтов.270271Аргумент *signed* указывает, используется ли дополнительный код для представления целого числа.272273Эквивалентно следующему:274275```python276def from_bytes(bytes, byteorder='big', signed=False):277    if byteorder == 'little':278        little_ordered = list(bytes)279    elif byteorder == 'big':280        little_ordered = list(reversed(bytes))281    else:282        raise ValueError("byteorder must be either 'little' or 'big'")283284    n = sum(b << i*8 for i, b in enumerate(little_ordered))285    if signed and little_ordered and (little_ordered[-1] & 0x80):286        n -= 1 << 8*len(little_ordered)287288    return n289```290291Добавлено в версии 3.2.292293Изменено в версии 3.11: Добавлено значение аргумента по умолчанию для `byteorder`.294295#### `int.as_integer_ratio()`296297Возвращает пару целых чисел, отношение которых равно исходному целому числу, и знаменатель положителен. Целочисленное отношение целых чисел всегда представляет собой само целое число в качестве числителя и `1` в качестве знаменателя.298299Добавлено в версии 3.8.300301#### `int.is_integer()`302303Возвращает `True`. Существует для совместимости с утиной типизацией с [`float.is_integer()`](https://python-all.ru/3.12/library/stdtypes.html#float.is_integer).304305Добавлено в версии 3.12.306307### Дополнительные методы float308309Тип float реализует [`numbers.Real`](https://python-all.ru/3.12/library/numbers.html#numbers.Real) [абстрактный базовый класс](https://python-all.ru/3.12/glossary.html#term-abstract-base-class). Кроме того, float имеет следующие дополнительные методы.310311#### `float.as_integer_ratio()`312313Возвращает пару целых чисел, отношение которых точно равно исходному числу с плавающей запятой. Отношение представлено в несократимом виде и имеет положительный знаменатель. Вызывает [`OverflowError`](https://python-all.ru/3.12/library/exceptions.html#OverflowError) для бесконечности и [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) для NaN.314315#### `float.is_integer()`316317Возвращает `True`, если экземпляр float является конечным и имеет целочисленное значение, и `False` в противном случае:318319```python320>>> (-2.0).is_integer()321True322>>> (3.2).is_integer()323False324```325326Два метода поддерживают преобразование в шестнадцатеричные строки и обратно. Поскольку числа с плавающей запятой в Python внутренне хранятся в двоичном виде, преобразование числа с плавающей запятой в строку *decimal* и обратно обычно связано с небольшой ошибкой округления. Напротив, шестнадцатеричные строки позволяют точно представлять и задавать числа с плавающей запятой. Это может быть полезно при отладке и в численных расчётах.327328#### `float.hex()`329330Возвращает представление числа с плавающей запятой в виде шестнадцатеричной строки. Для конечных чисел с плавающей запятой это представление всегда будет содержать ведущий `0x` и завершающий `p` и экспоненту.331332#### `classmethod float.fromhex(s)`333334Метод класса, возвращающий число с плавающей запятой, представленное шестнадцатеричной строкой *s*. Строка *s* может содержать начальные и конечные пробелы.335336Обратите внимание, что [`float.hex()`](https://python-all.ru/3.12/library/stdtypes.html#float.hex) – это метод экземпляра, а [`float.fromhex()`](https://python-all.ru/3.12/library/stdtypes.html#float.fromhex) – метод класса.337338Шестнадцатеричная строка имеет вид:339340```python341[sign] ['0x'] integer ['.' fraction] ['p' exponent]342```343344где необязательный `sign` может быть либо `+`, либо `-`, `integer` и `fraction` – строки шестнадцатеричных цифр, а `exponent` – десятичное целое с необязательным ведущим знаком. Регистр не имеет значения, и должна быть хотя бы одна шестнадцатеричная цифра в целой части либо в дробной. Этот синтаксис похож на синтаксис, указанный в разделе 6.4.4.2 стандарта C99, а также на синтаксис, используемый в Java 1.5 и выше. В частности, результат [`float.hex()`](https://python-all.ru/3.12/library/stdtypes.html#float.hex) может использоваться как шестнадцатеричный литерал с плавающей запятой в коде C или Java, а шестнадцатеричные строки, созданные символом формата `%a` в C или `Double.toHexString` в Java, принимаются [`float.fromhex()`](https://python-all.ru/3.12/library/stdtypes.html#float.fromhex).345346Обратите внимание, что экспонента записывается в десятичном, а не шестнадцатеричном виде, и что она указывает степень двойки, на которую умножается коэффициент. Например, шестнадцатеричная строка `0x3.a7p10` представляет число с плавающей запятой `(3 + 10./16 + 7./16**2) * 2.0**10`, или `3740.0`:347348```python349>>> float.fromhex('0x3.a7p10')3503740.0351```352353Применение обратного преобразования к `3740.0` даёт другую шестнадцатеричную строку, представляющую то же число:354355```python356>>> float.hex(3740.0)357'0x1.d380000000000p+11'358```359360### Хеширование числовых типов361362Для чисел `x` и `y`, возможно разных типов, требуется, чтобы `hash(x) == hash(y)` всякий раз, когда `x == y` (см. документацию метода [`__hash__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__hash__) для подробностей). Для простоты реализации и эффективности для различных числовых типов (включая [`int`](https://python-all.ru/3.12/library/functions.html#int), [`float`](https://python-all.ru/3.12/library/functions.html#float), [`decimal.Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal) и [`fractions.Fraction`](https://python-all.ru/3.12/library/fractions.html#fractions.Fraction)) хеш Python для числовых типов основан на одной математической функции, определённой для любого рационального числа, и, следовательно, применим ко всем экземплярам [`int`](https://python-all.ru/3.12/library/functions.html#int) и [`fractions.Fraction`](https://python-all.ru/3.12/library/fractions.html#fractions.Fraction), а также ко всем конечным экземплярам [`float`](https://python-all.ru/3.12/library/functions.html#float) и [`decimal.Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal). По существу, эта функция задаётся приведением по модулю `P` для фиксированного простого числа `P`. Значение `P` доступно в Python как атрибут [`modulus`](https://python-all.ru/3.12/library/sys.html#sys.hash_info.modulus) объекта [`sys.hash_info`](https://python-all.ru/3.12/library/sys.html#sys.hash_info).363364**Деталь реализации CPython:** В настоящее время используется простое число `P = 2**31 - 1` на машинах с 32-битными C longs и `P = 2**61 - 1` на машинах с 64-битными C longs.365366Вот подробные правила:367368- Если `x = m / n` – неотрицательное рациональное число и `n` не делится на `P`, определим `hash(x)` как `m * invmod(n, P) % P`, где `invmod(n, P)` даёт обратное к `n` по модулю `P`.369- Если `x = m / n` – неотрицательное рациональное число и `n` делится на `P` (но `m` не делится), то `n` не имеет обратного по модулю `P`, и вышеуказанное правило не применяется; в этом случае определим `hash(x)` как константу `sys.hash_info.inf`.370- Если `x = m / n` – отрицательное рациональное число, определим `hash(x)` как `-hash(-x)`. Если полученный хеш равен `-1`, заменим его на `-2`.371- Конкретные значения `sys.hash_info.inf` и `-sys.hash_info.inf` используются как хеши для положительной бесконечности и отрицательной бесконечности (соответственно).372- Для комплексного числа [`complex`](https://python-all.ru/3.12/library/functions.html#complex) `z` хеши действительной и мнимой частей объединяются вычислением `hash(z.real) + sys.hash_info.imag * hash(z.imag)`, приведённым по модулю `2**sys.hash_info.width` так, чтобы результат находился в `range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))`. Снова, если результат равен `-1`, он заменяется на `-2`.373374Для пояснения вышеуказанных правил приведём пример кода Python, эквивалентного встроенной функции hash, для вычисления хеша рационального числа, [`float`](https://python-all.ru/3.12/library/functions.html#float) или [`complex`](https://python-all.ru/3.12/library/functions.html#complex):375376```python377import sys, math378379def hash_fraction(m, n):380    """Вычислить хеш рационального числа m / n.381382    Предполагается, что m и n – целые числа, n положительное.383    Эквивалентно hash(fractions.Fraction(m, n)).384385    """386    P = sys.hash_info.modulus387    # Удалить общие делители P.  (Необязательно, если m и n уже взаимно просты.)388    while m % P == n % P == 0:389        m, n = m // P, n // P390391    if n % P == 0:392        hash_value = sys.hash_info.inf393    else:394        # Малая теорема Ферма: pow(n, P-1, P) равно 1, поэтому395        # pow(n, P-2, P) даёт обратный элемент n по модулю P.396        hash_value = (abs(m) % P) * pow(n, P - 2, P) % P397    if m < 0:398        hash_value = -hash_value399    if hash_value == -1:400        hash_value = -2401    return hash_value402403def hash_float(x):404    """Вычислить хеш числа с плавающей запятой x."""405406    if math.isnan(x):407        return object.__hash__(x)408    elif math.isinf(x):409        return sys.hash_info.inf if x > 0 else -sys.hash_info.inf410    else:411        return hash_fraction(*x.as_integer_ratio())412413def hash_complex(z):414    """Вычислить хеш комплексного числа z."""415416    hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)417    # выполнить знаковое приведение по модулю 2**sys.hash_info.width418    M = 2**(sys.hash_info.width - 1)419    hash_value = (hash_value & (M - 1)) - (hash_value & M)420    if hash_value == -1:421        hash_value = -2422    return hash_value423```424425## Булев тип - [`bool`](https://python-all.ru/3.12/library/functions.html#bool)426427Булевы значения представляют истинностные значения. Тип [`bool`](https://python-all.ru/3.12/library/functions.html#bool) имеет ровно два константных экземпляра: `True` и `False`.428429Встроенная функция [`bool()`](https://python-all.ru/3.12/library/functions.html#bool) преобразует любое значение в булево, если значение можно интерпретировать как истинностное (см. раздел [Проверка истинности значений](https://python-all.ru/3.12/library/stdtypes.html#truth) выше).430431Для логических операций используйте [логические операторы](https://python-all.ru/3.12/library/stdtypes.html#boolean) `and`, `or` и `not`. При применении побитовых операторов `&`, `|`, `^` к двум булевым значениям они возвращают bool, эквивалентный логическим операциям «and», «or», «xor». Однако логические операторы `and`, `or` и `!=` следует предпочитать `&`, `|` и `^`.432433Устарело с версии 3.12: Использование оператора побитовой инверсии `~` устарело и вызовет ошибку в Python 3.16.434435[`bool`](https://python-all.ru/3.12/library/functions.html#bool) является подклассом [`int`](https://python-all.ru/3.12/library/functions.html#int) (см. [Числовые типы – int, float, complex](https://python-all.ru/3.12/library/stdtypes.html#typesnumeric)). В многих числовых контекстах `False` и `True` ведут себя как целые числа 0 и 1 соответственно. Однако полагаться на это не рекомендуется; вместо этого используйте явное преобразование с помощью [`int()`](https://python-all.ru/3.12/library/functions.html#int).436437## Типы итераторов438439Python поддерживает концепцию итерации по контейнерам. Это реализовано с помощью двух различных методов; они используются, чтобы позволить пользовательским классам поддерживать итерацию. Последовательности, описанные ниже более подробно, всегда поддерживают методы итерации.440441Для контейнерных объектов необходимо определить один метод, чтобы обеспечить поддержку [итерируемости](https://python-all.ru/3.12/glossary.html#term-iterable):442443#### `container.__iter__()`444445Возвращает объект [итератора](https://python-all.ru/3.12/glossary.html#term-iterator). Объект должен поддерживать протокол итератора, описанный ниже. Если контейнер поддерживает разные типы итерации, можно предоставить дополнительные методы для запроса итераторов этих типов. (Пример объекта, поддерживающего несколько форм итерации – древовидная структура, поддерживающая обход как в ширину, так и в глубину.) Этот метод соответствует слоту [`tp_iter`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_iter) структуры типа для объектов Python в Python/C API.446447Сами объекты итераторов должны поддерживать следующие два метода, которые вместе образуют *протокол итератора*:448449#### `iterator.__iter__()`450451Возвращает сам объект [итератора](https://python-all.ru/3.12/glossary.html#term-iterator). Это необходимо, чтобы и контейнеры, и итераторы можно было использовать с операторами [`for`](https://python-all.ru/3.12/reference/compound_stmts.html#for) и [`in`](https://python-all.ru/3.12/reference/expressions.html#in). Этот метод соответствует слоту [`tp_iter`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_iter) структуры типа для объектов Python в Python/C API.452453#### `iterator.__next__()`454455Возвращает следующий элемент из [итератора](https://python-all.ru/3.12/glossary.html#term-iterator). Если элементов больше нет, вызывает исключение [`StopIteration`](https://python-all.ru/3.12/library/exceptions.html#StopIteration). Этот метод соответствует слоту [`tp_iternext`](https://python-all.ru/3.12/c-api/typeobj.html#c.PyTypeObject.tp_iternext) структуры типа для объектов Python в Python/C API.456457Python определяет несколько объектов итераторов для поддержки итерации по общим и специфическим типам последовательностей, словарям и другим более специализированным формам. Конкретные типы не важны, кроме их реализации протокола итератора.458459Как только метод [`__next__()`](https://python-all.ru/3.12/library/stdtypes.html#iterator.__next__) итератора вызывает [`StopIteration`](https://python-all.ru/3.12/library/exceptions.html#StopIteration), он должен продолжать делать это при последующих вызовах. Реализации, не соблюдающие это свойство, считаются некорректными.460461### Типы генераторов462463[Генераторы](https://python-all.ru/3.12/glossary.html#term-generator) Python предоставляют удобный способ реализации протокола итератора. Если метод [`__iter__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__iter__) объекта контейнера реализован как генератор, он автоматически вернет объект итератора (технически объект генератора), предоставляющий методы [`__iter__()`](https://python-all.ru/3.12/library/stdtypes.html#iterator.__iter__) и [`__next__()`](https://python-all.ru/3.12/reference/expressions.html#generator.__next__). Дополнительную информацию о генераторах можно найти в [документации по yield expression](https://python-all.ru/3.12/reference/expressions.html#yieldexpr).464465## Типы последовательностей – [`list`](https://python-all.ru/3.12/library/stdtypes.html#list), [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple), [`range`](https://python-all.ru/3.12/library/stdtypes.html#range)466467Существуют три основных типа последовательностей: списки, кортежи и объекты range. Дополнительные типы последовательностей, предназначенные для обработки [двоичных данных](https://python-all.ru/3.12/library/stdtypes.html#binaryseq) и [текстовых строк](https://python-all.ru/3.12/library/stdtypes.html#textseq), описаны в отдельных разделах.468469### Общие операции с последовательностями470471Операции, перечисленные в следующей таблице, поддерживаются большинством типов последовательностей, как изменяемых, так и неизменяемых. ABC [`collections.abc.Sequence`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Sequence) предоставляется, чтобы упростить корректную реализацию этих операций в пользовательских типах последовательностей.472473В этой таблице перечислены операции с последовательностями, отсортированные по возрастанию приоритета. В таблице *s* и *t* – последовательности одного типа, *n*, *i*, *j* и *k* – целые числа, а *x* – произвольный объект, удовлетворяющий любым ограничениям на тип и значение, накладываемым *s*.474475Операции `in` и `not in` имеют тот же приоритет, что и операции сравнения. Операции `+` (конкатенация) и `*` (повторение) имеют тот же приоритет, что и соответствующие числовые операции. [\[3\]](https://python-all.ru/3.12/library/stdtypes.html#id14)476477| Операция | Результат | Примечания |478| --- | --- | --- |479| `x in s` | `True`, если элемент последовательности *s* равен *x*, иначе `False` | (1) |480| `x not in s` | `False`, если элемент последовательности *s* равен *x*, иначе `True` | (1) |481| `s + t` | конкатенация *s* и *t* | (6)(7) |482| `s * n` или `n * s` | эквивалентно сложению *s* с собой *n* раз | (2)(7) |483| `s[i]` | *i*-й элемент *s*, начиная с 0 | (3) |484| `s[i:j]` | срез *s* от *i* до *j* | (3)(4) |485| `s[i:j:k]` | срез *s* от *i* до *j* с шагом *k* | (3)(5) |486| `len(s)` | длина *s* |  |487| `min(s)` | наименьший элемент *s* |  |488| `max(s)` | наибольший элемент *s* |  |489| `s.index(x[, i[, j]])` | индекс первого вхождения *x* в *s* (начиная с индекса *i* и до индекса *j*) | (8) |490| `s.count(x)` | общее количество вхождений *x* в *s* |  |491492Последовательности одного типа также поддерживают сравнения. В частности, кортежи и списки сравниваются лексикографически путём сравнения соответствующих элементов. Это означает, что для равенства каждый элемент должен быть равен, а две последовательности должны быть одного типа и иметь одинаковую длину. (Полные подробности см. в [Comparisons](https://python-all.ru/3.12/reference/expressions.html#comparisons) в справочнике по языку.)493494Прямые и обратные итераторы по изменяемым последовательностям обращаются к значениям по индексу. Этот индекс будет продолжать двигаться вперёд (или назад), даже если базовая последовательность изменяется. Итератор завершается только при возникновении [`IndexError`](https://python-all.ru/3.12/library/exceptions.html#IndexError) или [`StopIteration`](https://python-all.ru/3.12/library/exceptions.html#StopIteration) (или когда индекс становится меньше нуля).495496Примечания:4974981. Хотя операции `in` и `not in` в общем случае используются только для простой проверки на вхождение, некоторые специализированные последовательности (например, [`str`](https://python-all.ru/3.12/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray)) также используют их для проверки на подпоследовательность:499500   ```python501   >>> "gg" in "eggs"502   True503   ```5042. Значения *n* меньше `0` трактуются как `0` (что даёт пустую последовательность того же типа, что и *s*). Обратите внимание: элементы последовательности *s* не копируются; на них ссылаются многократно. Это часто преследует начинающих программистов Python; рассмотрите:505506   ```python507   >>> lists = [[]] * 3508   >>> lists509   [[], [], []]510   >>> lists[0].append(3)511   >>> lists512   [[3], [3], [3]]513   ```514515   Произошло следующее: `[[]]` – это список из одного элемента, содержащего пустой список, поэтому все три элемента `[[]] * 3` являются ссылками на этот единственный пустой список. Изменение любого из элементов `lists` изменяет этот единственный список. Создать список из разных списков можно так:516517   ```python518   >>> lists = [[] for i in range(3)]519   >>> lists[0].append(3)520   >>> lists[1].append(5)521   >>> lists[2].append(7)522   >>> lists523   [[3], [5], [7]]524   ```525526   Подробное объяснение доступно в разделе FAQ [Как создать многомерный список?](https://python-all.ru/3.12/faq/programming.html#faq-multidimensional-list).5273. Если *i* или *j* отрицательное, индекс отсчитывается от конца последовательности *s*: подставляется `len(s) + i` или `len(s) + j`. Но обратите внимание: `-0` по-прежнему равно `0`.5284. Срез *s* от *i* до *j* определяется как последовательность элементов с индексом *k*, для которых `i <= k < j`. Если *i* или *j* больше `len(s)`, используйте `len(s)`. Если *i* опущен или равен `None`, используйте `0`. Если *j* опущен или равен `None`, используйте `len(s)`. Если *i* больше или равно *j*, срез пуст.5295. The slice of *s* from *i* to *j* with step *k* is defined as the sequence of items with index `x = i + n*k` such that `0 <= n < (j-i)/k`. In other words, the indices are `i`, `i+k`, `i+2*k`, `i+3*k` and so on, stopping when *j* is reached (but never including *j*). When *k* is positive, *i* and *j* are reduced to `len(s)` if they are greater. When *k* is negative, *i* and *j* are reduced to `len(s) - 1` if they are greater. If *i* or *j* are omitted or `None`, they become “end” values (which end depends on the sign of *k*). Note, *k* cannot be zero. If *k* is `None`, it is treated like `1`.5306. Конкатенация неизменяемых последовательностей всегда приводит к созданию нового объекта. Это означает, что построение последовательности путём многократной конкатенации будет иметь квадратичную временную сложность от общей длины последовательности. Чтобы получить линейную сложность, следует перейти к одному из следующих вариантов:531532   - при конкатенации объектов [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) можно собрать список, а затем использовать [`str.join()`](https://python-all.ru/3.12/library/stdtypes.html#str.join) в конце или же записывать данные в экземпляр [`io.StringIO`](https://python-all.ru/3.12/library/io.html#io.StringIO) и получить его значение по завершении533   - при конкатенации объектов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) можно аналогично использовать [`bytes.join()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.join) или [`io.BytesIO`](https://python-all.ru/3.12/library/io.html#io.BytesIO), либо выполнять конкатенацию на месте с объектом [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray). Объекты [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray) являются изменяемыми и обладают эффективным механизмом предварительного выделения памяти534   - при конкатенации объектов [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple) лучше расширять объект [`list`](https://python-all.ru/3.12/library/stdtypes.html#list)535   - для других типов – изучите документацию соответствующего класса5367. Некоторые типы последовательностей (например, [`range`](https://python-all.ru/3.12/library/stdtypes.html#range)) поддерживают только такие последовательности элементов, которые подчиняются определённым шаблонам, и поэтому не поддерживают конкатенацию или повторение последовательностей.5378. `index` вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если *x* не найден в *s*. Не все реализации поддерживают передачу дополнительных аргументов *i* и *j*. Эти аргументы позволяют эффективно искать подстроки последовательности. Передача дополнительных аргументов примерно эквивалентна использованию `s[i:j].index(x)`, но без копирования данных и с возвращаемым индексом относительно начала последовательности, а не начала среза.538539### Неизменяемые типы последовательностей540541Единственная операция, которую неизменяемые последовательности обычно реализуют, но которой нет у изменяемых, – это поддержка встроенной функции [`hash()`](https://python-all.ru/3.12/library/functions.html#hash).542543Эта поддержка позволяет использовать неизменяемые последовательности, такие как экземпляры [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple), в качестве ключей [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict) и хранить их в экземплярах [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset).544545Попытка вычислить хеш неизменяемой последовательности, содержащей нехешируемые значения, приведёт к [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError).546547### Изменяемые типы последовательностей548549В следующей таблице приведены операции, определённые для изменяемых типов последовательностей. ABC [`collections.abc.MutableSequence`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.MutableSequence) предоставляется для упрощения корректной реализации этих операций в пользовательских типах последовательностей.550551В таблице *s* – экземпляр изменяемого типа последовательности, *t* – любой итерируемый объект, а *x* – произвольный объект, удовлетворяющий всем ограничениям по типу и значению, накладываемым *s* (например, [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray) принимает только целые числа, удовлетворяющие ограничению по значению `0 <= x <= 255`).552553| Операция | Результат | Примечания |554| --- | --- | --- |555| `s[i] = x` | элемент *i* из *s* заменяется на *x* |  |556| `s[i:j] = t` | срез *s* от *i* до *j* заменяется содержимым итерируемого объекта *t* |  |557| `del s[i:j]` | то же, что и `s[i:j] = []` |  |558| `s[i:j:k] = t` | элементы `s[i:j:k]` заменяются элементами из *t* | (1) |559| `del s[i:j:k]` | удаляет элементы `s[i:j:k]` из списка |  |560| `s.append(x)` | добавляет *x* в конец последовательности (то же, что `s[len(s):len(s)] = [x]`) |  |561| `s.clear()` | удаляет все элементы из *s* (то же, что `del s[:]`) | (5) |562| `s.copy()` | создаёт поверхностную копию *s* (то же, что `s[:]`) | (5) |563| `s.extend(t)` или `s += t` | расширяет *s* содержимым *t* (в основном то же, что и `s[len(s):len(s)] = t`) |  |564| `s *= n` | обновляет *s*, повторяя его содержимое *n* раз | (6) |565| `s.insert(i, x)` | вставляет *x* в *s* по индексу *i* (то же, что `s[i:i] = [x]`) |  |566| `s.pop()` или `s.pop(i)` | извлекает элемент по индексу *i* и удаляет его из *s* | (2) |567| `s.remove(x)` | удаляет первый элемент из *s*, для которого `s[i]` равно *x* | (3) |568| `s.reverse()` | переворачивает элементы *s* на месте | (4) |569570Примечания:5715721. Если *k* не равно `1`, то *t* должно иметь ту же длину, что и заменяемый срез.5732. Необязательный аргумент *i* по умолчанию равен `-1`, поэтому по умолчанию удаляется и возвращается последний элемент.5743. `remove()` вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если *x* не найден в *s*.5754. Метод `reverse()` изменяет последовательность на месте для экономии памяти при обращении большой последовательности. Чтобы напомнить пользователям, что он работает с побочным эффектом, он не возвращает обращённую последовательность.5765. `clear()` и `copy()` включены для согласованности с интерфейсами изменяемых контейнеров, которые не поддерживают операции среза (таких как [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict) и [`set`](https://python-all.ru/3.12/library/stdtypes.html#set)). `copy()` не является частью абстрактного базового класса [`collections.abc.MutableSequence`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.MutableSequence), но большинство конкретных классов изменяемых последовательностей его предоставляют.577578   Добавлено в версии 3.3: методы `clear()` и `copy()`.5796. Значение *n* – целое число или объект, реализующий [`__index__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__index__). Нулевые и отрицательные значения *n* очищают последовательность. Элементы последовательности не копируются; на них делаются множественные ссылки, как описано для `s * n` в разделе [Общие операции с последовательностями](https://python-all.ru/3.12/library/stdtypes.html#typesseq-common).580581### Списки582583Списки – это изменяемые последовательности, обычно используемые для хранения коллекций однородных элементов (степень однородности может варьироваться в зависимости от приложения).584585#### `class list([iterable])`586587Списки можно создать несколькими способами:588589- Используя пару квадратных скобок для обозначения пустого списка: `[]`590- Используя квадратные скобки, разделяя элементы запятыми: `[a]`, `[a, b, c]`591- Используя списковое включение: `[x for x in iterable]`592- Используя конструктор типа: `list()` или `list(iterable)`593594Конструктор создаёт список, элементы которого совпадают с элементами *итерируемого объекта* и располагаются в том же порядке. *Итерируемый объект* может быть последовательностью, контейнером, поддерживающим итерацию, или итератором. Если *итерируемый объект* уже является списком, создаётся и возвращается его копия (аналогично `iterable[:]`). Например, `list('abc')` возвращает `['a', 'b', 'c']`, а `list( (1, 2, 3) )` возвращает `[1, 2, 3]`. Если аргумент не указан, конструктор создаёт новый пустой список – `[]`.595596Многие другие операции также создают списки, включая встроенную функцию [`sorted()`](https://python-all.ru/3.12/library/functions.html#sorted).597598Списки реализуют все [общие](https://python-all.ru/3.12/library/stdtypes.html#typesseq-common) и [изменяемые](https://python-all.ru/3.12/library/stdtypes.html#typesseq-mutable) операции последовательностей. Списки также предоставляют следующий дополнительный метод:599600#### `sort(*, key=None, reverse=False)`601602Этот метод сортирует список на месте, используя только `<` сравнений между элементами. Исключения не подавляются – если какая-либо операция сравнения завершится ошибкой, вся сортировка завершится ошибкой (и список, скорее всего, останется в частично изменённом состоянии).603604[`sort()`](https://python-all.ru/3.12/library/stdtypes.html#list.sort) принимает два аргумента, которые могут быть переданы только по ключевому слову ([аргументы только по ключевому слову](https://python-all.ru/3.12/glossary.html#keyword-only-parameter)):605606*key* задаёт функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента списка (например, `key=str.lower`). Ключ для каждого элемента списка вычисляется один раз и затем используется для всего процесса сортировки. Значение по умолчанию `None` означает, что элементы списка сортируются напрямую, без вычисления отдельного ключа.607608Утилита [`functools.cmp_to_key()`](https://python-all.ru/3.12/library/functools.html#functools.cmp_to_key) позволяет преобразовать функцию сравнения *cmp* в стиле 2.x в функцию *key*.609610*reverse* – булево значение. Если установлено в `True`, то элементы списка сортируются так, как если бы каждое сравнение было обратным.611612Этот метод изменяет последовательность на месте для экономии памяти при сортировке большой последовательности. Чтобы напомнить пользователям, что он работает с побочным эффектом, он не возвращает отсортированную последовательность (используйте [`sorted()`](https://python-all.ru/3.12/library/functions.html#sorted) для явного запроса нового отсортированного списка).613614Метод [`sort()`](https://python-all.ru/3.12/library/stdtypes.html#list.sort) гарантированно устойчив. Сортировка называется устойчивой, если она не меняет относительный порядок элементов, которые считаются равными – это полезно при многоэтапной сортировке (например, сначала по отделу, затем по уровню зарплаты).615616Примеры сортировки и краткое руководство по сортировке см. в [Методы сортировки](https://python-all.ru/3.12/howto/sorting.html#sortinghowto).617618**Особенность реализации CPython:** Во время сортировки списка результат попыток изменить или даже проверить список не определён. Реализация Python на C делает список пустым на время сортировки и вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если может обнаружить, что список был изменён во время сортировки.619620### Кортежи621622Кортежи – это неизменяемые последовательности, обычно используемые для хранения коллекций разнородных данных (например, пар, возвращаемых встроенной функцией [`enumerate()`](https://python-all.ru/3.12/library/functions.html#enumerate)). Кортежи также используются в случаях, когда требуется неизменяемая последовательность однородных данных (например, для хранения в экземпляре [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) или [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict)).623624#### `class tuple([iterable])`625626Кортежи можно создать несколькими способами:627628- Используя пару круглых скобок для обозначения пустого кортежа: `()`629- Используя завершающую запятую для кортежа из одного элемента: `a,` или `(a,)`630- Разделяя элементы запятыми: `a, b, c` или `(a, b, c)`631- Используя встроенную функцию [`tuple()`](https://python-all.ru/3.12/library/stdtypes.html#tuple): `tuple()` или `tuple(iterable)`632633Конструктор создаёт кортеж, элементы которого совпадают с элементами *итерируемого объекта* и располагаются в том же порядке. *Итерируемый объект* может быть последовательностью, контейнером, поддерживающим итерацию, или итератором. Если *итерируемый объект* уже является кортежем, он возвращается без изменений. Например, `tuple('abc')` возвращает `('a', 'b', 'c')`, а `tuple( [1, 2, 3] )` возвращает `(1, 2, 3)`. Если аргумент не указан, конструктор создаёт новый пустой кортеж – `()`.634635Обратите внимание, что кортеж создаётся запятой, а не круглыми скобками. Скобки необязательны, за исключением пустого кортежа или случаев, когда они необходимы для устранения синтаксической неоднозначности. Например, `f(a, b, c)` – это вызов функции с тремя аргументами, а `f((a, b, c))` – это вызов функции с одним аргументом – кортежем из трёх элементов.636637Кортежи реализуют все [общие](https://python-all.ru/3.12/library/stdtypes.html#typesseq-common) операции последовательностей.638639Для гетерогенных коллекций данных, где доступ по имени понятнее, чем доступ по индексу, [`collections.namedtuple()`](https://python-all.ru/3.12/library/collections.html#collections.namedtuple) может быть более подходящим выбором, чем простой объект кортежа.640641### Диапазоны642643Тип [`range`](https://python-all.ru/3.12/library/stdtypes.html#range) представляет собой неизменяемую последовательность чисел и обычно используется для цикла с определённым числом итераций в циклах [`for`](https://python-all.ru/3.12/reference/compound_stmts.html#for).644645#### `class range(stop)`646647#### `class range(start, stop[, step])`648649Аргументы конструктора range должны быть целыми числами (либо встроенными [`int`](https://python-all.ru/3.12/library/functions.html#int), либо любым объектом, реализующим специальный метод [`__index__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__index__)). Если аргумент *step* опущен, по умолчанию используется `1`. Если аргумент *start* опущен, по умолчанию используется `0`. Если *step* равен нулю, возбуждается [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError).650651Для положительного *step* содержимое диапазона `r` определяется формулой `r[i] = start + step*i`, где `i >= 0` и `r[i] < stop`.652653Для отрицательного *step* содержимое диапазона по-прежнему определяется формулой `r[i] = start + step*i`, но ограничениями являются `i >= 0` и `r[i] > stop`.654655Объект диапазона будет пустым, если `r[0]` не удовлетворяет ограничению значения. Диапазоны поддерживают отрицательные индексы, но они интерпретируются как индексация с конца последовательности, определяемой положительными индексами.656657Диапазоны, содержащие абсолютные значения больше [`sys.maxsize`](https://python-all.ru/3.12/library/sys.html#sys.maxsize), допускаются, но некоторые функции (например [`len()`](https://python-all.ru/3.12/library/functions.html#len)) могут возбуждать [`OverflowError`](https://python-all.ru/3.12/library/exceptions.html#OverflowError).658659Примеры диапазонов:660661```python662>>> list(range(10))663[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]664>>> list(range(1, 11))665[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]666>>> list(range(0, 30, 5))667[0, 5, 10, 15, 20, 25]668>>> list(range(0, 10, 3))669[0, 3, 6, 9]670>>> list(range(0, -10, -1))671[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]672>>> list(range(0))673[]674>>> list(range(1, 0))675[]676```677678Диапазоны реализуют все [общие](https://python-all.ru/3.12/library/stdtypes.html#typesseq-common) операции последовательностей, за исключением конкатенации и повторения (ввиду того, что объекты диапазонов могут представлять только последовательности, следующие строгому шаблону, а повторение и конкатенация обычно нарушают этот шаблон).679680#### `start`681682Значение параметра *start* (или `0`, если параметр не был указан)683684#### `stop`685686Значение параметра *stop*687688#### `step`689690Значение параметра *step* (или `1`, если параметр не был указан)691692Преимущество типа [`range`](https://python-all.ru/3.12/library/stdtypes.html#range) перед обычными [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) или [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple) заключается в том, что объект [`range`](https://python-all.ru/3.12/library/stdtypes.html#range) всегда занимает одинаковый (небольшой) объём памяти, независимо от размера диапазона, который он представляет (поскольку он хранит только значения `start`, `stop` и `step`, вычисляя отдельные элементы и поддиапазоны по мере необходимости).693694Объекты диапазонов реализуют абстрактный базовый класс (ABC) [`collections.abc.Sequence`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Sequence) и предоставляет такие возможности, как проверка на вхождение, поиск индекса элемента, срезы и поддержка отрицательных индексов (см. [Типы последовательностей – list, tuple, range](https://python-all.ru/3.12/library/stdtypes.html#typesseq)):695696```python697>>> r = range(0, 20, 2)698>>> r699range(0, 20, 2)700>>> 11 in r701False702>>> 10 in r703True704>>> r.index(10)7055706>>> r[5]70710708>>> r[:5]709range(0, 10, 2)710>>> r[-1]71118712```713714Проверка объектов диапазонов на равенство с `==` и `!=` сравнивает их как последовательности. То есть два объекта диапазонов считаются равными, если они представляют одну и ту же последовательность значений. (Обратите внимание, что два равных объекта диапазонов могут иметь разные атрибуты [`start`](https://python-all.ru/3.12/library/stdtypes.html#range.start), [`stop`](https://python-all.ru/3.12/library/stdtypes.html#range.stop) и [`step`](https://python-all.ru/3.12/library/stdtypes.html#range.step), например `range(0) == range(2, 1, 3)` или `range(0, 3, 2) == range(0, 4, 2)`.)715716Изменено в версии 3.2: Реализует ABC Sequence. Поддерживает срезы и отрицательные индексы. Проверяет принадлежность объектов [`int`](https://python-all.ru/3.12/library/functions.html#int) за константное время вместо итерации по всем элементам.717718Изменено в версии 3.3: Определяет ‘==’ и ‘!=’ для сравнения объектов диапазонов на основе последовательности значений, которые они определяют (вместо сравнения по идентичности объектов).719720Добавлены атрибуты [`start`](https://python-all.ru/3.12/library/stdtypes.html#range.start), [`stop`](https://python-all.ru/3.12/library/stdtypes.html#range.stop) и [`step`](https://python-all.ru/3.12/library/stdtypes.html#range.step).721722> **См. также**723>724> - Рецепт [linspace](https://python-all.ru/3.12/library/stdtypes.html) показывает, как реализовать ленивую версию диапазона, подходящую для приложений с плавающей запятой.725726## Тип текстовой последовательности – [`str`](https://python-all.ru/3.12/library/stdtypes.html#str)727728Текстовые данные в Python представлены объектами [`str`](https://python-all.ru/3.12/library/stdtypes.html#str), или *строками*. Строки – неизменяемые [последовательности](https://python-all.ru/3.12/library/stdtypes.html#typesseq) кодовых точек Unicode. Строковые литералы записываются различными способами:729730- Одинарные кавычки: `'allows embedded "double" quotes'`731- Двойные кавычки: `"allows embedded 'single' quotes"`732- Тройные кавычки: `'''Three single quotes'''`, `"""Three double quotes"""`733734Строки в тройных кавычках могут занимать несколько строк – все сопутствующие пробельные символы будут включены в строковый литерал.735736Строковые литералы, являющиеся частью одного выражения и разделённые только пробельными символами, будут неявно объединены в один строковый литерал. То есть `("spam " "eggs") == "spam eggs"`.737738Смотрите [Строковые и байтовые литералы](https://python-all.ru/3.12/reference/lexical_analysis.html#strings) для получения дополнительной информации о различных формах строковых литералов, включая поддерживаемые [управляющие последовательности](https://python-all.ru/3.12/reference/lexical_analysis.html#escape-sequences) и префикс `r` («сырой»), который отключает обработку большинства управляющих последовательностей.739740Строки также могут быть созданы из других объектов с помощью конструктора [`str`](https://python-all.ru/3.12/library/stdtypes.html#str).741742Поскольку отдельного типа «символ» не существует, индексация строки даёт строку длины 1. То есть для непустой строки *s* выполняется `s[0] == s[0:1]`.743744Также нет изменяемого строкового типа, но [`str.join()`](https://python-all.ru/3.12/library/stdtypes.html#str.join) или [`io.StringIO`](https://python-all.ru/3.12/library/io.html#io.StringIO) можно использовать для эффективного построения строк из нескольких фрагментов.745746Изменено в версии 3.3: Для обратной совместимости с серией Python 2 префикс `u` снова разрешён в строковых литералах. Он не влияет на значение строковых литералов и не может сочетаться с префиксом `r`.747748#### `class str(object='')`749750#### `class str(object=b'', encoding='utf-8', errors='strict')`751752Возвращает [строковое](https://python-all.ru/3.12/library/stdtypes.html#textseq) представление *объекта*. Если *объект* не указан, возвращает пустую строку. В противном случае поведение `str()` зависит от того, указаны ли *encoding* или *errors*, как описано ниже.753754Если не указаны ни *encoding*, ни *errors*, `str(object)` возвращает [`type(object).__str__(object)`](https://python-all.ru/3.12/reference/datamodel.html#object.__str__), которое является «неформальным» или удобным для вывода строковым представлением *объекта*. Для строковых объектов это сама строка. Если *объект* не имеет метода [`__str__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__str__), то [`str()`](https://python-all.ru/3.12/library/stdtypes.html#str) возвращает [`repr(object)`](https://python-all.ru/3.12/library/functions.html#repr).755756Если указан хотя бы один из *encoding* или *errors*, *object* должен быть [байтово-подобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) (например, [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) или [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray)). В этом случае, если *объект* является объектом [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) (или [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray)), то `str(bytes, encoding, errors)` эквивалентно [`bytes.decode(encoding, errors)`](https://python-all.ru/3.12/library/stdtypes.html#bytes.decode). В противном случае объект bytes, лежащий в основе буферного объекта, получается перед вызовом [`bytes.decode()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.decode). Смотрите [Типы двоичных последовательностей – bytes, bytearray, memoryview](https://python-all.ru/3.12/library/stdtypes.html#binaryseq) и [Протокол буфера](https://python-all.ru/3.12/c-api/buffer.html#bufferobjects) для информации о буферных объектах.757758Передача объекта [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) в [`str()`](https://python-all.ru/3.12/library/stdtypes.html#str) без аргументов *encoding* или *errors* относится к первому случаю возврата неформального строкового представления (см. также параметр командной строки [`-b`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-b) Python). Например:759760```python761>>> str(b'Zoot!')762"b'Zoot!'"763```764765Дополнительную информацию о классе `str` и его методах см. в [Тип текстовой последовательности – str](https://python-all.ru/3.12/library/stdtypes.html#textseq) и в разделе [Методы строк](https://python-all.ru/3.12/library/stdtypes.html#string-methods) ниже. Для вывода форматированных строк см. разделы [f-строки](https://python-all.ru/3.12/reference/lexical_analysis.html#f-strings) и [Синтаксис форматных строк](https://python-all.ru/3.12/library/string.html#formatstrings). Кроме того, см. раздел [Службы обработки текста](https://python-all.ru/3.12/library/text.html#stringservices).766767### Методы строк768769Строки реализуют все [общие](https://python-all.ru/3.12/library/stdtypes.html#typesseq-common) операции с последовательностями, а также дополнительные методы, описанные ниже.770771Строки также поддерживают два стиля форматирования: один предоставляет большую гибкость и настройку (см. [`str.format()`](https://python-all.ru/3.12/library/stdtypes.html#str.format), [Синтаксис форматных строк](https://python-all.ru/3.12/library/string.html#formatstrings) и [Пользовательское форматирование строк](https://python-all.ru/3.12/library/string.html#string-formatting)), а другой основан на стиле форматирования C `printf`, который поддерживает более узкий набор типов и немного сложнее в правильном использовании, но зачастую быстрее в тех случаях, с которыми он может справиться ([Форматирование строк в стиле printf](https://python-all.ru/3.12/library/stdtypes.html#old-string-formatting)).772773Раздел [Службы обработки текста](https://python-all.ru/3.12/library/text.html#textservices) стандартной библиотеки охватывает ряд других модулей, предоставляющих различные утилиты для работы с текстом (включая поддержку регулярных выражений в модуле [`re`](https://python-all.ru/3.12/library/re.html#module-re)).774775#### `str.capitalize()`776777Возвращает копию строки, в которой первый символ переведён в верхний регистр, а остальные – в нижний.778779Изменено в версии 3.8: Первый символ теперь переводится в регистр заголовка (titlecase) вместо заглавного. Это означает, что символы типа диграфов будут иметь заглавной только первую букву, а не весь символ.780781#### `str.casefold()`782783Возвращает копию строки, преобразованную для регистронезависимого сравнения. Такие строки могут использоваться для сравнения без учёта регистра.784785Сведение регистра (casefolding) похоже на приведение к нижнему регистру, но действует более агрессивно, поскольку предназначено для удаления всех различий по регистру в строке. Например, немецкая строчная буква `'ß'` эквивалентна `"ss"`. Поскольку она уже строчная, [`lower()`](https://python-all.ru/3.12/library/stdtypes.html#str.lower) ничего не сделает с `'ß'`; [`casefold()`](https://python-all.ru/3.12/library/stdtypes.html#str.casefold) преобразует её в `"ss"`.786787Алгоритм регистронезависимого сравнения [описан в разделе 3.13 «Default Case Folding» стандарта Unicode](https://python-all.ru/3.12/library/stdtypes.html).788789Добавлено в версии 3.3.790791#### `str.center(width[, fillchar])`792793Возвращает строку, выровненную по центру, длиной *width*. Заполнение выполняется с помощью указанного *fillchar* (по умолчанию – пробел ASCII). Исходная строка возвращается, если *width* меньше или равен `len(s)`.794795#### `str.count(sub[, start[, end]])`796797Возвращает количество непересекающихся вхождений подстроки *sub* в диапазоне \[*start*, *end*\]. Необязательные аргументы *start* и *end* интерпретируются как в нотации срезов.798799Если *sub* пусто, возвращает количество пустых строк между символами, что равно длине строки плюс один.800801#### `str.encode(encoding='utf-8', errors='strict')`802803Возвращает строку, закодированную в [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes).804805*encoding* по умолчанию равен `'utf-8'`; список возможных значений см. в [Стандартные кодировки](https://python-all.ru/3.12/library/codecs.html#standard-encodings).806807*errors* управляет обработкой ошибок кодирования. Если `'strict'` (по умолчанию), возбуждается исключение [`UnicodeError`](https://python-all.ru/3.12/library/exceptions.html#UnicodeError). Другие возможные значения: `'ignore'`, `'replace'`, `'xmlcharrefreplace'`, `'backslashreplace'` и любое другое имя, зарегистрированное через [`codecs.register_error()`](https://python-all.ru/3.12/library/codecs.html#codecs.register_error). Подробности см. в [Обработчики ошибок](https://python-all.ru/3.12/library/codecs.html#error-handlers).808809По соображениям производительности значение *errors* не проверяется на корректность, пока не произойдет ошибка кодирования, не будет включён [Режим разработки Python](https://python-all.ru/3.12/library/devmode.html#devmode) или не будет использована [отладочная сборка](https://python-all.ru/3.12/using/configure.html#debug-build).810811Изменено в версии 3.1: Добавлена поддержка именованных аргументов.812813Изменено в версии 3.9: Значение аргумента *errors* теперь проверяется в [Режиме разработки Python](https://python-all.ru/3.12/library/devmode.html#devmode) и в [режиме отладки](https://python-all.ru/3.12/using/configure.html#debug-build).814815#### `str.endswith(suffix[, start[, end]])`816817Возвращает `True`, если строка заканчивается указанным *suffix*, иначе возвращает `False`. *suffix* также может быть кортежем суффиксов для поиска. С необязательным *start* проверка начинается с этой позиции. С необязательным *end* сравнение прекращается на этой позиции.818819#### `str.expandtabs(tabsize=8)`820821Возвращает копию строки, в которой все символы табуляции заменены на один или несколько пробелов в зависимости от текущей позиции столбца и заданного размера табуляции. Позиции табуляции находятся через каждые *tabsize* символов (по умолчанию 8, что даёт позиции табуляции на столбцах 0, 8, 16 и т.д.). Для разворачивания строки текущий столбец устанавливается в ноль, и строка просматривается посимвольно. Если символ – табуляция (`\t`), в результат вставляется один или несколько пробелов, пока текущий столбец не сравняется со следующей позицией табуляции. (Сам символ табуляции не копируется.) Если символ – новая строка (`\n`) или возврат каретки (`\r`), он копируется, а текущий столбец сбрасывается в ноль. Любой другой символ копируется без изменений, и текущий столбец увеличивается на единицу независимо от того, как этот символ представлен при печати.822823```python824>>> '01\t012\t0123\t01234'.expandtabs()825'01      012     0123    01234'826>>> '01\t012\t0123\t01234'.expandtabs(4)827'01  012 0123    01234'828```829830#### `str.find(sub[, start[, end]])`831832Возвращает наименьший индекс в строке, где подстрока *sub* найдена в срезе `s[start:end]`. Необязательные аргументы *start* и *end* интерпретируются как в записи среза. Возвращает `-1`, если *sub* не найдена.833834> **Примечание**835>836> Метод [`find()`](https://python-all.ru/3.12/library/stdtypes.html#str.find) следует использовать только если нужно знать позицию *sub*. Чтобы проверить, является ли *sub* подстрокой, используйте оператор [`in`](https://python-all.ru/3.12/reference/expressions.html#in):837>838> ```python839> >>> 'Py' in 'Python'840> True841> ```842843#### `str.format(*args, **kwargs)`844845Выполняет операцию форматирования строки. Строка, к которой применяется этот метод, может содержать буквальный текст или поля замены, ограниченные фигурными скобками `{}`. Каждое поле замены содержит либо числовой индекс позиционного аргумента, либо имя именованного аргумента. Возвращает копию строки, в которой каждое поле замены заменено строковым значением соответствующего аргумента.846847```python848>>> "The sum of 1 + 2 is {0}".format(1+2)849'The sum of 1 + 2 is 3'850```851852См. [Синтаксис форматных строк](https://python-all.ru/3.12/library/string.html#formatstrings) для описания различных параметров форматирования, которые можно указать в форматных строках.853854> **Примечание**855>856> При форматировании числа ([`int`](https://python-all.ru/3.12/library/functions.html#int), [`float`](https://python-all.ru/3.12/library/functions.html#float), [`complex`](https://python-all.ru/3.12/library/functions.html#complex), [`decimal.Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal) и подклассов) с типом `n` (например: `'{:n}'.format(1234)`) функция временно устанавливает локаль `LC_CTYPE` в локаль `LC_NUMERIC` для декодирования полей `decimal_point` и `thousands_sep` объекта `localeconv()`, если они не ASCII или длиннее 1 байта, и локаль `LC_NUMERIC` отличается от локали `LC_CTYPE`. Это временное изменение влияет на другие потоки.857858Изменено в версии 3.7: При форматировании числа с типом `n` функция временно устанавливает локаль `LC_CTYPE` в локаль `LC_NUMERIC` в некоторых случаях.859860#### `str.format_map(mapping)`861862Аналогично `str.format(**mapping)`, за исключением того, что `mapping` используется напрямую, а не копируется в [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict). Это полезно, если, например, `mapping` является подклассом словаря:863864```python865>>> class Default(dict):866...     def __missing__(self, key):867...         return key868...869>>> '{name} was born in {country}'.format_map(Default(name='Guido'))870'Guido was born in country'871```872873Добавлено в версии 3.2.874875#### `str.index(sub[, start[, end]])`876877Как [`find()`](https://python-all.ru/3.12/library/stdtypes.html#str.find), но вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если подстрока не найдена.878879#### `str.isalnum()`880881Возвращает `True`, если все символы в строке являются буквенно-цифровыми и есть хотя бы один символ, иначе `False`. Символ `c` является буквенно-цифровым, если один из следующих методов возвращает `True`: `c.isalpha()`, `c.isdecimal()`, `c.isdigit()` или `c.isnumeric()`.882883#### `str.isalpha()`884885Возвращает `True`, если все символы в строке являются буквенными и есть хотя бы один символ, и `False` в противном случае. Буквенными считаются символы, определённые в базе данных Unicode как «Letter», то есть те, у которых общая категория – одна из «Lm», «Lt», «Lu», «Ll» или «Lo». Обратите внимание, что это отличается от [свойства Alphabetic, определённого в разделе 4.10 «Letters, Alphabetic, and Ideographic» стандарта Unicode](https://python-all.ru/3.12/library/stdtypes.html).886887#### `str.isascii()`888889Возвращает `True`, если строка пуста или все символы в строке являются ASCII, `False` в противном случае. Символы ASCII имеют кодовые точки в диапазоне U+0000–U+007F.890891Добавлено в версии 3.7.892893#### `str.isdecimal()`894895Возвращает `True`, если все символы в строке являются десятичными цифрами и есть хотя бы один символ, и `False` в противном случае. Десятичные цифры – это те, которые можно использовать для записи чисел в десятичной системе, например U+0660 (арабско-индийская цифра ноль). Формально десятичная цифра – это символ общей категории Unicode «Nd».896897#### `str.isdigit()`898899Возвращает `True`, если все символы в строке являются цифрами и есть хотя бы один символ, и `False` в противном случае. Цифры включают десятичные цифры и цифры, требующие специальной обработки, например надстрочные цифры совместимости. Это охватывает цифры, которые нельзя использовать для записи чисел в десятичной системе, например цифры кхарошти. Формально цифра – это символ со значением свойства Numeric\_Type=Digit или Numeric\_Type=Decimal.900901#### `str.isidentifier()`902903Возвращает `True`, если строка является допустимым идентификатором согласно определению языка, раздел [Идентификаторы и ключевые слова](https://python-all.ru/3.12/reference/lexical_analysis.html#identifiers).904905[`keyword.iskeyword()`](https://python-all.ru/3.12/library/keyword.html#keyword.iskeyword) можно использовать для проверки, является ли строка `s` зарезервированным идентификатором, например [`def`](https://python-all.ru/3.12/reference/compound_stmts.html#def) и [`class`](https://python-all.ru/3.12/reference/compound_stmts.html#class).906907Пример:908909```python910>>> from keyword import iskeyword911912>>> 'hello'.isidentifier(), iskeyword('hello')913(True, False)914>>> 'def'.isidentifier(), iskeyword('def')915(True, True)916```917918#### `str.islower()`919920Возвращает `True`, если все буквенные символы [\[4\]](https://python-all.ru/3.12/library/stdtypes.html#id15) в строке являются строчными и в строке есть хотя бы один буквенный символ, иначе `False`.921922#### `str.isnumeric()`923924Возвращает `True`, если все символы в строке являются числовыми символами и есть хотя бы один символ, и `False` в противном случае. Числовые символы включают цифровые символы и все символы, имеющие свойство числового значения Unicode, например U+2155 (обыкновенная дробь одна пятая). Формально числовые символы – это символы со значением свойства Numeric\_Type=Digit, Numeric\_Type=Decimal или Numeric\_Type=Numeric.925926#### `str.isprintable()`927928Возвращает true, если все символы в строке являются печатными, и false, если строка содержит хотя бы один непечатный символ.929930Здесь «печатный» означает, что символ подходит для использования [`repr()`](https://python-all.ru/3.12/library/functions.html#repr) в своём выводе; «непечатный» означает, что [`repr()`](https://python-all.ru/3.12/library/functions.html#repr) на встроенных типах будет экранировать символ шестнадцатеричным кодом. Это не влияет на обработку строк, записываемых в [`sys.stdout`](https://python-all.ru/3.12/library/sys.html#sys.stdout) или [`sys.stderr`](https://python-all.ru/3.12/library/sys.html#sys.stderr).931932Печатные символы – это те, которые в базе данных символов Unicode (см. [`unicodedata`](https://python-all.ru/3.12/library/unicodedata.html#module-unicodedata)) имеют общую категорию из группы Letter, Mark, Number, Punctuation или Symbol (L, M, N, P или S); плюс пробел ASCII 0x20. Непечатные символы – это символы из группы Separator или Other (Z или C), за исключением пробела ASCII.933934#### `str.isspace()`935936Возвращает `True`, если в строке есть только пробельные символы и в ней есть хотя бы один символ, иначе `False`.937938Символ считается *пробельным*, если в базе данных символов Unicode (см. [`unicodedata`](https://python-all.ru/3.12/library/unicodedata.html#module-unicodedata)) его общая категория – `Zs` («Separator, space») или его двунаправленный класс – один из `WS`, `B` или `S`.939940#### `str.istitle()`941942Возвращает `True`, если строка записана в заголовочном регистре и содержит хотя бы один символ. Например, прописные символы могут следовать только за символами без регистра, а строчные – только за символами с регистром. В противном случае возвращает `False`.943944#### `str.isupper()`945946Возвращает `True`, если все буквенные символы [\[4\]](https://python-all.ru/3.12/library/stdtypes.html#id15) в строке являются прописными и в строке есть хотя бы один буквенный символ, иначе `False`.947948```python949>>> 'BANANA'.isupper()950True951>>> 'banana'.isupper()952False953>>> 'baNana'.isupper()954False955>>> ' '.isupper()956False957```958959#### `str.join(iterable)`960961Возвращает строку, являющуюся конкатенацией строк из *iterable*. Будет возбуждено исключение [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError), если в *iterable* есть какие-либо значения, не являющиеся строками, включая объекты [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes). Разделителем между элементами служит строка, для которой вызывается этот метод.962963#### `str.ljust(width[, fillchar])`964965Возвращает строку, выровненную по левому краю в строке длины *width*. Заполнение выполняется с использованием указанного *fillchar* (по умолчанию пробел ASCII). Исходная строка возвращается, если *width* меньше или равно `len(s)`.966967#### `str.lower()`968969Возвращает копию строки, в которой все символы, имеющие регистр, [\[4\]](https://python-all.ru/3.12/library/stdtypes.html#id15) преобразованы в нижний регистр.970971Используемый алгоритм приведения к нижнему регистру [описан в разделе 3.13 «Default Case Folding» стандарта Unicode](https://python-all.ru/3.12/library/stdtypes.html).972973#### `str.lstrip([chars])`974975Возвращает копию строки с удалёнными начальными символами. Аргумент *chars* – это строка, задающая набор удаляемых символов. Если он опущен или равен `None`, аргумент *chars* по умолчанию удаляет пробельные символы. Аргумент *chars* – это не префикс; удаляются все комбинации входящих в него символов:976977```python978>>> '   spacious   '.lstrip()979'spacious   '980>>> 'www.example.com'.lstrip('cmowz.')981'example.com'982```983984См. [`str.removeprefix()`](https://python-all.ru/3.12/library/stdtypes.html#str.removeprefix) для метода, который удаляет один строковый префикс, а не набор символов. Например:985986```python987>>> 'Arthur: three!'.lstrip('Arthur: ')988'ee!'989>>> 'Arthur: three!'.removeprefix('Arthur: ')990'three!'991```992993#### `static str.maketrans(x[, y[, z]])`994995Этот статический метод возвращает таблицу перевода, пригодную для использования в [`str.translate()`](https://python-all.ru/3.12/library/stdtypes.html#str.translate).996997Если указан только один аргумент, он должен быть словарём, отображающим коды Unicode (целые числа) или символы (строки длины 1) в коды Unicode, строки (произвольной длины) или `None`. Ключи-символы при этом преобразуются в коды.998999Если передано два аргумента, они должны быть строками одинаковой длины; в результирующем словаре каждый символ из x будет сопоставлен символу на той же позиции в y. Если есть третий аргумент, он должен быть строкой, символы которой будут сопоставлены `None` в результате.10001001#### `str.partition(sep)`10021003Разделяет строку по первому вхождению *sep* и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий саму строку и две пустые строки.10041005#### `str.removeprefix(prefix, /)`10061007Если строка начинается с подстроки *prefix*, возвращается `string[len(prefix):]`. В противном случае возвращается копия исходной строки:10081009```python1010>>> 'TestHook'.removeprefix('Test')1011'Hook'1012>>> 'BaseTestCase'.removeprefix('Test')1013'BaseTestCase'1014```10151016Добавлено в версии 3.9.10171018#### `str.removesuffix(suffix, /)`10191020Если строка заканчивается подстрокой *suffix* и эта *suffix* не пуста, возвращается `string[:-len(suffix)]`. В противном случае возвращается копия исходной строки:10211022```python1023>>> 'MiscTests'.removesuffix('Tests')1024'Misc'1025>>> 'TmpDirMixin'.removesuffix('Tests')1026'TmpDirMixin'1027```10281029Добавлено в версии 3.9.10301031#### `str.replace(old, new[, count])`10321033Возвращает копию строки, в которой все вхождения подстроки *old* заменены на *new*. Если задан необязательный аргумент *count*, заменяются только первые *count* вхождений.10341035#### `str.rfind(sub[, start[, end]])`10361037Возвращает наибольший индекс в строке, на котором найдена подстрока *sub*, при условии что *sub* находится в пределах `s[start:end]`. Необязательные аргументы *start* и *end* интерпретируются как в записи среза. В случае неудачи возвращает `-1`.10381039#### `str.rindex(sub[, start[, end]])`10401041Как [`rfind()`](https://python-all.ru/3.12/library/stdtypes.html#str.rfind), но возбуждает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если подстрока *sub* не найдена.10421043#### `str.rjust(width[, fillchar])`10441045Возвращает строку, выровненную по правому краю в строке длины *width*. Заполнение выполняется с использованием указанного *fillchar* (по умолчанию пробел ASCII). Исходная строка возвращается, если *width* меньше или равно `len(s)`.10461047#### `str.rpartition(sep)`10481049Разделяет строку по последнему вхождению *sep* и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий две пустые строки и саму строку.10501051#### `str.rsplit(sep=None, maxsplit=-1)`10521053Возвращает список слов в строке, используя *sep* в качестве строки-разделителя. Если указан *maxsplit*, выполняется не более *maxsplit* разбиений, причём *самых правых*. Если *sep* не указан или равен `None`, в качестве разделителя используется любая строка из пробельных символов. За исключением разбиения справа, [`rsplit()`](https://python-all.ru/3.12/library/stdtypes.html#str.rsplit) ведёт себя как [`split()`](https://python-all.ru/3.12/library/stdtypes.html#str.split), подробно описанный ниже.10541055#### `str.rstrip([chars])`10561057Возвращает копию строки с удалёнными завершающими символами. Аргумент *chars* – это строка, задающая набор удаляемых символов. Если он опущен или равен `None`, аргумент *chars* по умолчанию удаляет пробельные символы. Аргумент *chars* не является суффиксом; вместо этого удаляются все комбинации его значений:10581059```python1060>>> '   spacious   '.rstrip()1061'   spacious'1062>>> 'mississippi'.rstrip('ipz')1063'mississ'1064```10651066См. [`str.removesuffix()`](https://python-all.ru/3.12/library/stdtypes.html#str.removesuffix) – метод, который удаляет одну строку-суффикс, а не все символы из набора. Например:10671068```python1069>>> 'Monty Python'.rstrip(' Python')1070'M'1071>>> 'Monty Python'.removesuffix(' Python')1072'Monty'1073```10741075#### `str.split(sep=None, maxsplit=-1)`10761077Возвращает список слов в строке, используя *sep* в качестве строки-разделителя. Если указан *maxsplit*, выполняется не более *maxsplit* разбиений (следовательно, список будет содержать не более `maxsplit+1` элементов). Если *maxsplit* не указан или равен `-1`, ограничения на количество разбиений нет (выполняются все возможные разбиения).10781079Если *sep* задан, последовательные разделители не группируются и считаются разделяющими пустые строки (например, `'1,,2'.split(',')` возвращает `['1', '', '2']`). Аргумент *sep* может состоять из нескольких символов, используемых как один разделитель (для разбиения по нескольким разделителям используйте [`re.split()`](https://python-all.ru/3.12/library/re.html#re.split)). Разбиение пустой строки с указанным разделителем возвращает `['']`.10801081Например:10821083```python1084>>> '1,2,3'.split(',')1085['1', '2', '3']1086>>> '1,2,3'.split(',', maxsplit=1)1087['1', '2,3']1088>>> '1,2,,3,'.split(',')1089['1', '2', '', '3', '']1090>>> '1<>2<>3<4'.split('<>')1091['1', '2', '3<4']1092```10931094Если *sep* не указан или равен `None`, применяется другой алгоритм разбиения: последовательности пробельных символов считаются одним разделителем, и результат не будет содержать пустых строк в начале или конце, если строка содержит начальные или завершающие пробелы. Следовательно, разбиение пустой строки или строки, состоящей только из пробелов, с разделителем `None` возвращает `[]`.10951096Например:10971098```python1099>>> '1 2 3'.split()1100['1', '2', '3']1101>>> '1 2 3'.split(maxsplit=1)1102['1', '2 3']1103>>> '   1   2   3   '.split()1104['1', '2', '3']1105```11061107#### `str.splitlines(keepends=False)`11081109Возвращает список строк в строке, разбивая её по границам строк. Символы перевода строки не включаются в результирующий список, если только *keepends* не задан и не равен true.11101111Этот метод разбивает строку по следующим границам строк. В частности, эти границы являются расширенным набором [универсальных символов перевода строки](https://python-all.ru/3.12/glossary.html#term-universal-newlines).11121113| Представление | Описание |1114| --- | --- |1115| `\n` | Перевод строки (LF) |1116| `\r` | Возврат каретки (CR) |1117| `\r\n` | Возврат каретки + перевод строки (CR+LF) |1118| `\v` или `\x0b` | Линейная табуляция |1119| `\f` или `\x0c` | Перевод страницы |1120| `\x1c` | Разделитель файлов |1121| `\x1d` | Разделитель групп |1122| `\x1e` | Разделитель записей |1123| `\x85` | Следующая строка (управляющий код C1) |1124| `\u2028` | Разделитель строк |1125| `\u2029` | Разделитель абзацев |11261127Изменено в версии 3.2: `\v` и `\f` добавлены в список границ строк.11281129Например:11301131```python1132>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()1133['ab c', '', 'de fg', 'kl']1134>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)1135['ab c\n', '\n', 'de fg\r', 'kl\r\n']1136```11371138В отличие от [`split()`](https://python-all.ru/3.12/library/stdtypes.html#str.split), когда задана строка-разделитель *sep*, этот метод возвращает пустой список для пустой строки, и концевой разрыв строки не приводит к появлению дополнительной строки:11391140```python1141>>> "".splitlines()1142[]1143>>> "One line\n".splitlines()1144['One line']1145```11461147Для сравнения, `split('\n')` возвращает:11481149```python1150>>> ''.split('\n')1151['']1152>>> 'Two lines\n'.split('\n')1153['Two lines', '']1154```11551156#### `str.startswith(prefix[, start[, end]])`11571158Возвращает `True`, если строка начинается с *prefix*, иначе возвращает `False`. *prefix* также может быть кортежем префиксов для поиска. При указании необязательного *start* строка проверяется начиная с этой позиции. При указании необязательного *end* сравнение строки прекращается на этой позиции.11591160#### `str.strip([chars])`11611162Возвращает копию строки с удалёнными начальными и завершающими символами. Аргумент *chars* – это строка, задающая набор удаляемых символов. Если он опущен или равен `None`, аргумент *chars* по умолчанию удаляет пробельные символы. Аргумент *chars* не является префиксом или суффиксом; вместо этого удаляются все комбинации его значений:11631164```python1165>>> '   spacious   '.strip()1166'spacious'1167>>> 'www.example.com'.strip('cmowz.')1168'example'1169```11701171Самые внешние начальные и завершающие значения аргумента *chars* удаляются из строки. Символы удаляются с начального конца до тех пор, пока не будет достигнут символ строки, не входящий в набор символов из *chars*. Аналогичная операция выполняется на завершающем конце. Например:11721173```python1174>>> comment_string = '#....... Section 3.2.1 Issue #32 .......'1175>>> comment_string.strip('.#! ')1176'Section 3.2.1 Issue #32'1177```11781179#### `str.swapcase()`11801181Возвращает копию строки, в которой прописные буквы преобразованы в строчные и наоборот. Обратите внимание, что не обязательно верно, что `s.swapcase().swapcase() == s`.11821183#### `str.title()`11841185Возвращает строку, где каждое слово начинается с прописной буквы, а остальные символы – строчные.11861187Например:11881189```python1190>>> 'Hello world'.title()1191'Hello World'1192```11931194Алгоритм использует простое, не зависящее от языка определение слова как группы последовательных букв. Это определение работает во многих контекстах, но означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может быть нежелательным результатом:11951196```python1197>>> "they're bill's friends from the UK".title()1198"They'Re Bill'S Friends From The Uk"1199```12001201Функция [`string.capwords()`](https://python-all.ru/3.12/library/string.html#string.capwords) не имеет этой проблемы, поскольку разбивает слова только по пробелам.12021203В качестве альтернативы можно создать обходной путь для апострофов с помощью регулярных выражений:12041205```python1206>>> import re1207>>> def titlecase(s):1208...     return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",1209...                   lambda mo: mo.group(0).capitalize(),1210...                   s)1211...1212>>> titlecase("they're bill's friends.")1213"They're Bill's Friends."1214```12151216#### `str.translate(table)`12171218Возвращает копию строки, в которой каждый символ преобразован с помощью заданной таблицы трансляции. Таблица должна быть объектом, поддерживающим индексацию по [`__getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__getitem__), обычно это [отображение](https://python-all.ru/3.12/glossary.html#term-mapping) или [последовательность](https://python-all.ru/3.12/glossary.html#term-sequence). При индексации по коду Unicode (целое число) объект таблицы может выполнить одно из следующих действий: вернуть код Unicode или строку, чтобы сопоставить символ одному или нескольким другим символам; вернуть `None` для удаления символа из результирующей строки; или возбудить исключение [`LookupError`](https://python-all.ru/3.12/library/exceptions.html#LookupError), чтобы оставить символ без изменений.12191220Можно использовать [`str.maketrans()`](https://python-all.ru/3.12/library/stdtypes.html#str.maketrans) для создания таблицы трансляции на основе сопоставлений символов в различных форматах.12211222См. также модуль [`codecs`](https://python-all.ru/3.12/library/codecs.html#module-codecs) для более гибкого подхода к настраиваемым сопоставлениям символов.12231224#### `str.upper()`12251226Возвращает копию строки, в которой все буквенные символы [\[4\]](https://python-all.ru/3.12/library/stdtypes.html#id15) преобразованы в верхний регистр. Обратите внимание, что `s.upper().isupper()` может быть `False`, если `s` содержит символы без регистра или если категория Unicode результирующего символа не «Lu» (буква, верхний регистр), а, например, «Lt» (буква, заглавный регистр).12271228Используемый алгоритм преобразования в верхний регистр [описан в разделе 3.13 «Default Case Folding» стандарта Unicode](https://python-all.ru/3.12/library/stdtypes.html).12291230#### `str.zfill(width)`12311232Возвращает копию строки, дополненную слева символами `'0'` (цифра ASCII) до длины *width*. Ведущий знак (`'+'`/`'-'`) обрабатывается так: заполнение вставляется *после* символа знака, а не перед ним. Исходная строка возвращается, если *width* меньше или равно `len(s)`.12331234Например:12351236```python1237>>> "42".zfill(5)1238'00042'1239>>> "-42".zfill(5)1240'-0042'1241```12421243### Форматирование строк в стиле `printf`12441245> **Примечание**1246>1247> Описанные здесь операции форматирования имеют ряд особенностей, которые приводят к распространённым ошибкам (например, некорректное отображение кортежей и словарей). Использование более новых [f-строк](https://python-all.ru/3.12/reference/lexical_analysis.html#f-strings), интерфейса [`str.format()`](https://python-all.ru/3.12/library/stdtypes.html#str.format) или [шаблонных строк](https://python-all.ru/3.12/library/string.html#template-strings) может помочь избежать этих ошибок. Каждая из этих альтернатив имеет свои компромиссы и преимущества в простоте, гибкости и/или расширяемости.12481249У строковых объектов есть одна уникальная встроенная операция: оператор `%` (modulo). Он также известен как оператор форматирования строк *formatting* или интерполяции *interpolation*. Для `format % values` (где *format* – строка), спецификации преобразования `%` в *format* заменяются на ноль или более элементов *values*. Результат аналогичен использованию `sprintf()` в языке C.12501251Если *format* требует один аргумент, то *values* может быть одним объектом, не являющимся кортежем. [\[5\]](https://python-all.ru/3.12/library/stdtypes.html#id16) В противном случае *values* должен быть кортежем с количеством элементов, точно указанным в строке формата, или одним объектом отображения (например, словарём).12521253Спецификатор преобразования содержит два или более символа и состоит из следующих компонентов, которые должны располагаться в указанном порядке:125412551. Символ `'%'`, обозначающий начало спецификатора.12562. Ключ отображения (необязательно), состоящий из последовательности символов в круглых скобках (например, `(somename)`).12573. Флаги преобразования (необязательно), влияющие на результат для некоторых типов преобразования.12584. Минимальная ширина поля (необязательно). Если указана как `'*'` (звёздочка), то фактическая ширина берётся из следующего элемента кортежа в *values*, а преобразуемый объект следует после минимальной ширины поля и необязательной точности.12595. Точность (необязательно), задаётся как `'.'` (точка), после которой следует значение точности. Если указана как `'*'` (звёздочка), фактическая точность берётся из следующего элемента кортежа в *values*, и преобразуемое значение следует после точности.12606. Модификатор длины (необязательно).12617. Тип преобразования.12621263Когда правый аргумент является словарём (или другим типом отображения), форматы в строке *должны* включать ключ отображения в скобках, указывающий на этот словарь, вставленный сразу после символа `'%'`. Ключ отображения выбирает значение для форматирования из отображения. Например:12641265```python1266>>> print('%(language)s has %(number)03d quote types.' %1267...       {'language': "Python", "number": 2})1268Python has 002 quote types.1269```12701271В этом случае в формате не должно быть спецификаторов `*` (поскольку они требуют последовательного списка параметров).12721273Символы флагов преобразования:12741275| Флаг | Значение |1276| --- | --- |1277| `'#'` | Преобразование значения будет использовать «альтернативную форму» (определённую ниже). |1278| `'0'` | Для числовых значений преобразование будет дополняться нулями. |1279| `'-'` | Преобразованное значение выравнивается по левому краю (переопределяет преобразование `'0'`, если указаны оба). |1280| `' '` | (пробел) Перед положительным числом (или пустой строкой), полученным в результате знакового преобразования, следует оставлять пробел. |1281| `'+'` | Знак (`'+'` или `'-'`) будет предшествовать преобразованию (переопределяет флаг «пробел»). |12821283Модификатор длины (`h`, `l` или `L`) может присутствовать, но игнорируется, поскольку он не нужен для Python – так, например, `%ld` идентично `%d`.12841285Типы преобразования:12861287| Преобразование | Значение | Примечания |1288| --- | --- | --- |1289| `'d'` | Десятичное целое со знаком. |  |1290| `'i'` | Десятичное целое со знаком. |  |1291| `'o'` | Восьмеричное значение со знаком. | (1) |1292| `'u'` | Устаревший тип – идентичен `'d'`. | (6) |1293| `'x'` | Шестнадцатеричное со знаком (строчные буквы). | (2) |1294| `'X'` | Шестнадцатеричное со знаком (заглавные буквы). | (2) |1295| `'e'` | Экспоненциальный формат с плавающей запятой (строчные буквы). | (3) |1296| `'E'` | Экспоненциальный формат с плавающей запятой (заглавные буквы). | (3) |1297| `'f'` | Десятичный формат с плавающей запятой. | (3) |1298| `'F'` | Десятичный формат с плавающей запятой. | (3) |1299| `'g'` | Формат с плавающей запятой. Использует экспоненциальный формат со строчными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат. | (4) |1300| `'G'` | Формат с плавающей запятой. Использует экспоненциальный формат с заглавными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат. | (4) |1301| `'c'` | Один символ (принимает целое число или строку из одного символа). |  |1302| `'r'` | Строка (преобразует любой объект Python с помощью [`repr()`](https://python-all.ru/3.12/library/functions.html#repr)). | (5) |1303| `'s'` | Строка (преобразует любой объект Python с помощью [`str()`](https://python-all.ru/3.12/library/stdtypes.html#str)). | (5) |1304| `'a'` | Строка (преобразует любой объект Python с помощью [`ascii()`](https://python-all.ru/3.12/library/functions.html#ascii)). | (5) |1305| `'%'` | Ни один аргумент не преобразуется, результатом является символ `'%'` в итоговом выводе. |  |13061307Примечания:130813091. Альтернативная форма вставляет ведущий восьмеричный спецификатор (`'0o'`) перед первой цифрой.13102. Альтернативная форма вставляет перед первой цифрой ведущий `'0x'` или `'0X'` (в зависимости от того, использовался ли формат `'x'` или `'X'`).13113. Альтернативная форма всегда включает десятичную точку в результат, даже если после неё нет цифр.13121313   Точность определяет количество цифр после десятичной точки; по умолчанию – 6.13144. Альтернативная форма всегда включает десятичную точку в результат, а конечные нули не удаляются, как это было бы в противном случае.13151316   Точность определяет количество значащих цифр до и после десятичной точки; по умолчанию – 6.13175. Если точность равна `N`, вывод усекается до `N` символов.13186. См. [**PEP 237**](https://python-all.ru/3.12/library/stdtypes.html).13191320Поскольку строки Python имеют явную длину, преобразования `%s` не предполагают, что `'\0'` является концом строки.13211322Изменено в версии 3.1: `%f` преобразования для чисел, абсолютное значение которых превышает 1e50, больше не заменяются преобразованиями `%g`.13231324## Типы бинарных последовательностей – [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes), [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray), [`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview)13251326Основные встроенные типы для работы с бинарными данными – [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray). Они поддерживаются [`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview), который использует [протокол буфера](https://python-all.ru/3.12/c-api/buffer.html#bufferobjects) для доступа к памяти других бинарных объектов без необходимости создания копии.13271328Модуль [`array`](https://python-all.ru/3.12/library/array.html#module-array) поддерживает эффективное хранение основных типов данных, таких как 32-битные целые числа и числа с плавающей точкой двойной точности IEEE754.13291330### Объекты bytes13311332Объекты bytes – это неизменяемые последовательности отдельных байтов. Поскольку многие основные бинарные протоколы основаны на текстовой кодировке ASCII, объекты bytes предоставляют несколько методов, которые действительны только при работе с данными, совместимыми с ASCII, и тесно связаны со строковыми объектами во многих других отношениях.13331334#### `class bytes([source[, encoding[, errors]]])`13351336Во-первых, синтаксис литералов bytes в основном такой же, как для строковых литералов, за исключением того, что добавляется префикс `b`:13371338- Одинарные кавычки: `b'still allows embedded "double" quotes'`1339- Двойные кавычки: `b"still allows embedded 'single' quotes"`1340- Тройные кавычки: `b'''3 single quotes'''`, `b"""3 double quotes"""`13411342В литералах bytes допускаются только символы ASCII (независимо от объявленной кодировки исходного кода). Любые двоичные значения больше 127 должны вводиться в литералы bytes с помощью соответствующей управляющей последовательности.13431344Как и строковые литералы, литералы bytes также могут использовать префикс `r` для отключения обработки управляющих последовательностей. См. [Строковые литералы и литералы bytes](https://python-all.ru/3.12/reference/lexical_analysis.html#strings) для получения дополнительной информации о различных формах литералов bytes, включая поддерживаемые управляющие последовательности.13451346Хотя литералы bytes и их представления основаны на тексте ASCII, объекты bytes на самом деле ведут себя как неизменяемые последовательности целых чисел, где каждое значение в последовательности ограничено так, что `0 <= x < 256` (попытки нарушить это ограничение вызовут [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError)). Это сделано намеренно, чтобы подчеркнуть, что хотя многие двоичные форматы содержат элементы на основе ASCII и могут быть полезно обработаны некоторыми текстовыми алгоритмами, в общем случае это не так для произвольных двоичных данных (слепое применение алгоритмов обработки текста к двоичным форматам, несовместимым с ASCII, обычно приводит к повреждению данных).13471348Помимо литералов, объекты bytes могут быть созданы несколькими другими способами:13491350- Объект bytes, заполненный нулями заданной длины: `bytes(10)`1351- Из итерируемого объекта целых чисел: `bytes(range(20))`1352- Копирование существующих двоичных данных через буферный протокол: `bytes(obj)`13531354См. также встроенную функцию [bytes](https://python-all.ru/3.12/library/functions.html#func-bytes).13551356Поскольку две шестнадцатеричные цифры соответствуют ровно одному байту, шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип bytes имеет дополнительный метод класса для чтения данных в этом формате:13571358#### `classmethod fromhex(string)`13591360Этот метод класса [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) возвращает объект bytes, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробельные символы ASCII игнорируются.13611362```python1363>>> bytes.fromhex('2Ef0 F1f2  ')1364b'.\xf0\xf1\xf2'1365```13661367Изменено в версии 3.7: [`bytes.fromhex()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.fromhex) теперь пропускает все пробельные символы ASCII в строке, а не только пробелы.13681369Существует обратная функция преобразования для превращения объекта bytes в его шестнадцатеричное представление.13701371#### `hex([sep[, bytes_per_sep]])`13721373Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.13741375```python1376>>> b'\xf0\xf1\xf2'.hex()1377'f0f1f2'1378```13791380Чтобы сделать шестнадцатеричную строку более читаемой, можно указать параметр *sep* – односимвольный разделитель, который будет включён в вывод. По умолчанию этот разделитель будет вставляться между каждым байтом. Второй необязательный параметр *bytes\_per\_sep* управляет интервалом. Положительные значения вычисляют позицию разделителя справа, отрицательные – слева.13811382```python1383>>> value = b'\xf0\xf1\xf2'1384>>> value.hex('-')1385'f0-f1-f2'1386>>> value.hex('_', 2)1387'f0_f1f2'1388>>> b'UUDDLRLRAB'.hex(' ', -4)1389'55554444 4c524c52 4142'1390```13911392Добавлено в версии 3.5.13931394Изменено в версии 3.8: [`bytes.hex()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.hex) теперь поддерживает необязательные параметры *sep* и *bytes\_per\_sep* для вставки разделителей между байтами в шестнадцатеричном выводе.13951396Поскольку объекты bytes являются последовательностями целых чисел (похожими на кортеж), для объекта bytes *b* `b[0]` будет целым числом, а `b[0:1]` – объектом bytes длины 1. (Это отличается от текстовых строк, где и индексация, и извлечение среза дают строку длины 1).13971398Представление объектов bytes использует литеральный формат (`b'...'`), поскольку он часто более полезен, чем, например, `bytes([46, 46, 46])`. Всегда можно преобразовать объект bytes в список целых чисел с помощью `list(b)`.13991400### Объекты Bytearray14011402Объекты [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray) являются изменяемым аналогом объектов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) .14031404#### `class bytearray([source[, encoding[, errors]]])`14051406Для объектов bytearray не существует специального литерального синтаксиса, вместо этого они всегда создаются вызовом конструктора:14071408- Создание пустого экземпляра: `bytearray()`1409- Создание экземпляра, заполненного нулями заданной длины: `bytearray(10)`1410- Из итерируемого объекта целых чисел: `bytearray(range(20))`1411- Копирование существующих двоичных данных через буферный протокол: `bytearray(b'Hi!')`14121413Поскольку объекты bytearray являются изменяемыми, они поддерживают [изменяемые](https://python-all.ru/3.12/library/stdtypes.html#typesseq-mutable) операции последовательности в дополнение к общим операциям bytes и bytearray, описанным в [Операции с bytes и bytearray](https://python-all.ru/3.12/library/stdtypes.html#bytes-methods).14141415См. также встроенную функцию [bytearray](https://python-all.ru/3.12/library/functions.html#func-bytearray).14161417Поскольку две шестнадцатеричные цифры соответствуют ровно одному байту, шестнадцатеричные числа часто используются для описания двоичных данных. Соответственно, тип bytearray имеет дополнительный метод класса для чтения данных в этом формате:14181419#### `classmethod fromhex(string)`14201421Этот метод класса [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray) возвращает объект bytearray, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробельные символы ASCII игнорируются.14221423```python1424>>> bytearray.fromhex('2Ef0 F1f2  ')1425bytearray(b'.\xf0\xf1\xf2')1426```14271428Изменено в версии 3.7: [`bytearray.fromhex()`](https://python-all.ru/3.12/library/stdtypes.html#bytearray.fromhex) теперь пропускает все пробельные символы ASCII в строке, а не только пробелы.14291430Существует обратная функция преобразования для превращения объекта bytearray в его шестнадцатеричное представление.14311432#### `hex([sep[, bytes_per_sep]])`14331434Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.14351436```python1437>>> bytearray(b'\xf0\xf1\xf2').hex()1438'f0f1f2'1439```14401441Добавлено в версии 3.5.14421443Изменено в версии 3.8: Аналогично [`bytes.hex()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.hex), [`bytearray.hex()`](https://python-all.ru/3.12/library/stdtypes.html#bytearray.hex) теперь поддерживает необязательные параметры *sep* и *bytes\_per\_sep* для вставки разделителей между байтами в шестнадцатеричном выводе.14441445Поскольку объекты bytearray являются последовательностями целых чисел (подобно списку), для объекта bytearray *b*, `b[0]` будет целым числом, а `b[0:1]` будет объектом bytearray длиной 1. (Это отличается от текстовых строк, где и индексирование, и срез возвращают строку длиной 1)14461447Представление объектов bytearray использует литеральный формат bytes (`bytearray(b'...')`), поскольку он часто более полезен, чем, например, `bytearray([46, 46, 46])`. Объект bytearray всегда можно преобразовать в список целых чисел с помощью `list(b)`.14481449### Операции с bytes и bytearray14501451Объекты bytes и bytearray поддерживают [общие](https://python-all.ru/3.12/library/stdtypes.html#typesseq-common) операции последовательности. Они взаимодействуют не только с операндами того же типа, но и с любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object). Благодаря такой гибкости их можно свободно смешивать в операциях, не вызывая ошибок. Однако тип возвращаемого результата может зависеть от порядка операндов.14521453> **Примечание**1454>1455> Методы объектов bytes и bytearray не принимают строки в качестве аргументов, так же как методы строк не принимают байты. Например, нужно писать:1456>1457> ```python1458> a = "abc"1459> b = a.replace("a", "f")1460> ```1461>1462> и:1463>1464> ```python1465> a = b"abc"1466> b = a.replace(b"a", b"f")1467> ```14681469Некоторые операции с bytes и bytearray предполагают использование двоичных форматов, совместимых с ASCII, и поэтому их следует избегать при работе с произвольными двоичными данными. Эти ограничения описаны ниже.14701471> **Примечание**1472>1473> Использование этих операций на основе ASCII для манипуляции двоичными данными, которые не хранятся в формате на основе ASCII, может привести к повреждению данных.14741475Следующие методы объектов bytes и bytearray могут использоваться с произвольными двоичными данными.14761477#### `bytes.count(sub[, start[, end]])`14781479#### `bytearray.count(sub[, start[, end]])`14801481Возвращает количество непересекающихся вхождений подпоследовательности *sub* в диапазоне \[*start*, *end*\]. Необязательные аргументы *start* и *end* интерпретируются как в нотации среза.14821483Подпоследовательность для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) или целым числом от 0 до 255.14841485Если *sub* пуст, возвращает количество пустых срезов между символами, равное длине объекта bytes плюс один.14861487Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.14881489#### `bytes.removeprefix(prefix, /)`14901491#### `bytearray.removeprefix(prefix, /)`14921493Если двоичные данные начинаются со строки *prefix*, возвращается `bytes[len(prefix):]`. В противном случае возвращается копия исходных двоичных данных:14941495```python1496>>> b'TestHook'.removeprefix(b'Test')1497b'Hook'1498>>> b'BaseTestCase'.removeprefix(b'Test')1499b'BaseTestCase'1500```15011502Значением *prefix* может быть любой [байтоподобный объект](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).15031504> **Примечание**1505>1506> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.15071508Добавлено в версии 3.9.15091510#### `bytes.removesuffix(suffix, /)`15111512#### `bytearray.removesuffix(suffix, /)`15131514Если двоичные данные оканчиваются строкой *suffix* и эта *suffix* не пуста, возвращается `bytes[:-len(suffix)]`. В противном случае возвращается копия исходных двоичных данных:15151516```python1517>>> b'MiscTests'.removesuffix(b'Tests')1518b'Misc'1519>>> b'TmpDirMixin'.removesuffix(b'Tests')1520b'TmpDirMixin'1521```15221523Значением *suffix* может быть любой [байтоподобный объект](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).15241525> **Примечание**1526>1527> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.15281529Добавлено в версии 3.9.15301531#### `bytes.decode(encoding='utf-8', errors='strict')`15321533#### `bytearray.decode(encoding='utf-8', errors='strict')`15341535Возвращает байты, декодированные в [`str`](https://python-all.ru/3.12/library/stdtypes.html#str).15361537*encoding* по умолчанию равен `'utf-8'`; список возможных значений см. в [Стандартные кодировки](https://python-all.ru/3.12/library/codecs.html#standard-encodings).15381539Параметр *errors* управляет обработкой ошибок декодирования. Если `'strict'` (по умолчанию), возбуждается исключение [`UnicodeError`](https://python-all.ru/3.12/library/exceptions.html#UnicodeError). Другие возможные значения: `'ignore'`, `'replace'`, и любое другое имя, зарегистрированное через [`codecs.register_error()`](https://python-all.ru/3.12/library/codecs.html#codecs.register_error). Подробнее см. в [Обработчики ошибок](https://python-all.ru/3.12/library/codecs.html#error-handlers).15401541По соображениям производительности значение *errors* не проверяется на корректность, пока не произойдёт ошибка декодирования, не будет включён [Режим разработки Python](https://python-all.ru/3.12/library/devmode.html#devmode) или не будет использована [отладочная сборка](https://python-all.ru/3.12/using/configure.html#debug-build).15421543> **Примечание**1544>1545> Передача аргумента *encoding* в [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) позволяет декодировать любой [байтоподобный объект](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) напрямую, без необходимости создавать временный объект `bytes` или `bytearray`.15461547Изменено в версии 3.1: Добавлена поддержка именованных аргументов.15481549Изменено в версии 3.9: Значение аргумента *errors* теперь проверяется в [Режиме разработки Python](https://python-all.ru/3.12/library/devmode.html#devmode) и в [режиме отладки](https://python-all.ru/3.12/using/configure.html#debug-build).15501551#### `bytes.endswith(suffix[, start[, end]])`15521553#### `bytearray.endswith(suffix[, start[, end]])`15541555Возвращает `True`, если двоичные данные оканчиваются указанным *suffix*, в противном случае возвращает `False`. *suffix* также может быть кортежем суффиксов для поиска. С необязательным *start* проверка начинается с этой позиции. С необязательным *end* сравнение прекращается на этой позиции.15561557Искомый суффикс (или суффиксы) может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).15581559#### `bytes.find(sub[, start[, end]])`15601561#### `bytearray.find(sub[, start[, end]])`15621563Возвращает наименьший индекс в данных, на котором найдена подпоследовательность *sub*, при условии, что *sub* содержится в срезе `s[start:end]`. Необязательные аргументы *start* и *end* интерпретируются как в нотации срезов. Возвращает `-1`, если *sub* не найдена.15641565Подпоследовательность для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) или целым числом от 0 до 255.15661567> **Примечание**1568>1569> Метод [`find()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.find) следует использовать только если нужно знать позицию *sub*. Чтобы проверить, является ли *sub* подстрокой, используйте оператор [`in`](https://python-all.ru/3.12/reference/expressions.html#in):1570>1571> ```python1572> >>> b'Py' in b'Python'1573> True1574> ```15751576Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.15771578#### `bytes.index(sub[, start[, end]])`15791580#### `bytearray.index(sub[, start[, end]])`15811582Как [`find()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.find), но возбуждает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если подпоследовательность не найдена.15831584Подпоследовательность для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) или целым числом от 0 до 255.15851586Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.15871588#### `bytes.join(iterable)`15891590#### `bytearray.join(iterable)`15911592Возвращает объект bytes или bytearray, представляющий собой конкатенацию последовательностей двоичных данных из *iterable*. Исключение [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) возникнет, если в *iterable* окажутся значения, не являющиеся [байтоподобными объектами](https://python-all.ru/3.12/glossary.html#term-bytes-like-object), включая объекты [`str`](https://python-all.ru/3.12/library/stdtypes.html#str). Разделителем между элементами служит содержимое объекта bytes или bytearray, предоставляющего этот метод.15931594#### `static bytes.maketrans(from, to)`15951596#### `static bytearray.maketrans(from, to)`15971598Этот статический метод возвращает таблицу перевода, пригодную для использования с [`bytes.translate()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.translate), которая сопоставляет каждый символ из *from* с символом на той же позиции в *to*; *from* и *to* оба должны быть [байтоподобными объектами](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) и иметь одинаковую длину.15991600Добавлено в версии 3.1.16011602#### `bytes.partition(sep)`16031604#### `bytearray.partition(sep)`16051606Разделяет последовательность по первому вхождению *sep* и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель (или его копию bytearray) и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий копию исходной последовательности, за которой следуют два пустых объекта bytes или bytearray.16071608Разделитель для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).16091610#### `bytes.replace(old, new[, count])`16111612#### `bytearray.replace(old, new[, count])`16131614Возвращает копию последовательности, в которой все вхождения подпоследовательности *old* заменены на *new*. Если задан необязательный аргумент *count*, заменяются только первые *count* вхождений.16151616Искомая подпоследовательность и её замена могут быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).16171618> **Примечание**1619>1620> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.16211622#### `bytes.rfind(sub[, start[, end]])`16231624#### `bytearray.rfind(sub[, start[, end]])`16251626Возвращает наибольший индекс в последовательности, на котором найдена подпоследовательность *sub*, так что *sub* находится в пределах `s[start:end]`. Необязательные аргументы *start* и *end* интерпретируются как в записи среза. В случае отсутствия возвращает `-1`.16271628Подпоследовательность для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) или целым числом от 0 до 255.16291630Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.16311632#### `bytes.rindex(sub[, start[, end]])`16331634#### `bytearray.rindex(sub[, start[, end]])`16351636Действует как [`rfind()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.rfind), но вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если подпоследовательность *sub* не найдена.16371638Подпоследовательность для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object) или целым числом от 0 до 255.16391640Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.16411642#### `bytes.rpartition(sep)`16431644#### `bytearray.rpartition(sep)`16451646Разделяет последовательность по последнему вхождению *sep* и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель (или его копию bytearray) и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий два пустых объекта bytes или bytearray, за которыми следует копия исходной последовательности.16471648Разделитель для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).16491650#### `bytes.startswith(prefix[, start[, end]])`16511652#### `bytearray.startswith(prefix[, start[, end]])`16531654Возвращает `True`, если двоичные данные начинаются с указанного *префикса*, иначе возвращает `False`. *Префикс* также может быть кортежем префиксов для поиска. С необязательным *start* проверка начинается с этой позиции. С необязательным *end* сравнение останавливается на этой позиции.16551656Префикс(ы) для поиска может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).16571658#### `bytes.translate(table, /, delete=b'')`16591660#### `bytearray.translate(table, /, delete=b'')`16611662Возвращает копию объекта bytes или bytearray, из которой удалены все байты, встречающиеся в необязательном аргументе *delete*, а оставшиеся байты преобразованы через заданную таблицу перекодировки, которая должна быть объектом bytes длиной 256.16631664Для создания таблицы перекодировки можно использовать метод [`bytes.maketrans()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.maketrans).16651666Установите аргумент *table* равным `None` для преобразований, которые только удаляют символы:16671668```python1669>>> b'read this short text'.translate(None, b'aeiou')1670b'rd ths shrt txt'1671```16721673Изменено в версии 3.6: *delete* теперь поддерживается как именованный аргумент.16741675Следующие методы объектов bytes и bytearray имеют поведение по умолчанию, предполагающее использование бинарных форматов, совместимых с ASCII, но их можно использовать с произвольными двоичными данными, передав соответствующие аргументы. Обратите внимание, что все методы bytearray в этом разделе *не* работают на месте, а вместо этого создают новые объекты.16761677#### `bytes.center(width[, fillbyte])`16781679#### `bytearray.center(width[, fillbyte])`16801681Возвращает копию объекта, выровненную по центру в последовательности длины *width*. Заполнение выполняется с помощью указанного *fillbyte* (по умолчанию – пробел ASCII). Для объектов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) исходная последовательность возвращается, если *width* меньше или равно `len(s)`.16821683> **Примечание**1684>1685> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.16861687#### `bytes.ljust(width[, fillbyte])`16881689#### `bytearray.ljust(width[, fillbyte])`16901691Возвращает копию объекта, выровненную по левому краю в последовательности длины *width*. Заполнение выполняется с помощью указанного *fillbyte* (по умолчанию – пробел ASCII). Для объектов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) исходная последовательность возвращается, если *width* меньше или равно `len(s)`.16921693> **Примечание**1694>1695> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.16961697#### `bytes.lstrip([chars])`16981699#### `bytearray.lstrip([chars])`17001701Возвращает копию последовательности с удалёнными указанными начальными байтами. Аргумент *chars* – это двоичная последовательность, задающая набор значений байтов для удаления; название связано с тем, что этот метод обычно используется с ASCII-символами. Если аргумент опущен или равен `None`, то *chars* по умолчанию удаляет ASCII-пробелы. Аргумент *chars* не является префиксом; скорее, удаляются все комбинации его значений:17021703```python1704>>> b'   spacious   '.lstrip()1705b'spacious   '1706>>> b'www.example.com'.lstrip(b'cmowz.')1707b'example.com'1708```17091710Двоичная последовательность значений байтов для удаления может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object). См. [`removeprefix()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.removeprefix) для метода, который удаляет одну строку-префикс, а не набор символов. Например:17111712```python1713>>> b'Arthur: three!'.lstrip(b'Arthur: ')1714b'ee!'1715>>> b'Arthur: three!'.removeprefix(b'Arthur: ')1716b'three!'1717```17181719> **Примечание**1720>1721> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.17221723#### `bytes.rjust(width[, fillbyte])`17241725#### `bytearray.rjust(width[, fillbyte])`17261727Возвращает копию объекта, выровненную по правому краю в последовательности длины *width*. Заполнение выполняется с помощью указанного *fillbyte* (по умолчанию – пробел ASCII). Для объектов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) исходная последовательность возвращается, если *width* меньше или равно `len(s)`.17281729> **Примечание**1730>1731> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.17321733#### `bytes.rsplit(sep=None, maxsplit=-1)`17341735#### `bytearray.rsplit(sep=None, maxsplit=-1)`17361737Разделяет двоичную последовательность на подпоследовательности того же типа, используя *sep* в качестве строки-разделителя. Если указан *maxsplit*, выполняется не более *maxsplit* разделений, а именно *крайних справа*. Если *sep* не указан или равен `None`, любая подпоследовательность, состоящая только из пробельных символов ASCII, считается разделителем. За исключением разделения справа, [`rsplit()`](https://python-all.ru/3.12/library/stdtypes.html#bytearray.rsplit) ведёт себя как [`split()`](https://python-all.ru/3.12/library/stdtypes.html#bytearray.split), который подробно описан ниже.17381739#### `bytes.rstrip([chars])`17401741#### `bytearray.rstrip([chars])`17421743Возвращает копию последовательности с удалёнными указанными конечными байтами. Аргумент *chars* – бинарная последовательность, задающая набор значений байтов для удаления; название связано с тем, что этот метод обычно используется с символами ASCII. Если он опущен или равен `None`, аргумент *chars* по умолчанию удаляет пробельные символы ASCII. Аргумент *chars* не является суффиксом; скорее, удаляются все комбинации его значений:17441745```python1746>>> b'   spacious   '.rstrip()1747b'   spacious'1748>>> b'mississippi'.rstrip(b'ipz')1749b'mississ'1750```17511752Двоичная последовательность удаляемых байтов может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object). См. [`removesuffix()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.removesuffix) для метода, который удаляет одну строку-суффикс, а не весь набор символов. Например:17531754```python1755>>> b'Monty Python'.rstrip(b' Python')1756b'M'1757>>> b'Monty Python'.removesuffix(b' Python')1758b'Monty'1759```17601761> **Примечание**1762>1763> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.17641765#### `bytes.split(sep=None, maxsplit=-1)`17661767#### `bytearray.split(sep=None, maxsplit=-1)`17681769Разделяет двоичную последовательность на подпоследовательности того же типа, используя *sep* в качестве строки-разделителя. Если указан *maxsplit* и он неотрицателен, то выполняется не более *maxsplit* разбиений (таким образом, список будет содержать не более `maxsplit+1` элементов). Если *maxsplit* не указан или равен `-1`, то ограничения на количество разбиений нет (выполняются все возможные разбиения).17701771Если указан *sep*, то последовательные разделители не группируются и считаются разграничивающими пустые подпоследовательности (например, `b'1,,2'.split(b',')` возвращает `[b'1', b'', b'2']`). Аргумент *sep* может состоять из многобайтовой последовательности как единого разделителя. Разбиение пустой последовательности с указанным разделителем возвращает `[b'']` или `[bytearray(b'')]` в зависимости от типа разбиваемого объекта. Аргумент *sep* может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).17721773Например:17741775```python1776>>> b'1,2,3'.split(b',')1777[b'1', b'2', b'3']1778>>> b'1,2,3'.split(b',', maxsplit=1)1779[b'1', b'2,3']1780>>> b'1,2,,3,'.split(b',')1781[b'1', b'2', b'', b'3', b'']1782>>> b'1<>2<>3<4'.split(b'<>')1783[b'1', b'2', b'3<4']1784```17851786Если *sep* не указан или равен `None`, применяется другой алгоритм разбиения: последовательности пробельных символов ASCII считаются одним разделителем, и результат не будет содержать пустых строк в начале или конце, если последовательность имеет начальные или завершающие пробелы. Следовательно, разбиение пустой последовательности или последовательности, состоящей только из пробельных символов ASCII, без указанного разделителя возвращает `[]`.17871788Например:17891790```python1791>>> b'1 2 3'.split()1792[b'1', b'2', b'3']1793>>> b'1 2 3'.split(maxsplit=1)1794[b'1', b'2 3']1795>>> b'   1   2   3   '.split()1796[b'1', b'2', b'3']1797```17981799#### `bytes.strip([chars])`18001801#### `bytearray.strip([chars])`18021803Возвращает копию последовательности с удалёнными указанными начальными и конечными байтами. Аргумент *chars* – бинарная последовательность, задающая набор значений байтов для удаления; название связано с тем, что этот метод обычно используется с символами ASCII. Если он опущен или равен `None`, аргумент *chars* по умолчанию удаляет пробельные символы ASCII. Аргумент *chars* не является префиксом или суффиксом; напротив, удаляются все комбинации его значений:18041805```python1806>>> b'   spacious   '.strip()1807b'spacious'1808>>> b'www.example.com'.strip(b'cmowz.')1809b'example'1810```18111812Двоичная последовательность удаляемых байтов может быть любым [байтоподобным объектом](https://python-all.ru/3.12/glossary.html#term-bytes-like-object).18131814> **Примечание**1815>1816> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.18171818Следующие методы для объектов bytes и bytearray предполагают использование двоичных форматов, совместимых с ASCII, и не должны применяться к произвольным двоичным данным. Обратите внимание, что все методы bytearray в этом разделе *не* работают на месте, а создают новые объекты.18191820#### `bytes.capitalize()`18211822#### `bytearray.capitalize()`18231824Возвращает копию последовательности, где каждый байт интерпретируется как символ ASCII, первый байт преобразуется в верхний регистр, а остальные – в нижний. Не-ASCII байты передаются без изменений.18251826> **Примечание**1827>1828> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.18291830#### `bytes.expandtabs(tabsize=8)`18311832#### `bytearray.expandtabs(tabsize=8)`18331834Возвращает копию последовательности, в которой все символы табуляции ASCII заменяются одним или несколькими пробелами ASCII, в зависимости от текущей позиции столбца и заданного размера табуляции. Позиции табуляции находятся каждые *tabsize* байт (по умолчанию 8, что даёт позиции табуляции на столбцах 0, 8, 16 и так далее). Для расширения последовательности текущий столбец устанавливается в ноль, и последовательность просматривается побайтно. Если байт является символом табуляции ASCII (`b'\t'`), в результат вставляется один или несколько пробелов, пока текущий столбец не сравняется со следующей позицией табуляции. (Сам символ табуляции не копируется.) Если текущий байт является символом новой строки ASCII (`b'\n'`) или возврата каретки (`b'\r'`), он копируется, а текущий столбец сбрасывается в ноль. Любое другое значение байта копируется без изменений, а текущий столбец увеличивается на единицу независимо от того, как представляется значение байта при печати:18351836```python1837>>> b'01\t012\t0123\t01234'.expandtabs()1838b'01      012     0123    01234'1839>>> b'01\t012\t0123\t01234'.expandtabs(4)1840b'01  012 0123    01234'1841```18421843> **Примечание**1844>1845> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.18461847#### `bytes.isalnum()`18481849#### `bytearray.isalnum()`18501851Возвращает `True`, если все байты в последовательности являются буквенными символами ASCII или десятичными цифрами ASCII и последовательность непуста, иначе `False`. Буквенные символы ASCII – это значения байтов из диапазона `b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'`. Десятичные цифры ASCII – это значения байтов из диапазона `b'0123456789'`.18521853Например:18541855```python1856>>> b'ABCabc1'.isalnum()1857True1858>>> b'ABC abc1'.isalnum()1859False1860```18611862#### `bytes.isalpha()`18631864#### `bytearray.isalpha()`18651866Возвращает `True`, если все байты в последовательности являются буквенными символами ASCII и последовательность непуста, иначе `False`. Буквенные символы ASCII – это значения байтов из диапазона `b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'`.18671868Например:18691870```python1871>>> b'ABCabc'.isalpha()1872True1873>>> b'ABCabc1'.isalpha()1874False1875```18761877#### `bytes.isascii()`18781879#### `bytearray.isascii()`18801881Возвращает `True`, если последовательность пуста или все байты в последовательности являются ASCII, иначе `False`. Байты ASCII находятся в диапазоне 0-0x7F.18821883Добавлено в версии 3.7.18841885#### `bytes.isdigit()`18861887#### `bytearray.isdigit()`18881889Возвращает `True`, если все байты последовательности являются десятичными цифрами ASCII и последовательность не пуста, и `False` в противном случае. Десятичные цифры ASCII – это значения байтов из диапазона `b'0123456789'`.18901891Например:18921893```python1894>>> b'1234'.isdigit()1895True1896>>> b'1.23'.isdigit()1897False1898```18991900#### `bytes.islower()`19011902#### `bytearray.islower()`19031904Возвращает `True`, если в последовательности есть хотя бы один символ ASCII в нижнем регистре и нет символов ASCII в верхнем регистре, и `False` в противном случае.19051906Например:19071908```python1909>>> b'hello world'.islower()1910True1911>>> b'Hello world'.islower()1912False1913```19141915Строчные ASCII-символы – это байтовые значения в диапазоне `b'abcdefghijklmnopqrstuvwxyz'`. Заглавные ASCII-символы – это байтовые значения в диапазоне `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`.19161917#### `bytes.isspace()`19181919#### `bytearray.isspace()`19201921Возвращает `True`, если все байты последовательности являются пробельными символами ASCII и последовательность не пуста, и `False` в противном случае. Пробельные символы ASCII – это значения байтов из диапазона `b' \t\n\r\x0b\f'` (пробел, табуляция, перевод строки, возврат каретки, вертикальная табуляция, перевод страницы).19221923#### `bytes.istitle()`19241925#### `bytearray.istitle()`19261927Возвращает `True`, если последовательность находится в регистре заголовка (titlecase) ASCII и не пуста, и `False` в противном случае. См. [`bytes.title()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.title) для подробностей об определении «titlecase».19281929Например:19301931```python1932>>> b'Hello World'.istitle()1933True1934>>> b'Hello world'.istitle()1935False1936```19371938#### `bytes.isupper()`19391940#### `bytearray.isupper()`19411942Возвращает `True`, если в последовательности есть хотя бы один алфавитный символ ASCII в верхнем регистре и нет символов ASCII в нижнем регистре, и `False` в противном случае.19431944Например:19451946```python1947>>> b'HELLO WORLD'.isupper()1948True1949>>> b'Hello world'.isupper()1950False1951```19521953Строчные ASCII-символы – это байтовые значения в диапазоне `b'abcdefghijklmnopqrstuvwxyz'`. Заглавные ASCII-символы – это байтовые значения в диапазоне `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`.19541955#### `bytes.lower()`19561957#### `bytearray.lower()`19581959Возвращает копию последовательности, в которой все символы ASCII в верхнем регистре преобразованы в соответствующие символы нижнего регистра.19601961Например:19621963```python1964>>> b'Hello World'.lower()1965b'hello world'1966```19671968Строчные ASCII-символы – это байтовые значения в диапазоне `b'abcdefghijklmnopqrstuvwxyz'`. Заглавные ASCII-символы – это байтовые значения в диапазоне `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`.19691970> **Примечание**1971>1972> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.19731974#### `bytes.splitlines(keepends=False)`19751976#### `bytearray.splitlines(keepends=False)`19771978Возвращает список строк в двоичной последовательности, разбивая по границам строк ASCII. Этот метод использует подход [универсального перевода строк](https://python-all.ru/3.12/glossary.html#term-universal-newlines) для разделения строк. Разрывы строк не включаются в итоговый список, если только *keepends* не задано и не равно true.19791980Например:19811982```python1983>>> b'ab c\n\nde fg\rkl\r\n'.splitlines()1984[b'ab c', b'', b'de fg', b'kl']1985>>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)1986[b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']1987```19881989В отличие от [`split()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.split), когда задана строка-разделитель *sep*, этот метод возвращает пустой список для пустой строки, и концевой разрыв строки не приводит к появлению дополнительной строки:19901991```python1992>>> b"".split(b'\n'), b"Two lines\n".split(b'\n')1993([b''], [b'Two lines', b''])1994>>> b"".splitlines(), b"One line\n".splitlines()1995([], [b'One line'])1996```19971998#### `bytes.swapcase()`19992000#### `bytearray.swapcase()`20012002Возвращает копию последовательности, в которой все символы ASCII в нижнем регистре преобразованы в соответствующие символы верхнего регистра и наоборот.20032004Например:20052006```python2007>>> b'Hello World'.swapcase()2008b'hELLO wORLD'2009```20102011Строчные ASCII-символы – это байтовые значения в диапазоне `b'abcdefghijklmnopqrstuvwxyz'`. Заглавные ASCII-символы – это байтовые значения в диапазоне `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`.20122013В отличие от [`str.swapcase()`](https://python-all.ru/3.12/library/stdtypes.html#str.swapcase), для двоичных версий всегда выполняется `bin.swapcase().swapcase() == bin`. Преобразования регистра симметричны в ASCII, хотя это не всегда верно для произвольных кодовых точек Unicode.20142015> **Примечание**2016>2017> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.20182019#### `bytes.title()`20202021#### `bytearray.title()`20222023Возвращает версию двоичной последовательности, в которой каждое слово начинается с заглавной буквы ASCII, а остальные символы – строчные. Байтовые значения без регистра остаются без изменений.20242025Например:20262027```python2028>>> b'Hello world'.title()2029b'Hello World'2030```20312032Строчные ASCII-символы – это байтовые значения в диапазоне `b'abcdefghijklmnopqrstuvwxyz'`. Заглавные ASCII-символы – это байтовые значения в диапазоне `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`. Все остальные байтовые значения не имеют регистра.20332034Алгоритм использует простое, не зависящее от языка определение слова как группы последовательных букв. Это определение работает во многих контекстах, но означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может быть нежелательным результатом:20352036```python2037>>> b"they're bill's friends from the UK".title()2038b"They'Re Bill'S Friends From The Uk"2039```20402041Обходной путь для апострофов можно построить с помощью регулярных выражений:20422043```python2044>>> import re2045>>> def titlecase(s):2046...     return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",2047...                   lambda mo: mo.group(0)[0:1].upper() +2048...                              mo.group(0)[1:].lower(),2049...                   s)2050...2051>>> titlecase(b"they're bill's friends.")2052b"They're Bill's Friends."2053```20542055> **Примечание**2056>2057> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.20582059#### `bytes.upper()`20602061#### `bytearray.upper()`20622063Возвращает копию последовательности, в которой все строчные ASCII-символы преобразованы в соответствующие заглавные.20642065Например:20662067```python2068>>> b'Hello World'.upper()2069b'HELLO WORLD'2070```20712072Строчные ASCII-символы – это байтовые значения в диапазоне `b'abcdefghijklmnopqrstuvwxyz'`. Заглавные ASCII-символы – это байтовые значения в диапазоне `b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`.20732074> **Примечание**2075>2076> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.20772078#### `bytes.zfill(width)`20792080#### `bytearray.zfill(width)`20812082Возвращает копию последовательности, дополненную слева цифрами `b'0'` ASCII, чтобы получить последовательность длины *width*. Ведущий знак (`b'+'`/ `b'-'`) обрабатывается путём вставки дополнения *после* знака, а не до него. Для объектов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) исходная последовательность возвращается, если *width* меньше или равно `len(seq)`.20832084Например:20852086```python2087>>> b"42".zfill(5)2088b'00042'2089>>> b"-42".zfill(5)2090b'-0042'2091```20922093> **Примечание**2094>2095> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.20962097### `printf`-стиль форматирования байтов20982099> **Примечание**2100>2101> Описанные здесь операции форматирования обладают рядом особенностей, которые приводят ко многим распространённым ошибкам (например, неправильное отображение кортежей и словарей). Если выводимое значение может быть кортежем или словарём, оберните его в кортеж.21022103Объекты bytes (`bytes`/`bytearray`) имеют одну уникальную встроенную операцию: оператор `%` (modulo). Он также известен как оператор *форматирования* или *интерполяции* байтов. Для выражения `format % values` (где *format* – это объект bytes) спецификации преобразования `%` в *format* заменяются на ноль или более элементов из *values*. Эффект аналогичен использованию `sprintf()` в языке C.21042105Если *format* требует один аргумент, *values* может быть одним объектом, не являющимся кортежем. [\[5\]](https://python-all.ru/3.12/library/stdtypes.html#id16) В противном случае *values* должен быть кортежем с точным числом элементов, указанным в форматном объекте bytes, или одним отображающим объектом (например, словарём).21062107Спецификатор преобразования содержит два или более символа и состоит из следующих компонентов, которые должны располагаться в указанном порядке:210821091. Символ `'%'`, обозначающий начало спецификатора.21102. Ключ отображения (необязательно), состоящий из последовательности символов в круглых скобках (например, `(somename)`).21113. Флаги преобразования (необязательно), влияющие на результат для некоторых типов преобразования.21124. Минимальная ширина поля (необязательно). Если указана как `'*'` (звёздочка), то фактическая ширина берётся из следующего элемента кортежа в *values*, а преобразуемый объект следует после минимальной ширины поля и необязательной точности.21135. Точность (необязательно), задаётся как `'.'` (точка), после которой следует значение точности. Если указана как `'*'` (звёздочка), фактическая точность берётся из следующего элемента кортежа в *values*, и преобразуемое значение следует после точности.21146. Модификатор длины (необязательно).21157. Тип преобразования.21162117Когда правый аргумент является словарём (или другим типом отображения), то форматы в объекте bytes *должны* включать ключ отображения в круглых скобках, указывающий на этот словарь, вставленный сразу после символа `'%'`. Ключ отображения выбирает значение для форматирования из отображения. Например:21182119```python2120>>> print(b'%(language)s has %(number)03d quote types.' %2121...       {b'language': b"Python", b"number": 2})2122b'Python has 002 quote types.'2123```21242125В этом случае в формате не должно быть спецификаторов `*` (поскольку они требуют последовательного списка параметров).21262127Символы флагов преобразования:21282129| Флаг | Значение |2130| --- | --- |2131| `'#'` | Преобразование значения будет использовать «альтернативную форму» (определённую ниже). |2132| `'0'` | Для числовых значений преобразование будет дополняться нулями. |2133| `'-'` | Преобразованное значение выравнивается по левому краю (переопределяет преобразование `'0'`, если указаны оба). |2134| `' '` | (пробел) Перед положительным числом (или пустой строкой), полученным в результате знакового преобразования, следует оставлять пробел. |2135| `'+'` | Знак (`'+'` или `'-'`) будет предшествовать преобразованию (переопределяет флаг «пробел»). |21362137Модификатор длины (`h`, `l` или `L`) может присутствовать, но игнорируется, поскольку он не нужен для Python – так, например, `%ld` идентично `%d`.21382139Типы преобразования:21402141| Преобразование | Значение | Примечания |2142| --- | --- | --- |2143| `'d'` | Десятичное целое со знаком. |  |2144| `'i'` | Десятичное целое со знаком. |  |2145| `'o'` | Восьмеричное значение со знаком. | (1) |2146| `'u'` | Устаревший тип – идентичен `'d'`. | (8) |2147| `'x'` | Шестнадцатеричное со знаком (строчные буквы). | (2) |2148| `'X'` | Шестнадцатеричное со знаком (заглавные буквы). | (2) |2149| `'e'` | Экспоненциальный формат с плавающей запятой (строчные буквы). | (3) |2150| `'E'` | Экспоненциальный формат с плавающей запятой (заглавные буквы). | (3) |2151| `'f'` | Десятичный формат с плавающей запятой. | (3) |2152| `'F'` | Десятичный формат с плавающей запятой. | (3) |2153| `'g'` | Формат с плавающей запятой. Использует экспоненциальный формат со строчными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат. | (4) |2154| `'G'` | Формат с плавающей запятой. Использует экспоненциальный формат с заглавными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат. | (4) |2155| `'c'` | Один байт (принимает целое число или объект из одного байта). |  |2156| `'b'` | Байты (любой объект, следующий [протоколу буфера](https://python-all.ru/3.12/c-api/buffer.html#bufferobjects) или имеющий [`__bytes__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__bytes__)). | (5) |2157| `'s'` | `'s'` – псевдоним для `'b'` и должен использоваться только в кодовых базах Python2/3. | (6) |2158| `'a'` | Байты (преобразует любой объект Python с помощью `repr(obj).encode('ascii', 'backslashreplace')`). | (5) |2159| `'r'` | `'r'` – псевдоним для `'a'` и должен использоваться только в кодовых базах Python2/3. | (7) |2160| `'%'` | Ни один аргумент не преобразуется, результатом является символ `'%'` в итоговом выводе. |  |21612162Примечания:216321641. Альтернативная форма вставляет ведущий восьмеричный спецификатор (`'0o'`) перед первой цифрой.21652. Альтернативная форма вставляет перед первой цифрой ведущий `'0x'` или `'0X'` (в зависимости от того, использовался ли формат `'x'` или `'X'`).21663. Альтернативная форма всегда включает десятичную точку в результат, даже если после неё нет цифр.21672168   Точность определяет количество цифр после десятичной точки; по умолчанию – 6.21694. Альтернативная форма всегда включает десятичную точку в результат, а конечные нули не удаляются, как это было бы в противном случае.21702171   Точность определяет количество значащих цифр до и после десятичной точки; по умолчанию – 6.21725. Если точность равна `N`, вывод усекается до `N` символов.21736. `b'%s'` устарело, но не будет удалено в серии 3.x.21747. `b'%r'` устарело, но не будет удалено в серии 3.x.21758. См. [**PEP 237**](https://python-all.ru/3.12/library/stdtypes.html).21762177> **Примечание**2178>2179> Версия этого метода для bytearray *не* работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.21802181> **См. также**2182>2183> [**PEP 461**](https://python-all.ru/3.12/library/stdtypes.html) – добавление форматирования % для bytes и bytearray21842185Добавлено в версии 3.5.21862187### Представления памяти21882189Объекты [`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview) позволяют коду Python получать доступ к внутренним данным объекта, поддерживающего [протокол буфера](https://python-all.ru/3.12/c-api/buffer.html#bufferobjects), без копирования.21902191#### `class memoryview(object)`21922193Создаёт [`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview), ссылающийся на *объект*. *Объект* должен поддерживать протокол буфера. Встроенные объекты, поддерживающие протокол буфера, включают [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray).21942195[`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview) имеет понятие *элемента*, который является атомарной единицей памяти, обрабатываемой исходным *объектом*. Для многих простых типов, таких как [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray), элемент – это один байт, но другие типы, например [`array.array`](https://python-all.ru/3.12/library/array.html#array.array), могут иметь более крупные элементы.21962197`len(view)` равно длине [`tolist`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.tolist), которая является вложенным списком, представляющим представление. Если `view.ndim = 1`, то это равно количеству элементов в представлении.21982199Изменено в версии 3.12: Если `view.ndim == 0`, `len(view)` теперь вызывает [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) вместо возврата 1.22002201Атрибут [`itemsize`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.itemsize) возвращает количество байт в одном элементе.22022203[`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview) поддерживает срезы и индексацию для доступа к своим данным. Одномерный срез приводит к подпредставлению:22042205```python2206>>> v = memoryview(b'abcefg')2207>>> v[1]2208982209>>> v[-1]22101032211>>> v[1:4]2212<memory at 0x7f3ddc9f4350>2213>>> bytes(v[1:4])2214b'bce'2215```22162217Если [`format`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.format) – один из собственных спецификаторов формата из модуля [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct), то также поддерживается индексация целым числом или кортежем целых чисел, которая возвращает отдельный *элемент* с правильным типом. Одномерные memoryview можно индексировать целым числом или кортежем из одного целого. Многомерные memoryview можно индексировать кортежами ровно из *ndim* целых чисел, где *ndim* – количество измерений. Нулевые memoryview можно индексировать пустым кортежем.22182219Вот пример с небайтовым форматом:22202221```python2222>>> import array2223>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])2224>>> m = memoryview(a)2225>>> m[0]2226-111111112227>>> m[-1]2228444444442229>>> m[::2].tolist()2230[-11111111, -33333333]2231```22322233Если базовый объект доступен для записи, memoryview поддерживает одномерное присваивание среза. Изменение размера не допускается:22342235```python2236>>> data = bytearray(b'abcefg')2237>>> v = memoryview(data)2238>>> v.readonly2239False2240>>> v[0] = ord(b'z')2241>>> data2242bytearray(b'zbcefg')2243>>> v[1:4] = b'123'2244>>> data2245bytearray(b'z123fg')2246>>> v[2:3] = b'spam'2247Traceback (most recent call last):2248  File "<stdin>", line 1, in <module>2249ValueError: memoryview assignment: lvalue and rvalue have different structures2250>>> v[2:6] = b'spam'2251>>> data2252bytearray(b'z1spam')2253```22542255Одномерные memoryview [хэшируемых](https://python-all.ru/3.12/glossary.html#term-hashable) (только для чтения) типов с форматами 'B', 'b' или 'c' также хэшируемы. Хэш определяется как `hash(m) == hash(m.tobytes())`:22562257```python2258>>> v = memoryview(b'abcefg')2259>>> hash(v) == hash(b'abcefg')2260True2261>>> hash(v[2:4]) == hash(b'ce')2262True2263>>> hash(v[::-2]) == hash(b'abcefg'[::-2])2264True2265```22662267Изменено в версии 3.3: Одномерные memoryview теперь можно разрезать. Одномерные memoryview с форматами 'B', 'b' или 'c' теперь [хэшируемы](https://python-all.ru/3.12/glossary.html#term-hashable).22682269Изменено в версии 3.4: memoryview теперь автоматически регистрируется с помощью [`collections.abc.Sequence`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Sequence)22702271Изменено в версии 3.5: memoryview теперь можно индексировать кортежем целых чисел.22722273[`memoryview`](https://python-all.ru/3.12/library/stdtypes.html#memoryview) имеет несколько методов:22742275#### `__eq__(exporter)`22762277Memoryview и [**PEP 3118**](https://python-all.ru/3.12/library/stdtypes.html) экспортёр равны, если их формы эквивалентны и если все соответствующие значения равны при интерпретации кодов формата операндов с использованием синтаксиса [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct).22782279Для подмножества строк формата [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct), поддерживаемых в настоящее время [`tolist()`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.tolist), `v` и `w` равны, если `v.tolist() == w.tolist()`:22802281```python2282>>> import array2283>>> a = array.array('I', [1, 2, 3, 4, 5])2284>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])2285>>> c = array.array('b', [5, 3, 1])2286>>> x = memoryview(a)2287>>> y = memoryview(b)2288>>> x == a == y == b2289True2290>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()2291True2292>>> z = y[::-2]2293>>> z == c2294True2295>>> z.tolist() == c.tolist()2296True2297```22982299Если какая-либо строка формата не поддерживается модулем [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct), то объекты всегда будут сравниваться как неравные (даже если строки формата и содержимое буфера одинаковы):23002301```python2302>>> from ctypes import BigEndianStructure, c_long2303>>> class BEPoint(BigEndianStructure):2304...     _fields_ = [("x", c_long), ("y", c_long)]2305...2306>>> point = BEPoint(100, 200)2307>>> a = memoryview(point)2308>>> b = memoryview(point)2309>>> a == point2310False2311>>> a == b2312False2313```23142315Обратите внимание, что, как и для чисел с плавающей точкой, `v is w` *не* подразумевает `v == w` для объектов memoryview.23162317Изменено в версии 3.3: В предыдущих версиях сравнивалась необработанная память без учёта формата элемента и логической структуры массива.23182319#### `tobytes(order='C')`23202321Возвращает данные в буфере в виде байтовой строки. Это эквивалентно вызову конструктора [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) для memoryview.23222323```python2324>>> m = memoryview(b"abc")2325>>> m.tobytes()2326b'abc'2327>>> bytes(m)2328b'abc'2329```23302331Для несплошных массивов результат равен плоскому списку, представляющему данные, со всеми элементами, преобразованными в байты. [`tobytes()`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.tobytes) поддерживает все строки формата, включая те, которые не соответствуют синтаксису модуля [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct).23322333Добавлено в версии 3.8: *order* может быть {‘C’, ‘F’, ‘A’}. Когда *order* равен ‘C’ или ‘F’, данные исходного массива преобразуются в порядок C или Fortran. Для сплошных представлений ‘A’ возвращает точную копию физической памяти. В частности, порядок Fortran в памяти сохраняется. Для несплошных представлений данные сначала преобразуются в C. *order=None* то же самое, что *order='C'*.23342335#### `hex([sep[, bytes_per_sep]])`23362337Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в буфере.23382339```python2340>>> m = memoryview(b"abc")2341>>> m.hex()2342'616263'2343```23442345Добавлено в версии 3.5.23462347Изменено в версии 3.8: Аналогично [`bytes.hex()`](https://python-all.ru/3.12/library/stdtypes.html#bytes.hex), [`memoryview.hex()`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.hex) теперь поддерживает необязательные параметры *sep* и *bytes\_per\_sep* для вставки разделителей между байтами в шестнадцатеричном выводе.23482349#### `tolist()`23502351Возвращает данные в буфере в виде списка элементов.23522353```python2354>>> memoryview(b'abc').tolist()2355[97, 98, 99]2356>>> import array2357>>> a = array.array('d', [1.1, 2.2, 3.3])2358>>> m = memoryview(a)2359>>> m.tolist()2360[1.1, 2.2, 3.3]2361```23622363Изменено в версии 3.3: [`tolist()`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.tolist) теперь поддерживает все односимвольные нативные форматы в синтаксисе модуля [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct), а также многомерные представления.23642365#### `toreadonly()`23662367Возвращает версию объекта memoryview, доступную только для чтения. Исходный объект memoryview остаётся неизменным.23682369```python2370>>> m = memoryview(bytearray(b'abc'))2371>>> mm = m.toreadonly()2372>>> mm.tolist()2373[97, 98, 99]2374>>> mm[0] = 422375Traceback (most recent call last):2376  File "<stdin>", line 1, in <module>2377TypeError: cannot modify read-only memory2378>>> m[0] = 432379>>> mm.tolist()2380[43, 98, 99]2381```23822383Добавлено в версии 3.8.23842385#### `release()`23862387Освобождает буфер, предоставляемый объектом memoryview. Многие объекты выполняют специальные действия, когда на них удерживается представление (например, [`bytearray`](https://python-all.ru/3.12/library/stdtypes.html#bytearray) временно запрещает изменение размера); поэтому вызов release() удобен для снятия этих ограничений (и освобождения любых зависших ресурсов) как можно скорее.23882389После вызова этого метода любая дальнейшая операция над представлением вызывает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) (за исключением самого [`release()`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.release), который может быть вызван несколько раз):23902391```python2392>>> m = memoryview(b'abc')2393>>> m.release()2394>>> m[0]2395Traceback (most recent call last):2396  File "<stdin>", line 1, in <module>2397ValueError: operation forbidden on released memoryview object2398```23992400Протокол управления контекстом может использоваться для аналогичного эффекта с помощью оператора `with`:24012402```python2403>>> with memoryview(b'abc') as m:2404...     m[0]2405...2406972407>>> m[0]2408Traceback (most recent call last):2409  File "<stdin>", line 1, in <module>2410ValueError: operation forbidden on released memoryview object2411```24122413Добавлено в версии 3.2.24142415#### `cast(format[, shape])`24162417Преобразует memoryview в новый формат или форму. *shape* по умолчанию равен `[byte_length//new_itemsize]`, что означает, что результирующее представление будет одномерным. Возвращаемое значение – новый memoryview, но сам буфер не копируется. Поддерживаемые преобразования: 1D -\> C-[contiguous](https://python-all.ru/3.12/glossary.html#term-contiguous) и C-contiguous -\> 1D.24182419Целевой формат ограничен одноэлементным нативным форматом в синтаксисе [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct). Один из форматов должен быть байтовым ('B', 'b' или 'c'). Байтовая длина результата должна совпадать с исходной длиной. Обратите внимание, что все байтовые длины могут зависеть от операционной системы.24202421Преобразование 1D/long в 1D/unsigned bytes:24222423```python2424>>> import array2425>>> a = array.array('l', [1,2,3])2426>>> x = memoryview(a)2427>>> x.format2428'l'2429>>> x.itemsize243082431>>> len(x)243232433>>> x.nbytes2434242435>>> y = x.cast('B')2436>>> y.format2437'B'2438>>> y.itemsize243912440>>> len(y)2441242442>>> y.nbytes2443242444```24452446Преобразование 1D/unsigned bytes в 1D/char:24472448```python2449>>> b = bytearray(b'zyz')2450>>> x = memoryview(b)2451>>> x[0] = b'a'2452Traceback (most recent call last):2453  ...2454TypeError: memoryview: invalid type for format 'B'2455>>> y = x.cast('c')2456>>> y[0] = b'a'2457>>> b2458bytearray(b'ayz')2459```24602461Преобразование 1D/bytes в 3D/ints в 1D/signed char:24622463```python2464>>> import struct2465>>> buf = struct.pack("i"*12, *list(range(12)))2466>>> x = memoryview(buf)2467>>> y = x.cast('i', shape=[2,2,3])2468>>> y.tolist()2469[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]2470>>> y.format2471'i'2472>>> y.itemsize247342474>>> len(y)247522476>>> y.nbytes2477482478>>> z = y.cast('b')2479>>> z.format2480'b'2481>>> z.itemsize248212483>>> len(z)2484482485>>> z.nbytes2486482487```24882489Преобразование 1D/unsigned long в 2D/unsigned long:24902491```python2492>>> buf = struct.pack("L"*6, *list(range(6)))2493>>> x = memoryview(buf)2494>>> y = x.cast('L', shape=[2,3])2495>>> len(y)249622497>>> y.nbytes2498482499>>> y.tolist()2500[[0, 1, 2], [3, 4, 5]]2501```25022503Добавлено в версии 3.3.25042505Изменено в версии 3.5: Исходный формат больше не ограничен при преобразовании в байтовое представление.25062507Также доступно несколько атрибутов только для чтения:25082509#### `obj`25102511Базовый объект memoryview:25122513```python2514>>> b  = bytearray(b'xyz')2515>>> m = memoryview(b)2516>>> m.obj is b2517True2518```25192520Добавлено в версии 3.3.25212522#### `nbytes`25232524`nbytes == product(shape) * itemsize == len(m.tobytes())`. Это объём в байтах, который массив занимал бы в непрерывном представлении. Он не обязательно равен `len(m)`:25252526```python2527>>> import array2528>>> a = array.array('i', [1,2,3,4,5])2529>>> m = memoryview(a)2530>>> len(m)253152532>>> m.nbytes2533202534>>> y = m[::2]2535>>> len(y)253632537>>> y.nbytes2538122539>>> len(y.tobytes())2540122541```25422543Многомерные массивы:25442545```python2546>>> import struct2547>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])2548>>> x = memoryview(buf)2549>>> y = x.cast('d', shape=[3,4])2550>>> y.tolist()2551[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]2552>>> len(y)255332554>>> y.nbytes2555962556```25572558Добавлено в версии 3.3.25592560#### `readonly`25612562Логическое значение bool, указывающее, доступна ли память только для чтения.25632564#### `format`25652566Строка, содержащая формат (в стиле модуля [`struct`](https://python-all.ru/3.12/library/struct.html#module-struct)) для каждого элемента в представлении. Memoryview может быть создан из экспортёров с произвольными строками формата, но некоторые методы (например, [`tolist()`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.tolist)) ограничены нативными одноэлементными форматами.25672568Изменено в версии 3.3: формат `'B'` теперь обрабатывается в соответствии с синтаксисом модуля struct. Это означает, что `memoryview(b'abc')[0] == b'abc'[0] == 97`.25692570#### `itemsize`25712572Размер в байтах каждого элемента memoryview:25732574```python2575>>> import array, struct2576>>> m = memoryview(array.array('H', [32000, 32001, 32002]))2577>>> m.itemsize257822579>>> m[0]2580320002581>>> struct.calcsize('H') == m.itemsize2582True2583```25842585#### `ndim`25862587Целое число, указывающее количество измерений многомерного массива, которое представляет данный блок памяти.25882589#### `shape`25902591Кортеж целых чисел длиной [`ndim`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.ndim), задающий форму памяти как N-мерного массива.25922593Изменено в версии 3.3: пустой кортеж вместо `None`, когда ndim = 0.25942595#### `strides`25962597Кортеж целых чисел длиной [`ndim`](https://python-all.ru/3.12/library/stdtypes.html#memoryview.ndim), задающий размер в байтах для доступа к каждому элементу по каждому измерению массива.25982599Изменено в версии 3.3: пустой кортеж вместо `None`, когда ndim = 0.26002601#### `suboffsets`26022603Используется внутри для массивов в стиле PIL. Значение носит только информационный характер.26042605#### `c_contiguous`26062607Логическое значение (bool), указывающее, является ли память C-[непрерывной](https://python-all.ru/3.12/glossary.html#term-contiguous).26082609Добавлено в версии 3.3.26102611#### `f_contiguous`26122613Логическое значение (bool), указывающее, является ли память [непрерывной](https://python-all.ru/3.12/glossary.html#term-contiguous) по Фортрану.26142615Добавлено в версии 3.3.26162617#### `contiguous`26182619Логическое значение (bool), указывающее, является ли память [непрерывной](https://python-all.ru/3.12/glossary.html#term-contiguous).26202621Добавлено в версии 3.3.26222623## Типы множеств – [`set`](https://python-all.ru/3.12/library/stdtypes.html#set), [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset)26242625Объект *set* – это неупорядоченная коллекция уникальных [хэшируемых](https://python-all.ru/3.12/glossary.html#term-hashable) объектов. Обычно используется для проверки принадлежности, удаления дубликатов из последовательности и выполнения математических операций, таких как пересечение, объединение, разность и симметрическая разность. (О других контейнерах см. встроенные классы [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict), [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) и [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple), а также модуль [`collections`](https://python-all.ru/3.12/library/collections.html#module-collections).)26262627Как и другие коллекции, множества поддерживают `x in set`, `len(set)` и `for x in set`. Будучи неупорядоченной коллекцией, множество не запоминает положение элементов или порядок вставки. Поэтому множества не поддерживают индексацию, срезы и другое поведение, свойственное последовательностям.26282629В Python есть два встроенных типа множеств: [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset). Тип [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) изменяемый – его содержимое можно менять с помощью методов вроде `add()` и `remove()`. Поскольку он изменяемый, у него нет хеш-значения, поэтому его нельзя использовать ни в качестве ключа словаря, ни как элемент другого множества. Тип [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset) неизменяемый и [хешируемый](https://python-all.ru/3.12/glossary.html#term-hashable) – его содержимое нельзя изменить после создания; соответственно, его можно использовать как ключ словаря или как элемент другого множества.26302631Непустые множества (кроме frozenset) можно создать, поместив список элементов, разделённый запятыми, в фигурные скобки, например: `{'jack', 'sjoerd'}`, а также с помощью конструктора [`set`](https://python-all.ru/3.12/library/stdtypes.html#set).26322633Конструкторы обоих классов работают одинаково:26342635#### `class set([iterable])`26362637#### `class frozenset([iterable])`26382639Возвращает новый объект set или frozenset, элементы которого берутся из *iterable*. Элементы множества должны быть [хэшируемыми](https://python-all.ru/3.12/glossary.html#term-hashable). Чтобы представлять множества множеств, внутренние множества должны быть [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset) объектами. Если *iterable* не указан, возвращается новое пустое множество.26402641Множества можно создать несколькими способами:26422643- Используйте разделённый запятыми список элементов в фигурных скобках: `{'jack', 'sjoerd'}`2644- Используйте абстракцию множества: `{c for c in 'abracadabra' if c not in 'abc'}`2645- Используйте конструктор типа: `set()`, `set('foobar')`, `set(['a', 'b', 'foo'])`26462647Экземпляры [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset) предоставляют следующие операции:26482649#### `len(s)`26502651Возвращает количество элементов в множестве *s* (мощность *s*).26522653#### `x in s`26542655Проверяет принадлежность *x* множеству *s*.26562657#### `x not in s`26582659Проверяет отсутствие *x* в множестве *s*.26602661#### `isdisjoint(other)`26622663Возвращает `True`, если у множества нет общих элементов с *other*. Множества не пересекаются тогда и только тогда, когда их пересечение – пустое множество.26642665#### `issubset(other)`26662667#### `set <= other`26682669Проверяет, принадлежит ли каждый элемент множества множеству *other*.26702671#### `set < other`26722673Проверяет, является ли множество строгим подмножеством *other*, то есть `set <= other and set != other`.26742675#### `issuperset(other)`26762677#### `set >= other`26782679Проверяет, принадлежит ли каждый элемент *other* множеству.26802681#### `set > other`26822683Проверяет, является ли множество строгим надмножеством *other*, то есть `set >= other and set != other`.26842685#### `union(*others)`26862687#### `set | other | ...`26882689Возвращает новое множество, содержащее элементы из исходного множества и всех остальных.26902691#### `intersection(*others)`26922693#### `set & other & ...`26942695Возвращает новое множество, содержащее элементы, общие для исходного множества и всех остальных.26962697#### `difference(*others)`26982699#### `set - other - ...`27002701Возвращает новое множество, содержащее элементы исходного множества, которых нет в других.27022703#### `symmetric_difference(other)`27042705#### `set ^ other`27062707Возвращает новое множество, содержащее элементы, которые есть либо в исходном множестве, либо в *other*, но не в обоих.27082709#### `copy()`27102711Возвращает поверхностную копию множества.27122713Обратите внимание: версии методов [`union()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.union), [`intersection()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.intersection), [`difference()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.difference), [`symmetric_difference()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.symmetric_difference), [`issubset()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.issubset) и [`issuperset()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.issuperset) без операторов принимают любой итерируемый объект в качестве аргумента. В отличие от них, их операторные аналоги требуют, чтобы их аргументы были множествами. Это предотвращает подверженные ошибкам конструкции вроде `set('abc') & 'cbs'` в пользу более читаемого `set('abc').intersection('cbs')`.27142715И [`set`](https://python-all.ru/3.12/library/stdtypes.html#set), и [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset) поддерживают сравнение множеств. Два множества равны тогда и только тогда, когда каждый элемент одного содержится в другом (каждое является подмножеством другого). Множество меньше другого тогда и только тогда, когда первое является собственным подмножеством второго (является подмножеством, но не равным). Множество больше другого тогда и только тогда, когда первое является собственным надмножеством второго (является надмножеством, но не равным).27162717Экземпляры [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) сравниваются с экземплярами [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset) на основе их элементов. Например, `set('abc') == frozenset('abc')` возвращает `True`, и то же самое делает `set('abc') in set([frozenset('abc')])`.27182719Сравнения на подмножество и равенство не обобщаются до функции полного упорядочения. Например, любые два непустых непересекающихся множества не равны и не являются подмножествами друг друга, поэтому *все* из следующих возвращают `False`: `a<b`, `a==b` или `a>b`.27202721Поскольку множества определяют лишь частичное упорядочение (отношения подмножеств), результат метода [`list.sort()`](https://python-all.ru/3.12/library/stdtypes.html#list.sort) для списков множеств не определён.27222723Элементы множества, как и ключи словаря, должны быть [хэшируемыми](https://python-all.ru/3.12/glossary.html#term-hashable).27242725Бинарные операции, в которых смешиваются экземпляры [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset), возвращают тип первого операнда. Например: `frozenset('ab') | set('bc')` возвращает экземпляр [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset).27262727В следующей таблице перечислены операции, доступные для [`set`](https://python-all.ru/3.12/library/stdtypes.html#set), которые не применимы к неизменяемым экземплярам [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset):27282729#### `update(*others)`27302731#### `set |= other | ...`27322733Обновляет множество, добавляя элементы из всех других.27342735#### `intersection_update(*others)`27362737#### `set &= other & ...`27382739Обновляет множество, оставляя только те элементы, которые есть в нём и во всех других.27402741#### `difference_update(*others)`27422743#### `set -= other | ...`27442745Обновляет множество, удаляя элементы, найденные в других.27462747#### `symmetric_difference_update(other)`27482749#### `set ^= other`27502751Обновляет множество, оставляя только элементы, которые есть в одном из множеств, но не в обоих.27522753#### `add(elem)`27542755Добавляет элемент *elem* в множество.27562757#### `remove(elem)`27582759Удаляет элемент *elem* из множества. Вызывает [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если *elem* отсутствует в множестве.27602761#### `discard(elem)`27622763Удаляет элемент *elem* из множества, если он присутствует.27642765#### `pop()`27662767Удаляет и возвращает произвольный элемент множества. Вызывает [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если множество пусто.27682769#### `clear()`27702771Удаляет все элементы из множества.27722773Обратите внимание: не-операторные версии методов [`update()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.update), [`intersection_update()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.intersection_update), [`difference_update()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.difference_update) и [`symmetric_difference_update()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.symmetric_difference_update) принимают любой итерируемый объект в качестве аргумента.27742775Обратите внимание: аргумент *elem* методов [`__contains__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__contains__), [`remove()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.remove) и [`discard()`](https://python-all.ru/3.12/library/stdtypes.html#frozenset.discard) может быть множеством. Для поддержки поиска эквивалентного frozenset создаётся временное множество из *elem*.27762777## Типы отображений – [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict)27782779Объект [отображения](https://python-all.ru/3.12/glossary.html#term-mapping) сопоставляет [хэшируемые](https://python-all.ru/3.12/glossary.html#term-hashable) значения с произвольными объектами. Отображения – изменяемые объекты. В настоящее время существует только один стандартный тип отображения – *словарь*. (О других контейнерах см. встроенные классы [`list`](https://python-all.ru/3.12/library/stdtypes.html#list), [`set`](https://python-all.ru/3.12/library/stdtypes.html#set) и [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple), а также модуль [`collections`](https://python-all.ru/3.12/library/collections.html#module-collections).)27802781Ключами словаря могут быть *почти* любые значения. Значения, которые не являются [хэшируемыми](https://python-all.ru/3.12/glossary.html#term-hashable), то есть содержащие списки, словари или другие изменяемые типы (сравниваемые по значению, а не по идентичности объекта), не могут использоваться в качестве ключей. Значения, которые сравниваются как равные (например, `1`, `1.0` и `True`), могут взаимозаменяемо использоваться для индексации одной и той же записи словаря.27822783#### `class dict(**kwargs)`27842785#### `class dict(mapping, **kwargs)`27862787#### `class dict(iterable, **kwargs)`27882789Возвращает новый словарь, инициализированный из необязательного позиционного аргумента и, возможно, пустого набора именованных аргументов.27902791Словари могут быть созданы несколькими способами:27922793- Используйте разделённый запятыми список пар `key: value` в фигурных скобках: `{'jack': 4098, 'sjoerd': 4127}` или `{4098: 'jack', 4127: 'sjoerd'}`2794- Используйте словарное включение: `{}`, `{x: x ** 2 for x in range(10)}`2795- Используйте конструктор типа: `dict()`, `dict([('foo', 100), ('bar', 200)])`, `dict(foo=100, bar=200)`27962797Если позиционный аргумент не передан, создаётся пустой словарь. Если позиционный аргумент передан и определяет метод `keys()`, словарь создаётся вызовом [`__getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__getitem__) для аргумента с каждым возвращённым ключом из этого метода. В противном случае позиционный аргумент должен быть объектом [итерируемый объект](https://python-all.ru/3.12/glossary.html#term-iterable). Каждый элемент итерируемого объекта также должен быть итерируемым ровно с двумя элементами. Первый элемент каждой пары становится ключом в новом словаре, а второй – соответствующим значением. Если ключ встречается более одного раза, последнее значение для этого ключа становится соответствующим значением в новом словаре.27982799Если переданы именованные аргументы, они и их значения добавляются в словарь, созданный из позиционного аргумента. Если добавляемый ключ уже присутствует, значение из именованного аргумента заменяет значение из позиционного аргумента.28002801В качестве иллюстрации следующие примеры возвращают словарь, равный `{"one": 1, "two": 2, "three": 3}`:28022803```python2804>>> a = dict(one=1, two=2, three=3)2805>>> b = {'one': 1, 'two': 2, 'three': 3}2806>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))2807>>> d = dict([('two', 2), ('one', 1), ('three', 3)])2808>>> e = dict({'three': 3, 'one': 1, 'two': 2})2809>>> f = dict({'one': 1, 'three': 3}, two=2)2810>>> a == b == c == d == e == f2811True2812```28132814Передача именованных аргументов, как в первом примере, работает только для ключей, являющихся допустимыми идентификаторами Python. В противном случае можно использовать любые допустимые ключи.28152816Вот операции, которые поддерживают словари (и, следовательно, должны поддерживать пользовательские типы отображений):28172818#### `list(d)`28192820Возвращает список всех ключей, используемых в словаре *d*.28212822#### `len(d)`28232824Возвращает количество элементов в словаре *d*.28252826#### `d[key]`28272828Возвращает элемент словаря *d* с ключом *key*. Вызывает [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если *key* отсутствует в отображении.28292830Если подкласс dict определяет метод `__missing__()`, а *key* отсутствует, операция `d[key]` вызывает этот метод с ключом *key* в качестве аргумента. Затем операция `d[key]` возвращает или возбуждает результат вызова `__missing__(key)`. Никакие другие операции или методы не вызывают `__missing__()`. Если `__missing__()` не определён, возбуждается [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError). `__missing__()` должен быть методом; он не может быть переменной экземпляра:28312832```python2833>>> class Counter(dict):2834...     def __missing__(self, key):2835...         return 02836...2837>>> c = Counter()2838>>> c['red']283902840>>> c['red'] += 12841>>> c['red']284212843```28442845В примере выше показана часть реализации [`collections.Counter`](https://python-all.ru/3.12/library/collections.html#collections.Counter). Для [`collections.defaultdict`](https://python-all.ru/3.12/library/collections.html#collections.defaultdict) используется другой метод `__missing__`.28462847#### `d[key] = value`28482849Устанавливает `d[key]` в значение *value*.28502851#### `del d[key]`28522853Удаляет `d[key]` из *d*. Вызывает [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если *key* отсутствует в отображении.28542855#### `key in d`28562857Возвращает `True`, если *d* содержит ключ *key*, иначе `False`.28582859#### `key not in d`28602861Эквивалентно `not key in d`.28622863#### `iter(d)`28642865Возвращает итератор по ключам словаря. Это краткая форма записи для `iter(d.keys())`.28662867#### `clear()`28682869Удаляет все элементы из словаря.28702871#### `copy()`28722873Возвращает поверхностную копию словаря.28742875#### `classmethod fromkeys(iterable, value=None, /)`28762877Создаёт новый словарь с ключами из *iterable* и значениями, установленными в *value*.28782879[`fromkeys()`](https://python-all.ru/3.12/library/stdtypes.html#dict.fromkeys) – это метод класса, возвращающий новый словарь. *value* по умолчанию равен `None`. Все значения ссылаются на один и тот же экземпляр, поэтому обычно не имеет смысла делать *value* изменяемым объектом, например пустым списком. Чтобы получить разные значения, используйте вместо этого [dict comprehension](https://python-all.ru/3.12/reference/expressions.html#dict).28802881#### `get(key, default=None, /)`28822883Возвращает значение для *key*, если *key* присутствует в словаре, иначе *default*. Если *default* не указан, по умолчанию принимается `None`, поэтому этот метод никогда не вызывает исключение [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError).28842885#### `items()`28862887Возвращает новое представление элементов словаря (пары `(key, value)`). См. [документацию по объектам-представлениям](https://python-all.ru/3.12/library/stdtypes.html#dict-views).28882889#### `keys()`28902891Возвращает новое представление ключей словаря. См. [документацию по объектам-представлениям](https://python-all.ru/3.12/library/stdtypes.html#dict-views).28922893#### `pop(key[, default])`28942895Если *key* присутствует в словаре, удаляет его и возвращает значение, иначе возвращает *default*. Если *default* не указан и *key* отсутствует в словаре, возбуждается [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError).28962897#### `popitem()`28982899Удаляет и возвращает пару `(key, value)` из словаря. Пары возвращаются в порядке LIFO.29002901[`popitem()`](https://python-all.ru/3.12/library/stdtypes.html#dict.popitem) полезен для разрушающего обхода словаря, как часто используется в алгоритмах над множествами. Если словарь пуст, вызов [`popitem()`](https://python-all.ru/3.12/library/stdtypes.html#dict.popitem) вызывает исключение [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError).29022903Изменено в версии 3.7: Теперь гарантируется порядок LIFO. В предыдущих версиях [`popitem()`](https://python-all.ru/3.12/library/stdtypes.html#dict.popitem) мог вернуть произвольную пару ключ/значение.29042905#### `reversed(d)`29062907Возвращает обратный итератор по ключам словаря. Это сокращение для `reversed(d.keys())`.29082909Добавлено в версии 3.8.29102911#### `setdefault(key, default=None, /)`29122913Если *key* есть в словаре, возвращает его значение. Если нет, вставляет *key* со значением *default* и возвращает *default*. *default* по умолчанию равен `None`.29142915#### `update([other])`29162917Обновляет словарь парами ключ/значение из *other*, перезаписывая существующие ключи. Возвращает `None`.29182919[`update()`](https://python-all.ru/3.12/library/stdtypes.html#dict.update) принимает либо другой объект с методом `keys()` (в этом случае [`__getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__getitem__) вызывается для каждого ключа, возвращённого этим методом), либо итерируемый объект пар ключ/значение (кортежи или другие итерабельные объекты длины два). Если указаны именованные аргументы, словарь затем обновляется этими парами: `d.update(red=1, blue=2)`.29202921#### `values()`29222923Возвращает новое представление (view) значений словаря. См. [документацию по объектам-представлениям](https://python-all.ru/3.12/library/stdtypes.html#dict-views).29242925Сравнение на равенство между двумя представлениями `dict.values()` всегда возвращает `False`. Это также относится к сравнению `dict.values()` с самим собой:29262927```python2928>>> d = {'a': 1}2929>>> d.values() == d.values()2930False2931```29322933#### `d | other`29342935Создаёт новый словарь, содержащий объединённые ключи и значения из *d* и *other*; оба должны быть словарями. Значения из *other* имеют приоритет, если *d* и *other* имеют одинаковые ключи.29362937Добавлено в версии 3.9.29382939#### `d |= other`29402941Обновляет словарь *d* ключами и значениями из *other*, который может быть либо [отображением](https://python-all.ru/3.12/glossary.html#term-mapping), либо [итерируемым объектом](https://python-all.ru/3.12/glossary.html#term-iterable) пар ключ/значение. Значения из *other* имеют приоритет, если *d* и *other* имеют одинаковые ключи.29422943Добавлено в версии 3.9.29442945Словари равны тогда и только тогда, когда они содержат одни и те же пары `(key, value)` (независимо от порядка). Операции сравнения порядка (‘\<’, ‘\<=’, ‘\>=’, ‘\>’) вызывают [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError).29462947Словари сохраняют порядок вставки. Обратите внимание, что обновление ключа не влияет на порядок. Ключи, добавленные после удаления, вставляются в конец.29482949```python2950>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}2951>>> d2952{'one': 1, 'two': 2, 'three': 3, 'four': 4}2953>>> list(d)2954['one', 'two', 'three', 'four']2955>>> list(d.values())2956[1, 2, 3, 4]2957>>> d["one"] = 422958>>> d2959{'one': 42, 'two': 2, 'three': 3, 'four': 4}2960>>> del d["two"]2961>>> d["two"] = None2962>>> d2963{'one': 42, 'three': 3, 'four': 4, 'two': None}2964```29652966Изменено в версии 3.7: Порядок словарей гарантированно соответствует порядку вставки. Это поведение было деталью реализации CPython начиная с версии 3.6.29672968Словари и их представления обратимы.29692970```python2971>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}2972>>> d2973{'one': 1, 'two': 2, 'three': 3, 'four': 4}2974>>> list(reversed(d))2975['four', 'three', 'two', 'one']2976>>> list(reversed(d.values()))2977[4, 3, 2, 1]2978>>> list(reversed(d.items()))2979[('four', 4), ('three', 3), ('two', 2), ('one', 1)]2980```29812982Изменено в версии 3.8: Теперь словари обратимы.29832984> **См. также**2985>2986> [`types.MappingProxyType`](https://python-all.ru/3.12/library/types.html#types.MappingProxyType) можно использовать для создания представления только для чтения для [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict).29872988### Объекты представления словаря29892990Объекты, возвращаемые [`dict.keys()`](https://python-all.ru/3.12/library/stdtypes.html#dict.keys), [`dict.values()`](https://python-all.ru/3.12/library/stdtypes.html#dict.values) и [`dict.items()`](https://python-all.ru/3.12/library/stdtypes.html#dict.items), являются *объектами-представлениями*. Они предоставляют динамическое представление записей словаря, то есть при изменении словаря представление отражает эти изменения.29912992Представления словаря можно обходить для получения соответствующих данных, а также они поддерживают проверку принадлежности:29932994#### `len(dictview)`29952996Возвращает количество записей в словаре.29972998#### `iter(dictview)`29993000Возвращает итератор по ключам, значениям или элементам (представленным в виде кортежей `(key, value)`) в словаре.30013002Ключи и значения обходятся в порядке вставки. Это позволяет создавать пары `(value, key)` с помощью [`zip()`](https://python-all.ru/3.12/library/functions.html#zip): `pairs = zip(d.values(), d.keys())`. Другой способ создать такой же список – `pairs = [(v, k) for (k, v) in d.items()]`.30033004Обход представлений во время добавления или удаления записей из словаря может вызвать [`RuntimeError`](https://python-all.ru/3.12/library/exceptions.html#RuntimeError) или не позволить обойти все записи.30053006Изменено в версии 3.7: Теперь гарантируется, что порядок словаря соответствует порядку вставки.30073008#### `x in dictview`30093010Возвращает `True`, если *x* находится в ключах, значениях или элементах (items) базового словаря (в последнем случае *x* должен быть кортежем `(key, value)`).30113012#### `reversed(dictview)`30133014Возвращает реверсивный итератор по ключам, значениям или элементам словаря. Представление (view) будет обходиться в порядке, обратном порядку вставки.30153016Изменено в версии 3.8: Представления словарей теперь можно обходить в обратном порядке.30173018#### `dictview.mapping`30193020Возвращает [`types.MappingProxyType`](https://python-all.ru/3.12/library/types.html#types.MappingProxyType), который оборачивает исходный словарь, на который ссылается представление.30213022Добавлено в версии 3.10.30233024Представления ключей (keys views) ведут себя как множества, поскольку их элементы уникальны и [хешируемы](https://python-all.ru/3.12/glossary.html#term-hashable). Представления элементов (items views) также поддерживают операции, подобные множествам, так как пары (ключ, значение) уникальны, а ключи хешируемы. Если все значения в представлении элементов также хешируемы, то такое представление может взаимодействовать с другими множествами. (Представления значений (values views) не рассматриваются как множества, поскольку элементы обычно не уникальны.) Для представлений, подобных множествам, доступны все операции, определённые для абстрактного базового класса [`collections.abc.Set`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Set) (например, `==`, `<` или `^`). При использовании операторов множеств представления, подобные множествам, принимают любой итерируемый объект в качестве второго операнда, в отличие от множеств, которые принимают только множества.30253026Пример использования представления словаря:30273028```python3029>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}3030>>> keys = dishes.keys()3031>>> values = dishes.values()30323033>>> # итерация3034>>> n = 03035>>> for val in values:3036...     n += val3037...3038>>> print(n)303950430403041>>> # ключи и значения перебираются в одном порядке (порядок вставки)3042>>> list(keys)3043['eggs', 'sausage', 'bacon', 'spam']3044>>> list(values)3045[2, 1, 1, 500]30463047>>> # объекты представления динамичны и отражают изменения словаря3048>>> del dishes['eggs']3049>>> del dishes['sausage']3050>>> list(keys)3051['bacon', 'spam']30523053>>> # операции над множествами3054>>> keys & {'eggs', 'bacon', 'salad'}3055{'bacon'}3056>>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}3057True3058>>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}3059True30603061>>> # получить прокси только для чтения исходного словаря3062>>> values.mapping3063mappingproxy({'bacon': 1, 'spam': 500})3064>>> values.mapping['spam']30655003066```30673068## Типы контекстных менеджеров30693070Оператор [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with) в Python поддерживает понятие контекста выполнения, определяемого контекстным менеджером. Это реализовано с помощью пары методов, которые позволяют пользовательским классам определять контекст выполнения, который входит в действие до выполнения тела оператора и выходит из него по завершении оператора:30713072#### `contextmanager.__enter__()`30733074Входит в контекст выполнения и возвращает либо этот объект, либо другой объект, связанный с контекстом выполнения. Значение, возвращаемое этим методом, связывается с идентификатором в предложении `as` оператора [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with), использующего данный контекстный менеджер.30753076Примером контекстного менеджера, который возвращает сам себя, является [файловый объект](https://python-all.ru/3.12/glossary.html#term-file-object). Файловые объекты возвращают себя из \_\_enter\_\_(), чтобы позволить использовать [`open()`](https://python-all.ru/3.12/library/functions.html#open) в качестве контекстного выражения в операторе [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with).30773078Примером контекстного менеджера, возвращающего связанный объект, является менеджер, возвращаемый [`decimal.localcontext()`](https://python-all.ru/3.12/library/decimal.html#decimal.localcontext). Такие менеджеры устанавливают активный десятичный контекст в копию исходного десятичного контекста и затем возвращают эту копию. Это позволяет вносить изменения в текущий десятичный контекст в теле оператора [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with), не затрагивая код за пределами оператора `with`.30793080#### `contextmanager.__exit__(exc_type, exc_val, exc_tb)`30813082Выходит из контекста выполнения и возвращает логический флаг, указывающий, следует ли подавить возникшее исключение. Если исключение возникло при выполнении тела оператора [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with), аргументы содержат тип исключения, значение и информацию о трассировке. В противном случае все три аргумента равны `None`.30833084Возврат истинного значения из этого метода приведет к тому, что оператор [`with`](https://python-all.ru/3.12/reference/compound_stmts.html#with) подавит исключение и продолжит выполнение с оператора, следующего сразу за оператором `with`. В противном случае исключение продолжит распространяться после завершения выполнения этого метода. Исключения, возникающие во время выполнения этого метода, заменят любое исключение, возникшее в теле оператора `with`.30853086Переданное исключение никогда не должно явно возбуждаться повторно – вместо этого метод должен вернуть ложное значение, чтобы указать, что метод завершился успешно и не хочет подавлять возникшее исключение. Это позволяет коду управления контекстом легко определить, произошёл ли на самом деле сбой метода [`__exit__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__exit__).30873088Python определяет несколько контекстных менеджеров для поддержки простой синхронизации потоков, своевременного закрытия файлов или других объектов, а также более простого управления активным контекстом десятичной арифметики. Конкретные типы не рассматриваются особым образом, помимо реализации протокола управления контекстом. См. модуль [`contextlib`](https://python-all.ru/3.12/library/contextlib.html#module-contextlib) для примеров.30893090[Генераторы](https://python-all.ru/3.12/glossary.html#term-generator) Python и декоратор [`contextlib.contextmanager`](https://python-all.ru/3.12/library/contextlib.html#contextlib.contextmanager) предоставляют удобный способ реализации этих протоколов. Если генераторная функция декорирована декоратором [`contextlib.contextmanager`](https://python-all.ru/3.12/library/contextlib.html#contextlib.contextmanager), она вернёт контекстный менеджер, реализующий необходимые методы [`__enter__()`](https://python-all.ru/3.12/library/stdtypes.html#contextmanager.__enter__) и [`__exit__()`](https://python-all.ru/3.12/library/stdtypes.html#contextmanager.__exit__), вместо итератора, который производит недекорированная генераторная функция.30913092Обратите внимание, что в структуре типа для объектов Python в Python/C API нет специального слота для любого из этих методов. Типы расширений, желающие определить эти методы, должны предоставлять их как обычный метод, доступный из Python. По сравнению с накладными расходами на установку контекста выполнения, накладные расходы на один поиск в словаре класса пренебрежимо малы.30933094## Типы аннотаций типов – [Generic Alias](https://python-all.ru/3.12/library/stdtypes.html#types-genericalias), [Union](https://python-all.ru/3.12/library/stdtypes.html#types-union)30953096Основными встроенными типами для [аннотаций типов](https://python-all.ru/3.12/glossary.html#term-annotation) являются [Generic Alias](https://python-all.ru/3.12/library/stdtypes.html#types-genericalias) и [Union](https://python-all.ru/3.12/library/stdtypes.html#types-union).30973098### Тип Generic Alias30993100Объекты `GenericAlias` обычно создаются путём [индексации (subscripting)](https://python-all.ru/3.12/reference/expressions.html#subscriptions) класса. Чаще всего они используются с [классами-контейнерами](https://python-all.ru/3.12/reference/datamodel.html#sequence-types), такими как [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) или [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict). Например, `list[int]` – это объект `GenericAlias`, созданный индексацией класса `list` с аргументом [`int`](https://python-all.ru/3.12/library/functions.html#int). Объекты `GenericAlias` предназначены в первую очередь для использования с [аннотациями типов](https://python-all.ru/3.12/glossary.html#term-annotation).31013102> **Примечание**3103>3104> Обычно индексировать (subscript) класс можно только в том случае, если класс реализует специальный метод [`__class_getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__class_getitem__).31053106Объект `GenericAlias` действует как прокси для [обобщённого типа](https://python-all.ru/3.12/glossary.html#term-generic-type), реализуя *параметризованные обобщённые типы (parameterized generics)*.31073108Для класса-контейнера аргумент(ы), передаваемые при [индексации (subscription)](https://python-all.ru/3.12/reference/expressions.html#subscriptions) класса, могут указывать тип(ы) элементов, которые содержит объект. Например, `set[bytes]` можно использовать в аннотациях типов для обозначения [`set`](https://python-all.ru/3.12/library/stdtypes.html#set), в котором все элементы имеют тип [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes).31093110Для класса, который определяет [`__class_getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__class_getitem__), но не является контейнером, аргумент(ы), передаваемые при индексации класса, часто указывают тип(ы) возвращаемого значения одного или нескольких методов, определённых для объекта. Например, [`regular expressions`](https://python-all.ru/3.12/library/re.html#module-re) можно использовать как для типа данных [`str`](https://python-all.ru/3.12/library/stdtypes.html#str), так и для типа данных [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes):31113112- Если `x = re.search('foo', 'foo')`, то `x` будет объектом [re.Match](https://python-all.ru/3.12/library/re.html#match-objects), в котором возвращаемые значения `x.group(0)` и `x[0]` будут иметь тип [`str`](https://python-all.ru/3.12/library/stdtypes.html#str). Такой объект можно представить в аннотациях типов с помощью `GenericAlias` `re.Match[str]`.3113- Если `y = re.search(b'bar', b'bar')` (обратите внимание на `b` для [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes)), `y` также будет экземпляром `re.Match`, но возвращаемые значения `y.group(0)` и `y[0]` будут оба иметь тип [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes). В аннотациях типов эта разновидность объектов [re.Match](https://python-all.ru/3.12/library/re.html#match-objects) обозначается с помощью `re.Match[bytes]`.31143115Объекты `GenericAlias` являются экземплярами класса [`types.GenericAlias`](https://python-all.ru/3.12/library/types.html#types.GenericAlias), который также можно использовать для создания объектов `GenericAlias` напрямую.31163117#### `T[X, Y, ...]`31183119Создаёт `GenericAlias`, представляющий тип `T`, параметризованный типами *X*, *Y* и другими в зависимости от используемого `T`. Например, функция, ожидающая [`list`](https://python-all.ru/3.12/library/stdtypes.html#list), содержащий элементы [`float`](https://python-all.ru/3.12/library/functions.html#float):31203121```python3122def average(values: list[float]) -> float:3123    return sum(values) / len(values)3124```31253126Ещё один пример для [отображений](https://python-all.ru/3.12/glossary.html#term-mapping) с использованием [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict), который является обобщённым типом, принимающим два параметра типа, представляющих тип ключа и тип значения. В этом примере функция ожидает `dict` с ключами типа [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) и значениями типа [`int`](https://python-all.ru/3.12/library/functions.html#int):31273128```python3129def send_post_request(url: str, body: dict[str, int]) -> None:3130    ...3131```31323133Встроенные функции [`isinstance()`](https://python-all.ru/3.12/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.12/library/functions.html#issubclass) не принимают типы `GenericAlias` для второго аргумента:31343135```python3136>>> isinstance([1, 2], list[str])3137Traceback (most recent call last):3138  File "<stdin>", line 1, in <module>3139TypeError: isinstance() argument 2 cannot be a parameterized generic3140```31413142Среда выполнения Python не принуждает к соблюдению [аннотаций типов](https://python-all.ru/3.12/glossary.html#term-annotation). Это распространяется на обобщённые типы и их параметры типа. При создании объекта-контейнера из `GenericAlias` элементы контейнера не проверяются на соответствие их типу. Например, следующий код не рекомендуется, но будет выполнен без ошибок:31433144```python3145>>> t = list[str]3146>>> t([1, 2, 3])3147[1, 2, 3]3148```31493150Кроме того, параметризованные обобщённые типы стирают параметры типа при создании объекта:31513152```python3153>>> t = list[str]3154>>> type(t)3155<class 'types.GenericAlias'>31563157>>> l = t()3158>>> type(l)3159<class 'list'>3160```31613162Вызов [`repr()`](https://python-all.ru/3.12/library/functions.html#repr) или [`str()`](https://python-all.ru/3.12/library/stdtypes.html#str) для обобщённого типа показывает параметризованный тип:31633164```python3165>>> repr(list[int])3166'list[int]'31673168>>> str(list[int])3169'list[int]'3170```31713172Метод [`__getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__getitem__) обобщённых контейнеров возбудит исключение, чтобы предотвратить ошибки вроде `dict[str][str]`:31733174```python3175>>> dict[str][str]3176Traceback (most recent call last):3177  ...3178TypeError: dict[str] is not a generic class3179```31803181Однако такие выражения допустимы, когда используются [переменные типа](https://python-all.ru/3.12/library/typing.html#generics). Индекс должен содержать столько же элементов, сколько элементов переменных типа в [`__args__`](https://python-all.ru/3.12/library/stdtypes.html#genericalias.__args__) объекта `GenericAlias`.31823183```python3184>>> from typing import TypeVar3185>>> Y = TypeVar('Y')3186>>> dict[str, Y][int]3187dict[str, int]3188```31893190#### Стандартные обобщённые классы31913192Следующие классы стандартной библиотеки поддерживают параметризованные обобщённые типы. Этот список не является исчерпывающим.31933194- [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple)3195- [`list`](https://python-all.ru/3.12/library/stdtypes.html#list)3196- [`dict`](https://python-all.ru/3.12/library/stdtypes.html#dict)3197- [`set`](https://python-all.ru/3.12/library/stdtypes.html#set)3198- [`frozenset`](https://python-all.ru/3.12/library/stdtypes.html#frozenset)3199- [`type`](https://python-all.ru/3.12/library/functions.html#type)3200- [`asyncio.Future`](https://python-all.ru/3.12/library/asyncio-future.html#asyncio.Future)3201- [`asyncio.Task`](https://python-all.ru/3.12/library/asyncio-task.html#asyncio.Task)3202- [`collections.deque`](https://python-all.ru/3.12/library/collections.html#collections.deque)3203- [`collections.defaultdict`](https://python-all.ru/3.12/library/collections.html#collections.defaultdict)3204- [`collections.OrderedDict`](https://python-all.ru/3.12/library/collections.html#collections.OrderedDict)3205- [`collections.Counter`](https://python-all.ru/3.12/library/collections.html#collections.Counter)3206- [`collections.ChainMap`](https://python-all.ru/3.12/library/collections.html#collections.ChainMap)3207- [`collections.abc.Awaitable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Awaitable)3208- [`collections.abc.Coroutine`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Coroutine)3209- [`collections.abc.AsyncIterable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.AsyncIterable)3210- [`collections.abc.AsyncIterator`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.AsyncIterator)3211- [`collections.abc.AsyncGenerator`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.AsyncGenerator)3212- [`collections.abc.Iterable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Iterable)3213- [`collections.abc.Iterator`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Iterator)3214- [`collections.abc.Generator`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Generator)3215- [`collections.abc.Reversible`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Reversible)3216- [`collections.abc.Container`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Container)3217- [`collections.abc.Collection`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Collection)3218- [`collections.abc.Callable`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Callable)3219- [`collections.abc.Set`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Set)3220- [`collections.abc.MutableSet`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.MutableSet)3221- [`collections.abc.Mapping`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Mapping)3222- [`collections.abc.MutableMapping`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.MutableMapping)3223- [`collections.abc.Sequence`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Sequence)3224- [`collections.abc.MutableSequence`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.MutableSequence)3225- [`collections.abc.ByteString`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.ByteString)3226- [`collections.abc.MappingView`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.MappingView)3227- [`collections.abc.KeysView`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.KeysView)3228- [`collections.abc.ItemsView`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.ItemsView)3229- [`collections.abc.ValuesView`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.ValuesView)3230- [`contextlib.AbstractContextManager`](https://python-all.ru/3.12/library/contextlib.html#contextlib.AbstractContextManager)3231- [`contextlib.AbstractAsyncContextManager`](https://python-all.ru/3.12/library/contextlib.html#contextlib.AbstractAsyncContextManager)3232- [`dataclasses.Field`](https://python-all.ru/3.12/library/dataclasses.html#dataclasses.Field)3233- [`functools.cached_property`](https://python-all.ru/3.12/library/functools.html#functools.cached_property)3234- [`functools.partialmethod`](https://python-all.ru/3.12/library/functools.html#functools.partialmethod)3235- [`os.PathLike`](https://python-all.ru/3.12/library/os.html#os.PathLike)3236- [`queue.LifoQueue`](https://python-all.ru/3.12/library/queue.html#queue.LifoQueue)3237- [`queue.Queue`](https://python-all.ru/3.12/library/queue.html#queue.Queue)3238- [`queue.PriorityQueue`](https://python-all.ru/3.12/library/queue.html#queue.PriorityQueue)3239- [`queue.SimpleQueue`](https://python-all.ru/3.12/library/queue.html#queue.SimpleQueue)3240- [re.Pattern](https://python-all.ru/3.12/library/re.html#re-objects)3241- [re.Match](https://python-all.ru/3.12/library/re.html#match-objects)3242- [`shelve.BsdDbShelf`](https://python-all.ru/3.12/library/shelve.html#shelve.BsdDbShelf)3243- [`shelve.DbfilenameShelf`](https://python-all.ru/3.12/library/shelve.html#shelve.DbfilenameShelf)3244- [`shelve.Shelf`](https://python-all.ru/3.12/library/shelve.html#shelve.Shelf)3245- [`types.MappingProxyType`](https://python-all.ru/3.12/library/types.html#types.MappingProxyType)3246- [`weakref.WeakKeyDictionary`](https://python-all.ru/3.12/library/weakref.html#weakref.WeakKeyDictionary)3247- [`weakref.WeakMethod`](https://python-all.ru/3.12/library/weakref.html#weakref.WeakMethod)3248- [`weakref.WeakSet`](https://python-all.ru/3.12/library/weakref.html#weakref.WeakSet)3249- [`weakref.WeakValueDictionary`](https://python-all.ru/3.12/library/weakref.html#weakref.WeakValueDictionary)32503251#### Специальные атрибуты объектов `GenericAlias`32523253Все параметризованные обобщённые типы реализуют специальные атрибуты только для чтения.32543255#### `genericalias.__origin__`32563257Этот атрибут указывает на непараметризованный обобщённый класс:32583259```python3260>>> list[int].__origin__3261<class 'list'>3262```32633264#### `genericalias.__args__`32653266Этот атрибут представляет собой [`tuple`](https://python-all.ru/3.12/library/stdtypes.html#tuple) (возможно, длины 1) обобщённых типов, переданных исходному [`__class_getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__class_getitem__) обобщённого класса:32673268```python3269>>> dict[str, list[int]].__args__3270(<class 'str'>, list[int])3271```32723273#### `genericalias.__parameters__`32743275Этот атрибут представляет собой лениво вычисляемый кортеж (возможно, пустой) уникальных переменных типа, найденных в `__args__`:32763277```python3278>>> from typing import TypeVar32793280>>> T = TypeVar('T')3281>>> list[T].__parameters__3282(~T,)3283```32843285> **Примечание**3286>3287> Объект `GenericAlias` с параметрами [`typing.ParamSpec`](https://python-all.ru/3.12/library/typing.html#typing.ParamSpec) может не иметь корректного `__parameters__` после подстановки, поскольку [`typing.ParamSpec`](https://python-all.ru/3.12/library/typing.html#typing.ParamSpec) предназначен в первую очередь для статической проверки типов.32883289#### `genericalias.__unpacked__`32903291Логическое значение, которое истинно, если псевдоним был распакован с помощью оператора `*` (см. [`TypeVarTuple`](https://python-all.ru/3.12/library/typing.html#typing.TypeVarTuple)).32923293Добавлено в версии 3.12.32943295> **См. также**3296>3297> **[**PEP 484**](https://python-all.ru/3.12/library/stdtypes.html) – Аннотации типов**3298>3299> Представление инфраструктуры Python для аннотаций типов.3300>3301> **[**PEP 585**](https://python-all.ru/3.12/library/stdtypes.html) – Аннотации обобщённых типов в стандартных коллекциях**3302>3303> Представление возможности нативно параметризовать классы стандартной библиотеки при условии, что они реализуют специальный метод класса [`__class_getitem__()`](https://python-all.ru/3.12/reference/datamodel.html#object.__class_getitem__).3304>3305> **[Дженерики](https://python-all.ru/3.12/library/typing.html#generics), [пользовательские дженерики](https://python-all.ru/3.12/library/typing.html#user-defined-generics) и [`typing.Generic`](https://python-all.ru/3.12/library/typing.html#typing.Generic)**3306>3307> Документация по реализации обобщённых классов, которые можно параметризовать во время выполнения и которые понятны статическим анализаторам типов.33083309Добавлено в версии 3.9.33103311### Тип объединения33123313Объект объединения содержит значение операции `|` (побитовое ИЛИ) над несколькими [объектами-типами](https://python-all.ru/3.12/library/stdtypes.html#bltin-type-objects). Эти типы предназначены в первую очередь для [аннотаций типов](https://python-all.ru/3.12/glossary.html#term-annotation). Выражение объединённого типа обеспечивает более чистый синтаксис подсказок типов по сравнению с [`typing.Union`](https://python-all.ru/3.12/library/typing.html#typing.Union).33143315#### `X | Y | ...`33163317Определяет объект объединения, который содержит типы *X*, *Y* и так далее. `X | Y` означает либо X, либо Y. Это эквивалентно `typing.Union[X, Y]`. Например, следующая функция ожидает аргумент типа [`int`](https://python-all.ru/3.12/library/functions.html#int) или [`float`](https://python-all.ru/3.12/library/functions.html#float):33183319```python3320def square(number: int | float) -> int | float:3321    return number ** 23322```33233324> **Примечание**3325>3326> Оператор `|` не может использоваться во время выполнения для определения объединений, в которых один или несколько членов являются прямой ссылкой. Например, `int | "Foo"`, где `"Foo"` является ссылкой на ещё не определённый класс, вызовет ошибку во время выполнения. Для объединений, содержащих прямые ссылки, всё выражение следует задавать в виде строки, например `"int | Foo"`.33273328#### `union_object == other`33293330Объекты объединения можно проверять на равенство с другими объектами объединения. Подробнее:33313332- Объединения объединений уплощаются:33333334  ```python3335  (int | str) | float == int | str | float3336  ```3337- Избыточные типы удаляются:33383339  ```python3340  int | str | int == int | str3341  ```3342- При сравнении объединений порядок не учитывается:33433344  ```python3345  int | str == str | int3346  ```3347- Он совместим с [`typing.Union`](https://python-all.ru/3.12/library/typing.html#typing.Union):33483349  ```python3350  int | str == typing.Union[int, str]3351  ```3352- Опциональные типы можно записать как объединение с `None`:33533354  ```python3355  str | None == typing.Optional[str]3356  ```33573358#### `isinstance(obj, union_object)`33593360#### `issubclass(obj, union_object)`33613362Вызовы [`isinstance()`](https://python-all.ru/3.12/library/functions.html#isinstance) и [`issubclass()`](https://python-all.ru/3.12/library/functions.html#issubclass) также поддерживаются с объектом объединения:33633364```python3365>>> isinstance("", int | str)3366True3367```33683369Однако [параметризованные дженерики](https://python-all.ru/3.12/library/stdtypes.html#types-genericalias) в объектах объединения проверить нельзя:33703371```python3372>>> isinstance(1, int | list[int])  # вычисление по короткой схеме3373True3374>>> isinstance([1], int | list[int])3375Traceback (most recent call last):3376  ...3377TypeError: isinstance() argument 2 cannot be a parameterized generic3378```33793380Тип объединения, доступный пользователю, можно получить из [`types.UnionType`](https://python-all.ru/3.12/library/types.html#types.UnionType) и использовать для проверок [`isinstance()`](https://python-all.ru/3.12/library/functions.html#isinstance). Объект этого типа невозможно создать напрямую:33813382```python3383>>> import types3384>>> isinstance(int | str, types.UnionType)3385True3386>>> types.UnionType()3387Traceback (most recent call last):3388  File "<stdin>", line 1, in <module>3389TypeError: cannot create 'types.UnionType' instances3390```33913392> **Примечание**3393>3394> Метод `__or__()` для объектов типов был добавлен для поддержки синтаксиса `X | Y`. Если метакласс реализует `__or__()`, Union может переопределить его:3395>3396> ```pycon3397> >>> class M(type):3398> ...     def __or__(self, other):3399> ...         return "Hello"3400> ...3401> >>> class C(metaclass=M):3402> ...     pass3403> ...3404> >>> C | int3405> 'Hello'3406> >>> int | C3407> int | C3408> ```34093410> **См. также**3411>3412> [**PEP 604**](https://python-all.ru/3.12/library/stdtypes.html) – PEP proposing the `X | Y` syntax and the Union type.34133414Добавлено в версии 3.10.34153416## Другие встроенные типы34173418Интерпретатор поддерживает несколько других видов объектов. Большинство из них поддерживают только одну или две операции.34193420### Модули34213422Единственная специальная операция над модулем – это доступ к атрибутам: `m.name`, где *m* – это модуль, а *name* обращается к имени, определённому в таблице символов модуля *m*. Атрибутам модуля можно присваивать значения. (Обратите внимание, что оператор [`import`](https://python-all.ru/3.12/reference/simple_stmts.html#import) строго говоря, не является операцией над объектом модуля; `import foo` не требует существования объекта модуля с именем *foo*, а требует (внешнего) *определения* для модуля с именем *foo* где-то.)34233424Специальным атрибутом каждого модуля является [`__dict__`](https://python-all.ru/3.12/reference/datamodel.html#object.__dict__). Это словарь, содержащий таблицу символов модуля. Изменение этого словаря действительно изменит таблицу символов модуля, но прямое присваивание атрибуту [`__dict__`](https://python-all.ru/3.12/reference/datamodel.html#object.__dict__) невозможно (можно написать `m.__dict__['a'] = 1`, что определит `m.a` как `1`, но нельзя написать `m.__dict__ = {}`). Изменять [`__dict__`](https://python-all.ru/3.12/reference/datamodel.html#object.__dict__) напрямую не рекомендуется.34253426Модули, встроенные в интерпретатор, записываются так: `<module 'sys' (built-in)>`. Если загружены из файла, они записываются как `<module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>`.34273428### Классы и экземпляры классов34293430См. [Объекты, значения и типы](https://python-all.ru/3.12/reference/datamodel.html#objects) и [Определения классов](https://python-all.ru/3.12/reference/compound_stmts.html#class).34313432### Функции34333434Объекты-функции создаются определениями функций. Единственная операция над объектом-функцией – это вызов: `func(argument-list)`.34353436На самом деле существует два вида объектов-функций: встроенные функции и определяемые пользователем функции. Оба поддерживают одну и ту же операцию (вызов функции), но реализация различается, отсюда разные типы объектов.34373438Дополнительную информацию см. в разделе [Определения функций](https://python-all.ru/3.12/reference/compound_stmts.html#function).34393440### Методы34413442Методы – это функции, вызываемые с помощью точечной нотации. Существует две разновидности: [встроенные методы](https://python-all.ru/3.12/reference/datamodel.html#builtin-methods) (например, `append()` у списков) и [методы экземпляров классов](https://python-all.ru/3.12/reference/datamodel.html#instance-methods). Встроенные методы описаны в типах, которые их поддерживают.34433444Если обратиться к методу (функции, определённой в пространстве имён класса) через экземпляр, возвращается специальный объект: *связанный метод* (также называемый [метод экземпляра](https://python-all.ru/3.12/reference/datamodel.html#instance-methods)). При вызове он добавляет аргумент `self` в список аргументов. Связанные методы имеют два специальных атрибута только для чтения: [`m.__self__`](https://python-all.ru/3.12/reference/datamodel.html#method.__self__) – объект, над которым выполняется метод, а [`m.__func__`](https://python-all.ru/3.12/reference/datamodel.html#method.__func__) – функция, реализующая метод. Вызов `m(arg-1, arg-2, ..., arg-n)` полностью эквивалентен вызову `m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)`.34453446Как и [объекты функций](https://python-all.ru/3.12/reference/datamodel.html#user-defined-funcs), объекты связанных методов поддерживают получение произвольных атрибутов. Однако, поскольку атрибуты метода на самом деле хранятся в базовом объекте функции ([`method.__func__`](https://python-all.ru/3.12/reference/datamodel.html#method.__func__)), установка атрибутов метода на связанных методах запрещена. Попытка установить атрибут на методе приводит к возникновению исключения [`AttributeError`](https://python-all.ru/3.12/library/exceptions.html#AttributeError). Чтобы установить атрибут метода, необходимо явно установить его на базовом объекте функции:34473448```pycon3449>>> class C:3450...     def method(self):3451...         pass3452...3453>>> c = C()3454>>> c.method.whoami = 'my name is method'  # нельзя установить на методе3455Traceback (most recent call last):3456  File "<stdin>", line 1, in <module>3457AttributeError: 'method' object has no attribute 'whoami'3458>>> c.method.__func__.whoami = 'my name is method'3459>>> c.method.whoami3460'my name is method'3461```34623463Дополнительную информацию см. в разделе [Методы экземпляров](https://python-all.ru/3.12/reference/datamodel.html#instance-methods).34643465### Объекты кода34663467Объекты кода используются реализацией для представления «псевдокомпилированного» исполняемого кода Python, например тела функции. Они отличаются от объектов функций тем, что не содержат ссылки на глобальное окружение выполнения. Объекты кода возвращаются встроенной функцией [`compile()`](https://python-all.ru/3.12/library/functions.html#compile) и могут быть извлечены из объектов функций через их атрибут [`__code__`](https://python-all.ru/3.12/reference/datamodel.html#function.__code__). Также см. модуль [`code`](https://python-all.ru/3.12/library/code.html#module-code).34683469Доступ к [`__code__`](https://python-all.ru/3.12/reference/datamodel.html#function.__code__) вызывает [событие аудита](https://python-all.ru/3.12/library/sys.html#auditing) `object.__getattr__` с аргументами `obj` и `"__code__"`.34703471Объект кода можно выполнить или вычислить, передав его (вместо строки исходного кода) встроенным функциям [`exec()`](https://python-all.ru/3.12/library/functions.html#exec) или [`eval()`](https://python-all.ru/3.12/library/functions.html#eval).34723473Дополнительную информацию см. в разделе [Стандартная иерархия типов](https://python-all.ru/3.12/reference/datamodel.html#types).34743475### Объекты типов34763477Объекты типов представляют различные типы объектов. Тип объекта можно получить с помощью встроенной функции [`type()`](https://python-all.ru/3.12/library/functions.html#type). Над типами не определено специальных операций. Стандартный модуль [`types`](https://python-all.ru/3.12/library/types.html#module-types) определяет имена для всех стандартных встроенных типов.34783479Типы записываются так: `<class 'int'>`.34803481### Объект Null34823483Этот объект возвращается функциями, которые не возвращают значение явно. Он не поддерживает никаких специальных операций. Существует ровно один нулевой объект с именем `None` (встроенное имя). `type(None)()` возвращает тот же синглтон.34843485Он записывается как `None`.34863487### Объект многоточия34883489Этот объект обычно используется при срезах (см. [Срезы](https://python-all.ru/3.12/reference/expressions.html#slicings)). Он не поддерживает никаких специальных операций. Существует ровно один объект-многоточие с именем [`Ellipsis`](https://python-all.ru/3.12/library/constants.html#Ellipsis) (встроенное имя). `type(Ellipsis)()` возвращает одиночный объект [`Ellipsis`](https://python-all.ru/3.12/library/constants.html#Ellipsis).34903491Он записывается как `Ellipsis` или `...`.34923493### Объект NotImplemented34943495Этот объект возвращается из сравнений и бинарных операций, когда они должны работать с типами, которые не поддерживают. Дополнительную информацию см. в разделе [Сравнения](https://python-all.ru/3.12/reference/expressions.html#comparisons). Существует ровно один объект [`NotImplemented`](https://python-all.ru/3.12/library/constants.html#NotImplemented). `type(NotImplemented)()` возвращает экземпляр-синглтон.34963497Он записывается как `NotImplemented`.34983499### Внутренние объекты35003501Эту информацию см. в разделе [Стандартная иерархия типов](https://python-all.ru/3.12/reference/datamodel.html#types). Там описываются [объекты стековых фреймов](https://python-all.ru/3.12/reference/datamodel.html#frame-objects), [объекты трассировки](https://python-all.ru/3.12/reference/datamodel.html#traceback-objects) и объекты срезов.35023503## Специальные атрибуты35043505Реализация добавляет несколько специальных атрибутов только для чтения к некоторым типам объектов, где это уместно. Некоторые из них не сообщаются встроенной функцией [`dir()`](https://python-all.ru/3.12/library/functions.html#dir).35063507#### `definition.__name__`35083509Имя класса, функции, метода, дескриптора или экземпляра генератора.35103511#### `definition.__qualname__`35123513[Полное имя](https://python-all.ru/3.12/glossary.html#term-qualified-name) класса, функции, метода, дескриптора, или экземпляра генератора.35143515Добавлено в версии 3.3.35163517#### `definition.__module__`35183519Имя модуля, в котором был определён класс или функция.35203521#### `definition.__doc__`35223523Строка документации класса или функции, или `None`, если не определена.35243525#### `definition.__type_params__`35263527[Параметры типа](https://python-all.ru/3.12/reference/compound_stmts.html#type-params) обобщённых классов, функций и [псевдонимов типов](https://python-all.ru/3.12/library/typing.html#type-aliases). Для классов и функций, которые не являются обобщёнными, это будет пустой кортеж.35283529Добавлено в версии 3.12.35303531## Ограничение длины преобразования целого числа в строку35323533В CPython существует глобальное ограничение на преобразование между [`int`](https://python-all.ru/3.12/library/functions.html#int) и [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) для смягчения атак типа «отказ в обслуживании». Это ограничение *только* применяется к десятичной или другим системам счисления, не являющимся степенями двойки. Преобразования в шестнадцатеричную, восьмеричную и двоичную системы не ограничены. Ограничение можно настроить.35343535Тип [`int`](https://python-all.ru/3.12/library/functions.html#int) в CPython – это число произвольной длины, хранящееся в двоичной форме (обычно называемое «bignum»). Не существует алгоритма, который мог бы преобразовать строку в двоичное целое или двоичное целое в строку за линейное время, *кроме* случая, когда основание является степенью двойки. Даже лучшие известные алгоритмы для основания 10 имеют субквадратичную сложность. Преобразование большого значения, такого как `int('1' * 500_000)`, может занять более секунды на быстром CPU.35363537Ограничение размера преобразования предлагает практический способ избежать [**CVE 2020-10735**](https://python-all.ru/3.12/library/stdtypes.html).35383539Ограничение применяется к количеству цифровых символов во входной или выходной строке, когда задействован нелинейный алгоритм преобразования. Символы подчёркивания и знак не учитываются в ограничении.35403541Когда операция превышает ограничение, вызывается [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError):35423543```pycon3544>>> import sys3545>>> sys.set_int_max_str_digits(4300)  # Для иллюстрации, это значение по умолчанию.3546>>> _ = int('2' * 5432)3547Traceback (most recent call last):3548...3549ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit3550>>> i = int('2' * 4300)3551>>> len(str(i))355243003553>>> i_squared = i*i3554>>> len(str(i_squared))3555Traceback (most recent call last):3556...3557ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit3558>>> len(hex(i_squared))355971443560>>> assert int(hex(i_squared), base=16) == i*i  # Шестнадцатеричный формат не ограничен.3561```35623563Значение ограничения по умолчанию – 4300 цифр, как указано в [`sys.int_info.default_max_str_digits`](https://python-all.ru/3.12/library/sys.html#sys.int_info). Наименьшее настраиваемое ограничение – 640 цифр, как указано в [`sys.int_info.str_digits_check_threshold`](https://python-all.ru/3.12/library/sys.html#sys.int_info).35643565Проверка:35663567```pycon3568>>> import sys3569>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info3570>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info3571>>> msg = int('578966293710682886880994035146873798396722250538762761564'3572...           '9252925514383915483333812743580549779436104706260696366600'3573...           '571186405732').to_bytes(53, 'big')3574...3575```35763577Добавлено в версии 3.12.35783579### Затронутые API35803581Ограничение применяется только к потенциально медленным преобразованиям между [`int`](https://python-all.ru/3.12/library/functions.html#int) и [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes):35823583- `int(string)` с основанием 10 по умолчанию.3584- `int(string, base)` для всех оснований, не являющихся степенью двойки.3585- `str(integer)`.3586- `repr(integer)`.3587- любое другое преобразование строки в основание 10, например `f"{integer}"`, `"{}".format(integer)` или `b"%d" % integer`.35883589Ограничения не применяются к функциям с линейным алгоритмом:35903591- `int(string, base)` с основанием 2, 4, 8, 16 или 32.3592- [`int.from_bytes()`](https://python-all.ru/3.12/library/stdtypes.html#int.from_bytes) и [`int.to_bytes()`](https://python-all.ru/3.12/library/stdtypes.html#int.to_bytes).3593- [`hex()`](https://python-all.ru/3.12/library/functions.html#hex), [`oct()`](https://python-all.ru/3.12/library/functions.html#oct), [`bin()`](https://python-all.ru/3.12/library/functions.html#bin).3594- [Язык описания форматов](https://python-all.ru/3.12/library/string.html#formatspec) для шестнадцатеричных, восьмеричных и двоичных чисел.3595- [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) в [`float`](https://python-all.ru/3.12/library/functions.html#float).3596- [`str`](https://python-all.ru/3.12/library/stdtypes.html#str) в [`decimal.Decimal`](https://python-all.ru/3.12/library/decimal.html#decimal.Decimal).35973598### Настройка ограничения35993600Перед запуском Python можно использовать переменную окружения или флаг командной строки интерпретатора для настройки ограничения:36013602- [`PYTHONINTMAXSTRDIGITS`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONINTMAXSTRDIGITS), например, `PYTHONINTMAXSTRDIGITS=640 python3`, чтобы установить ограничение 640, или `PYTHONINTMAXSTRDIGITS=0 python3`, чтобы отключить ограничение.3603- [`-X int_max_str_digits`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-X), например, `python3 -X int_max_str_digits=640`3604- [`sys.flags.int_max_str_digits`](https://python-all.ru/3.12/library/sys.html#sys.flags.int_max_str_digits) содержит значение [`PYTHONINTMAXSTRDIGITS`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONINTMAXSTRDIGITS) или [`-X int_max_str_digits`](https://python-all.ru/3.12/using/cmdline.html#cmdoption-X). Если заданы и переменная окружения, и опция `-X`, то опция `-X` имеет приоритет. Значение *-1* указывает, что обе не были установлены, поэтому при инициализации использовалось значение [`sys.int_info.default_max_str_digits`](https://python-all.ru/3.12/library/sys.html#sys.int_info.default_max_str_digits).36053606Из кода можно проверить текущий лимит и установить новый с помощью этих [`sys`](https://python-all.ru/3.12/library/sys.html#module-sys) API:36073608- [`sys.get_int_max_str_digits()`](https://python-all.ru/3.12/library/sys.html#sys.get_int_max_str_digits) и [`sys.set_int_max_str_digits()`](https://python-all.ru/3.12/library/sys.html#sys.set_int_max_str_digits) – это геттер и сеттер для лимита на уровне интерпретатора. Суб-интерпретаторы имеют свой собственный лимит.36093610Информацию о значениях по умолчанию и минимальном можно найти в [`sys.int_info`](https://python-all.ru/3.12/library/sys.html#sys.int_info):36113612- [`sys.int_info.default_max_str_digits`](https://python-all.ru/3.12/library/sys.html#sys.int_info) – это скомпилированный лимит по умолчанию.3613- [`sys.int_info.str_digits_check_threshold`](https://python-all.ru/3.12/library/sys.html#sys.int_info) – это наименьшее допустимое значение лимита (кроме 0, которое отключает его).36143615Добавлено в версии 3.12.36163617> **Внимание**3618>3619> Установка низкого лимита *может* привести к проблемам. Хотя это редко, существует код, содержащий десятичные целочисленные константы в исходниках, которые превышают минимальный порог. Следствие установки лимита: исходный код Python, содержащий десятичные целочисленные литералы длиннее лимита, вызовет ошибку при разборе, обычно во время запуска или импорта, или даже во время установки – в любой момент, когда актуальный `.pyc` ещё не существует для этого кода. Обходной путь для исходников, содержащих такие большие константы, – преобразовать их в `0x` шестнадцатеричную форму, так как у неё нет лимита.3620>3621> Тщательно тестируйте приложение, если используете низкий лимит. Убедитесь, что тесты запускаются с лимитом, установленным заранее через переменную окружения или флаг, чтобы он применялся во время запуска и даже на любом этапе установки, который может вызвать Python для предварительной компиляции `.py` исходников в `.pyc` файлы.36223623### Рекомендуемая конфигурация36243625Ожидается, что значение [`sys.int_info.default_max_str_digits`](https://python-all.ru/3.12/library/sys.html#sys.int_info.default_max_str_digits) по умолчанию будет приемлемым для большинства приложений. Если вашему приложению требуется другой лимит, установите его из главной точки входа с помощью кода, не зависящего от версии Python, поскольку эти API были добавлены в выпусках исправлений безопасности в версиях до 3.12.36263627Пример:36283629```python3630>>> import sys3631>>> if hasattr(sys, "set_int_max_str_digits"):3632...     upper_bound = 680003633...     lower_bound = 40043634...     current_limit = sys.get_int_max_str_digits()3635...     if current_limit == 0 or current_limit > upper_bound:3636...         sys.set_int_max_str_digits(upper_bound)3637...     elif current_limit < lower_bound:3638...         sys.set_int_max_str_digits(lower_bound)3639```36403641Если нужно полностью отключить его, установите значение `0`.36423643Сноски36443645\[[1](https://python-all.ru/3.12/library/stdtypes.html#id1)\]36463647Дополнительную информацию об этих специальных методах можно найти в Справочном руководстве Python ([Базовая настройка](https://python-all.ru/3.12/reference/datamodel.html#customization)).36483649\[[2](https://python-all.ru/3.12/library/stdtypes.html#id2)\]36503651Как следствие, список `[1, 2]` считается равным `[1.0, 2.0]`, и аналогично для кортежей.36523653\[[3](https://python-all.ru/3.12/library/stdtypes.html#id4)\]36543655Они должны иметь, поскольку синтаксический анализатор не может определить тип операндов.36563657\[4\]36583659([1](https://python-all.ru/3.12/library/stdtypes.html#id6),[2](https://python-all.ru/3.12/library/stdtypes.html#id7),[3](https://python-all.ru/3.12/library/stdtypes.html#id8),[4](https://python-all.ru/3.12/library/stdtypes.html#id9))36603661Символы с учётом регистра – это те, у которых свойство общей категории является одним из «Lu» (буква, верхний регистр), «Ll» (буква, нижний регистр) или «Lt» (буква, заглавная).36623663\[5\]36643665([1](https://python-all.ru/3.12/library/stdtypes.html#id10),[2](https://python-all.ru/3.12/library/stdtypes.html#id11))36663667Чтобы отформатировать только кортеж, следует предоставить одноэлементный кортеж, единственным элементом которого является форматируемый кортеж.3668