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

Встроенные типыBuilt-in Types

В следующих разделах описываются стандартные типы, встроенные в интерпретатор.

Основные встроенные типы: числовые типы, последовательности, отображения, классы, экземпляры и исключения.

Некоторые классы коллекций являются изменяемыми. Методы, которые добавляют, удаляют или перестраивают их элементы на месте и не возвращают конкретный элемент, никогда не возвращают сам экземпляр коллекции, а None.

Некоторые операции поддерживаются несколькими типами объектов; в частности, практически все объекты можно сравнивать на равенство, проверять на истинность и преобразовывать в строку (с помощью функции repr() или немного отличающейся функции str()). Последняя функция неявно используется, когда объект выводится функцией print().

Проверка на истинностьTruth Value Testing

Любой объект можно проверить на истинность для использования в условии if или while или в качестве операнда булевых операций, описанных ниже.

По умолчанию объект считается истинным, если его класс не определяет метод __bool__(), возвращающий False, или метод __len__(), возвращающий ноль, при вызове с этим объектом. [1] Если один из методов вызывает исключение при вызове, исключение распространяется, и объект не имеет значения истинности (например, NotImplemented). Вот большинство встроенных объектов, которые считаются ложными:

  • константы, определённые как ложные: None и False

  • ноль любого числового типа: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)

  • пустые последовательности и коллекции: '', (), [], {}, set(), range(0)

Операции и встроенные функции, возвращающие булев результат, всегда возвращают 0 или False для ложного и 1 или True для истинного, если не указано иное. (Важное исключение: булевы операции or и and всегда возвращают один из своих операндов.)

Булевы операции – and, or, notBoolean Operations – and, or, not

Это булевы операции в порядке возрастания приоритета:

Операция

Результат

Примечания

x or y

если x истинно, то x, иначе y

(1)

x and y

если x ложно, то x, иначе y

(2)

not x

если x ложно, то True, иначе False

(3)

Примечания:

  1. Это оператор с сокращённым вычислением: второй аргумент вычисляется, только если первый ложен.

  2. Это оператор с сокращённым вычислением: второй аргумент вычисляется, только если первый истинен.

  3. not имеет более низкий приоритет, чем небулевы операторы, поэтому not a == b интерпретируется как not (a == b), а a == not b является синтаксической ошибкой.

СравненияComparisons

В Python есть восемь операций сравнения. Все они имеют одинаковый приоритет (выше, чем у булевых операций). Сравнения можно произвольно объединять в цепочки; например, x < y <= z эквивалентно x < y and y <= z, за исключением того, что y вычисляется только один раз (но в обоих случаях z вообще не вычисляется, если x < y оказывается ложным).

В этой таблице приведены операции сравнения:

Операция

Значение

<

строго меньше

<=

меньше или равно

>

строго больше

>=

больше или равно

==

равно

!=

не равно

is

идентичность объектов

is not

отрицание идентичности объектов

Если не указано иное, объекты разных типов никогда не сравниваются как равные. Оператор == всегда определён, но для некоторых типов объектов (например, объектов классов) эквивалентен is. Операторы <, <=, > и >= определены только там, где они имеют смысл; например, они вызывают исключение TypeError, если один из аргументов – комплексное число.

Разные экземпляры класса обычно сравниваются как неравные, если только класс не определяет метод __eq__().

Экземпляры класса нельзя упорядочить относительно других экземпляров того же класса или объектов других типов, если только класс не определяет достаточное количество методов __lt__(), __le__(), __gt__() и __ge__() (в общем случае достаточно __lt__() и __eq__(), если нужны традиционные значения операторов сравнения).

Поведение операторов is и is not не может быть настроено; кроме того, они применимы к любым двум объектам и никогда не вызывают исключение.

Ещё две операции с тем же синтаксическим приоритетом, in и not in, поддерживаются типами, которые являются итерируемыми или реализуют метод __contains__().

Числовые типы – int, float, complexNumeric Types – int, float, complex

Существует три различных числовых типа: целые числа, числа с плавающей запятой и комплексные числа. Кроме того, логический тип является подтипом целых чисел. Целые числа имеют неограниченную точность. Числа с плавающей запятой обычно реализуются с помощью double в C; информация о точности и внутреннем представлении чисел с плавающей запятой для машины, на которой выполняется программа, доступна в sys.float_info. Комплексные числа имеют действительную и мнимую части, каждая из которых является числом с плавающей запятой. Чтобы извлечь эти части из комплексного числа z, используйте z.real и z.imag. (Стандартная библиотека включает дополнительные числовые типы: fractions.Fraction для рациональных чисел и decimal.Decimal для чисел с плавающей запятой с определяемой пользователем точностью.)

Числа создаются с помощью числовых литералов или как результат встроенных функций и операторов. Обычные целочисленные литералы (включая шестнадцатеричные, восьмеричные и двоичные числа) дают целые числа. Числовые литералы, содержащие десятичную точку или знак экспоненты, дают числа с плавающей запятой. Добавление 'j' или 'J' к числовому литералу даёт мнимое число (комплексное число с нулевой действительной частью), которое можно прибавить к целому или вещественному числу, чтобы получить комплексное число с действительной и мнимой частями.

Конструкторы int(), float() и complex() можно использовать для создания чисел определённого типа.

Python полностью поддерживает смешанную арифметику: когда бинарный арифметический оператор имеет операнды разных встроенных числовых типов, операнд с «более узким» типом расширяется до типа другого.

  • Если оба аргумента – комплексные числа, преобразование не выполняется;

  • если любой из аргументов является комплексным числом или числом с плавающей запятой, другой преобразуется в число с плавающей запятой;

  • в противном случае оба должны быть целыми числами, и преобразование не требуется.

Арифметика с комплексными и вещественными операндами определяется обычными математическими формулами, например:

x + complex(u, v) = complex(x + u, v)
x * complex(u, v) = complex(x * u, x * v)

Сравнение чисел разных типов ведёт себя так, как если бы сравнивались точные значения этих чисел. [2]

Все числовые типы (кроме комплексных) поддерживают следующие операции (о приоритетах операций см. Приоритет операций):

Операция

Результат

Примечания

Полная документация

x + y

сумма x и y

x - y

разность x и y

x * y

произведение x и y

x / y

частное x и y

x // y

неполное частное x и y

(1)(2)

x % y

остаток от x / y

(2)

-x

x с обратным знаком

+x

x без изменений

abs(x)

абсолютное значение или модуль x

abs()

int(x)

x, преобразованное в целое число

(3)(6)

int()

float(x)

x, преобразованное в число с плавающей запятой

(4)(6)

float()

complex(re, im)

комплексное число с действительной частью re и мнимой частью im. im по умолчанию равно нулю.

(6)

complex()

c.conjugate()

сопряжённое комплексного числа c

divmod(x, y)

пара (x // y, x % y)

(2)

divmod()

pow(x, y)

x в степени y

(5)

pow()

x ** y

x в степени y

(5)

Примечания:

  1. Также называется целочисленным делением. Для операндов типа int результат имеет тип int. Для операндов типа float результат имеет тип float. В общем случае результат – целое число, хотя его тип не обязательно int. Результат всегда округляется в сторону минус бесконечности: 1//2 равно 0, (-1)//2 равно -1, 1//(-2) равно -1, а (-1)//(-2) равно 0.

  2. Не для комплексных чисел. Вместо этого преобразуйте в числа с плавающей запятой с помощью abs(), если это уместно.

  3. Преобразование из float в int усекает, отбрасывая дробную часть. См. функции math.floor() и math.ceil() для альтернативных преобразований.

  4. float также принимает строки “nan” и “inf” с необязательным префиксом “+” или “-” для Not a Number (NaN) и положительной или отрицательной бесконечности.

  5. Python определяет pow(0, 0) и 0 ** 0 как 1, что общепринято для языков программирования.

  6. Принимаемые числовые литералы включают цифры от 0 до 9 или любой эквивалент в Unicode (кодовые точки со свойством Nd).

    См. стандарт Unicode для полного списка кодовых точек со свойством Nd.

Все типы numbers.Real (int и float) также включают следующие операции:

Операция

Результат

math.trunc(x)

x, усечённое до Integral

round(x[, n])

x, округлённое до n знаков, с округлением до ближайшего чётного. Если n опущено, по умолчанию равно 0.

math.floor(x)

наибольшее Integral <= x

math.ceil(x)

наименьшее Integral >= x

За дополнительными числовыми операциями обращайтесь к модулям math и cmath.

Побитовые операции над целыми типамиBitwise Operations on Integer Types

Побитовые операции имеют смысл только для целых чисел. Результат побитовых операций вычисляется так, как если бы они выполнялись в дополнительном коде с бесконечным количеством знаковых битов.

Приоритеты двоичных побитовых операций ниже, чем у числовых операций, и выше, чем у сравнений; унарная операция ~ имеет тот же приоритет, что и другие унарные числовые операции (+ и -).

В этой таблице перечислены побитовые операции, отсортированные по возрастанию приоритета:

Операция

Результат

Примечания

x | y

побитовое ИЛИ для x и y

(4)

x ^ y

побитовое исключающее ИЛИ для x и y

(4)

x & y

побитовое И для x и y

(4)

x << n

x, сдвинутое влево на n битов

(1)(2)

x >> n

x, сдвинутое вправо на n битов

(1)(3)

~x

инвертированные биты x

Примечания:

  1. Отрицательные значения сдвига недопустимы и вызывают ValueError.

  2. Сдвиг влево на n битов эквивалентен умножению на pow(2, n).

  3. Сдвиг вправо на n битов эквивалентен целочисленному делению на pow(2, n).

  4. Выполнение этих вычислений с хотя бы одним дополнительным битом знакового расширения в конечном дополнительном коде (рабочая разрядность 1 + max(x.bit_length(), y.bit_length()) или более) достаточно для получения того же результата, как если бы было бесконечное количество знаковых битов.

Дополнительные методы для целых типовAdditional Methods on Integer Types

Тип int реализует numbers.Integral абстрактный базовый класс. Кроме того, он предоставляет ещё несколько методов:

int.bit_length()

Возвращает количество битов, необходимое для представления целого числа в двоичном виде, без учёта знака и ведущих нулей:

>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6

Более точно, если 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.

Эквивалентно следующему:

def bit_length(self):
    s = bin(self)       # двоичное представление:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # удалить ведущие нули и знак минус
    return len(s)       # len('100101') --> 6

Добавлено в версии 3.1.

int.bit_count()

Возвращает количество единиц в двоичном представлении абсолютного значения целого числа. Также известно как population count. Пример:

>>> n = 19
>>> bin(n)
'0b10011'
>>> n.bit_count()
3
>>> (-n).bit_count()
3

Эквивалентно следующему:

def bit_count(self):
    return bin(self).count("1")

Добавлено в версии 3.10.

int.to_bytes(length=1, byteorder='big', *, signed=False)

Возвращает массив байтов, представляющий целое число.

>>> (1024).to_bytes(2, byteorder='big')
b'\x04\x00'
>>> (1024).to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> (-1024).to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
>>> x = 1000
>>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little')
b'\xe8\x03'

Целое число представляется с использованием length байтов, по умолчанию – 1. Если целое число невозможно представить заданным количеством байтов, вызывается исключение OverflowError.

Аргумент byteorder определяет порядок байтов для представления целого числа, по умолчанию – "big". Если byteorder равен "big", старший байт находится в начале массива байтов. Если byteorder равен "little", старший байт находится в конце массива байтов.

Аргумент signed определяет, используется ли дополнительный код для представления целого числа. Если signed равен False и передано отрицательное целое число, вызывается исключение OverflowError. Значение по умолчанию для signedFalse.

Значения по умолчанию можно использовать для удобного преобразования целого числа в однобайтовый объект:

>>> (65).to_bytes()
b'A'

Однако при использовании аргументов по умолчанию не следует пытаться преобразовать значение больше 255, иначе будет вызвано исключение OverflowError.

Эквивалентно следующему:

def to_bytes(n, length=1, byteorder='big', signed=False):
    if byteorder == 'little':
        order = range(length)
    elif byteorder == 'big':
        order = reversed(range(length))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    return bytes((n >> i*8) & 0xff for i in order)

Добавлено в версии 3.2.

Изменено в версии 3.11: Добавлены значения аргументов по умолчанию для length и byteorder.

classmethod int.from_bytes(bytes, byteorder='big', *, signed=False)

Возвращает целое число, представленное заданным массивом байтов.

>>> int.from_bytes(b'\x00\x10', byteorder='big')
16
>>> int.from_bytes(b'\x00\x10', byteorder='little')
4096
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
-1024
>>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
64512
>>> int.from_bytes([255, 0, 0], byteorder='big')
16711680

Аргумент bytes должен быть либо bytes-подобным объектом, либо итерабельным объектом, производящим байты.

Аргумент byteorder определяет порядок байтов для представления целого числа, по умолчанию – "big". Если byteorder равен "big", старший байт находится в начале массива байтов. Если byteorder равен "little", старший байт находится в конце массива байтов. Чтобы использовать собственный порядок байтов хост-системы, укажите sys.byteorder в качестве значения порядка байтов.

Аргумент signed указывает, используется ли дополнительный код для представления целого числа.

Эквивалентно следующему:

def from_bytes(bytes, byteorder='big', signed=False):
    if byteorder == 'little':
        little_ordered = list(bytes)
    elif byteorder == 'big':
        little_ordered = list(reversed(bytes))
    else:
        raise ValueError("byteorder must be either 'little' or 'big'")

    n = sum(b << i*8 for i, b in enumerate(little_ordered))
    if signed and little_ordered and (little_ordered[-1] & 0x80):
        n -= 1 << 8*len(little_ordered)

    return n

Добавлено в версии 3.2.

Изменено в версии 3.11: Добавлено значение аргумента по умолчанию для byteorder.

int.as_integer_ratio()

Возвращает пару целых чисел, отношение которых равно исходному целому числу, и знаменатель положителен. Целочисленное отношение целых чисел всегда представляет собой само целое число в качестве числителя и 1 в качестве знаменателя.

Добавлено в версии 3.8.

int.is_integer()

Возвращает True. Существует для совместимости с утиной типизацией с float.is_integer().

Добавлено в версии 3.12.

Дополнительные методы floatAdditional Methods on Float

Тип float реализует numbers.Real абстрактный базовый класс. Кроме того, float имеет следующие дополнительные методы.

classmethod float.from_number(x)

Метод класса, возвращающий число с плавающей запятой, построенное из числа x.

Если аргумент является целым числом или числом с плавающей запятой, возвращается число с плавающей запятой с тем же значением (в пределах точности чисел с плавающей запятой Python). Если аргумент выходит за пределы диапазона чисел с плавающей запятой Python, будет вызвано исключение OverflowError.

Для произвольного объекта Python x, float.from_number(x) делегирует вызов x.__float__(). Если __float__() не определён, то используется __index__().

Добавлено в версии 3.14.

float.as_integer_ratio()

Возвращает пару целых чисел, отношение которых точно равно исходному числу с плавающей запятой. Отношение представлено в несократимом виде и имеет положительный знаменатель. Вызывает OverflowError для бесконечности и ValueError для NaN.

float.is_integer()

Возвращает True, если экземпляр float является конечным и имеет целочисленное значение, и False в противном случае:

>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False

Два метода поддерживают преобразование в шестнадцатеричные строки и обратно. Поскольку числа с плавающей запятой в Python внутренне хранятся в двоичном виде, преобразование числа с плавающей запятой в строку decimal и обратно обычно связано с небольшой ошибкой округления. Напротив, шестнадцатеричные строки позволяют точно представлять и задавать числа с плавающей запятой. Это может быть полезно при отладке и в численных расчётах.

float.hex()

Возвращает представление числа с плавающей запятой в виде шестнадцатеричной строки. Для конечных чисел с плавающей запятой это представление всегда будет содержать ведущий 0x и завершающий p и экспоненту.

classmethod float.fromhex(s)

Метод класса, возвращающий число с плавающей запятой, представленное шестнадцатеричной строкой s. Строка s может содержать начальные и конечные пробелы.

Обратите внимание, что float.hex() – это метод экземпляра, а float.fromhex() – метод класса.

Шестнадцатеричная строка имеет вид:

[sign] ['0x'] integer ['.' fraction] ['p' exponent]

где необязательный sign может быть либо +, либо -, integer и fraction – строки шестнадцатеричных цифр, а exponent – десятичное целое с необязательным ведущим знаком. Регистр не имеет значения, и должна быть хотя бы одна шестнадцатеричная цифра в целой части либо в дробной. Этот синтаксис похож на синтаксис, указанный в разделе 6.4.4.2 стандарта C99, а также на синтаксис, используемый в Java 1.5 и выше. В частности, результат float.hex() может использоваться как шестнадцатеричный литерал с плавающей запятой в коде C или Java, а шестнадцатеричные строки, созданные символом формата %a в C или Double.toHexString в Java, принимаются float.fromhex().

Обратите внимание, что экспонента записывается в десятичном, а не шестнадцатеричном виде, и что она указывает степень двойки, на которую умножается коэффициент. Например, шестнадцатеричная строка 0x3.a7p10 представляет число с плавающей запятой (3 + 10./16 + 7./16**2) * 2.0**10, или 3740.0:

>>> float.fromhex('0x3.a7p10')
3740.0

Применение обратного преобразования к 3740.0 даёт другую шестнадцатеричную строку, представляющую то же число:

>>> float.hex(3740.0)
'0x1.d380000000000p+11'

Дополнительные методы для complexAdditional Methods on Complex

Тип complex реализует numbers.Complex абстрактный базовый класс. complex также имеет следующие дополнительные методы.

classmethod complex.from_number(x)

Метод класса для преобразования числа в комплексное число.

Для обычного объекта Python x метод complex.from_number(x) делегирует вызов x.__complex__(). Если __complex__() не определён, то используется __float__(). Если __float__() не определён, то используется __index__().

Добавлено в версии 3.14.

Хеширование числовых типовHashing of numeric types

Для чисел x и y, возможно разных типов, требуется, чтобы hash(x) == hash(y) всякий раз, когда x == y (см. документацию метода __hash__() для подробностей). Для простоты реализации и эффективности для различных числовых типов (включая int, float, decimal.Decimal и fractions.Fraction) хеш Python для числовых типов основан на одной математической функции, определённой для любого рационального числа, и, следовательно, применим ко всем экземплярам int и fractions.Fraction, а также ко всем конечным экземплярам float и decimal.Decimal. По существу, эта функция задаётся приведением по модулю P для фиксированного простого числа P. Значение P доступно в Python как атрибут modulus объекта sys.hash_info.

Деталь реализации CPython: В настоящее время используется простое число P = 2**31 - 1 на машинах с 32-битными C longs и P = 2**61 - 1 на машинах с 64-битными C longs.

Вот подробные правила:

  • Если x = m / n – неотрицательное рациональное число и n не делится на P, определим hash(x) как m * invmod(n, P) % P, где invmod(n, P) даёт обратное к n по модулю P.

  • Если x = m / n – неотрицательное рациональное число и n делится на P (но m не делится), то n не имеет обратного по модулю P, и вышеуказанное правило не применяется; в этом случае определим hash(x) как константу sys.hash_info.inf.

  • Если x = m / n – отрицательное рациональное число, определим hash(x) как -hash(-x). Если полученный хеш равен -1, заменим его на -2.

  • Конкретные значения sys.hash_info.inf и -sys.hash_info.inf используются как хеши для положительной бесконечности и отрицательной бесконечности (соответственно).

  • Для комплексного числа 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.

Для пояснения вышеуказанных правил приведём пример кода Python, эквивалентного встроенной функции hash, для вычисления хеша рационального числа, float или complex:

import sys, math

def hash_fraction(m, n):
    """Вычислить хеш рационального числа m / n.

    Предполагается, что m и n – целые числа, n положительное.
    Эквивалентно hash(fractions.Fraction(m, n)).

    """
    P = sys.hash_info.modulus
    # Удалить общие делители P.  (Необязательно, если m и n уже взаимно просты.)
    while m % P == n % P == 0:
        m, n = m // P, n // P

    if n % P == 0:
        hash_value = sys.hash_info.inf
    else:
        # Малая теорема Ферма: pow(n, P-1, P) равно 1, поэтому
        # pow(n, P-2, P) даёт обратный элемент n по модулю P.
        hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
    if m < 0:
        hash_value = -hash_value
    if hash_value == -1:
        hash_value = -2
    return hash_value

def hash_float(x):
    """Вычислить хеш числа с плавающей запятой x."""

    if math.isnan(x):
        return object.__hash__(x)
    elif math.isinf(x):
        return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
    else:
        return hash_fraction(*x.as_integer_ratio())

def hash_complex(z):
    """Вычислить хеш комплексного числа z."""

    hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
    # выполнить знаковое приведение по модулю 2**sys.hash_info.width
    M = 2**(sys.hash_info.width - 1)
    hash_value = (hash_value & (M - 1)) - (hash_value & M)
    if hash_value == -1:
        hash_value = -2
    return hash_value

Булев тип - boolBoolean Type - bool

Булевы значения представляют истинностные значения. Тип bool имеет ровно два константных экземпляра: True и False.

Встроенная функция bool() преобразует любое значение в булево, если значение можно интерпретировать как истинностное (см. раздел Проверка истинности значений выше).

Для логических операций используйте логические операторы and, or и not. При применении побитовых операторов &, |, ^ к двум булевым значениям они возвращают bool, эквивалентный логическим операциям «and», «or», «xor». Однако логические операторы and, or и != следует предпочитать &, | и ^.

Устарело с версии 3.12: Использование оператора побитовой инверсии ~ устарело и вызовет ошибку в Python 3.16.

bool является подклассом int (см. Числовые типы – int, float, complex). В многих числовых контекстах False и True ведут себя как целые числа 0 и 1 соответственно. Однако полагаться на это не рекомендуется; вместо этого используйте явное преобразование с помощью int().

Типы итераторовIterator Types

Python поддерживает концепцию итерации по контейнерам. Это реализовано с помощью двух различных методов; они используются, чтобы позволить пользовательским классам поддерживать итерацию. Последовательности, описанные ниже более подробно, всегда поддерживают методы итерации.

Для контейнерных объектов необходимо определить один метод, чтобы обеспечить поддержку итерируемости:

container.__iter__()

Возвращает объект итератора. Объект должен поддерживать протокол итератора, описанный ниже. Если контейнер поддерживает разные типы итерации, можно предоставить дополнительные методы для запроса итераторов этих типов. (Пример объекта, поддерживающего несколько форм итерации – древовидная структура, поддерживающая обход как в ширину, так и в глубину.) Этот метод соответствует слоту tp_iter структуры типа для объектов Python в Python/C API.

Сами объекты итераторов должны поддерживать следующие два метода, которые вместе образуют протокол итератора:

iterator.__iter__()

Возвращает сам объект итератора. Это необходимо, чтобы и контейнеры, и итераторы можно было использовать с операторами for и in. Этот метод соответствует слоту tp_iter структуры типа для объектов Python в Python/C API.

iterator.__next__()

Возвращает следующий элемент из итератора. Если элементов больше нет, вызывает исключение StopIteration. Этот метод соответствует слоту tp_iternext структуры типа для объектов Python в Python/C API.

Python определяет несколько объектов итераторов для поддержки итерации по общим и специфическим типам последовательностей, словарям и другим более специализированным формам. Конкретные типы не важны, кроме их реализации протокола итератора.

Как только метод __next__() итератора вызывает StopIteration, он должен продолжать делать это при последующих вызовах. Реализации, не соблюдающие это свойство, считаются некорректными.

Типы генераторовGenerator Types

Генераторы Python предоставляют удобный способ реализации протокола итератора. Если метод __iter__() объекта контейнера реализован как генератор, он автоматически вернет объект итератора (технически объект генератора), предоставляющий методы __iter__() и __next__(). Дополнительную информацию о генераторах можно найти в документации по yield expression.

Типы последовательностей – list, tuple, rangeSequence Types – list, tuple, range

Существуют три основных типа последовательностей: списки, кортежи и объекты range. Дополнительные типы последовательностей, предназначенные для обработки двоичных данных и текстовых строк, описаны в отдельных разделах.

Общие операции с последовательностямиCommon Sequence Operations

Операции, перечисленные в следующей таблице, поддерживаются большинством типов последовательностей, как изменяемых, так и неизменяемых. ABC collections.abc.Sequence предоставляется, чтобы упростить корректную реализацию этих операций в пользовательских типах последовательностей.

В этой таблице перечислены операции с последовательностями, отсортированные по возрастанию приоритета. В таблице s и t – последовательности одного типа, n, i, j и k – целые числа, а x – произвольный объект, удовлетворяющий любым ограничениям на тип и значение, накладываемым s.

Операции in и not in имеют тот же приоритет, что и операции сравнения. Операции + (конкатенация) и * (повторение) имеют тот же приоритет, что и соответствующие числовые операции. [3]

Операция

Результат

Примечания

x in s

True, если элемент последовательности s равен x, иначе False

(1)

x not in s

False, если элемент последовательности s равен x, иначе True

(1)

s + t

конкатенация s и t

(6)(7)

s * n или n * s

эквивалентно сложению s с собой n раз

(2)(7)

s[i]

i-й элемент s, начиная с 0

(3)(8)

s[i:j]

срез s от i до j

(3)(4)

s[i:j:k]

срез s от i до j с шагом k

(3)(5)

len(s)

длина s

min(s)

наименьший элемент s

max(s)

наибольший элемент s

Последовательности одного типа также поддерживают сравнения. В частности, кортежи и списки сравниваются лексикографически путём сравнения соответствующих элементов. Это означает, что для равенства каждый элемент должен быть равен, а две последовательности должны быть одного типа и иметь одинаковую длину. (Полные подробности см. в Comparisons в справочнике по языку.)

Прямые и обратные итераторы по изменяемым последовательностям обращаются к значениям по индексу. Этот индекс будет продолжать двигаться вперёд (или назад), даже если базовая последовательность изменяется. Итератор завершается только при возникновении IndexError или StopIteration (или когда индекс становится меньше нуля).

Примечания:

  1. Хотя операции in и not in в общем случае используются только для простой проверки на вхождение, некоторые специализированные последовательности (например, str, bytes и bytearray) также используют их для проверки на подпоследовательность:

    >>> "gg" in "eggs"
    True
    
  2. Значения n меньше 0 трактуются как 0 (что даёт пустую последовательность того же типа, что и s). Обратите внимание: элементы последовательности s не копируются; на них ссылаются многократно. Это часто преследует начинающих программистов Python; рассмотрите:

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]
    

    Произошло следующее: [[]] – это список из одного элемента, содержащего пустой список, поэтому все три элемента [[]] * 3 являются ссылками на этот единственный пустой список. Изменение любого из элементов lists изменяет этот единственный список. Создать список из разных списков можно так:

    >>> lists = [[] for i in range(3)]
    >>> lists[0].append(3)
    >>> lists[1].append(5)
    >>> lists[2].append(7)
    >>> lists
    [[3], [5], [7]]
    

    Подробное объяснение доступно в разделе FAQ Как создать многомерный список?.

  3. Если i или j отрицательное, индекс отсчитывается от конца последовательности s: подставляется len(s) + i или len(s) + j. Но обратите внимание: -0 по-прежнему равно 0.

  4. Срез последовательности s от i до j определяется как последовательность элементов с индексом k, для которых выполняется i <= k < j.

    • Если i опущено или равно None, используется 0.

    • Если j опущено или равно None, используется len(s).

    • Если i или j меньше -len(s), используется 0.

    • Если i или j больше len(s), используется len(s).

    • Если i больше или равно j, срез пуст.

  5. 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.

  6. Конкатенация неизменяемых последовательностей всегда приводит к созданию нового объекта. Это означает, что построение последовательности путём многократной конкатенации будет иметь квадратичную временную сложность от общей длины последовательности. Чтобы получить линейную сложность, следует перейти к одному из следующих вариантов:

    • при конкатенации объектов str можно собрать список, а затем использовать str.join() в конце или же записывать данные в экземпляр io.StringIO и получить его значение по завершении

    • при конкатенации объектов bytes можно аналогично использовать bytes.join() или io.BytesIO, либо выполнять конкатенацию на месте с объектом bytearray. Объекты bytearray являются изменяемыми и обладают эффективным механизмом предварительного выделения памяти

    • при конкатенации объектов tuple лучше расширять объект list

    • для других типов – изучите документацию соответствующего класса

  7. Некоторые типы последовательностей (например, range) поддерживают только такие последовательности элементов, которые подчиняются определённым шаблонам, и поэтому не поддерживают конкатенацию или повторение последовательностей.

  8. Исключение IndexError возникает, если i выходит за пределы диапазона последовательности.

Методы последовательностей

Типы последовательностей также поддерживают следующие методы:

sequence.count(value, /)

Возвращает общее количество вхождений value в последовательности sequence.

sequence.index(value[, start[, stop]])

Возвращает индекс первого вхождения value в последовательности sequence.

Вызывает ValueError, если value не найден в sequence.

Аргументы start и stop позволяют эффективно искать подпоследовательности, начиная с start и заканчивая stop. Это примерно эквивалентно start + sequence[start:stop].index(value), но без копирования данных.

Внимание

Не все типы последовательностей поддерживают передачу аргументов start и stop.

Неизменяемые типы последовательностейImmutable Sequence Types

Единственная операция, которую неизменяемые последовательности обычно реализуют, но которой нет у изменяемых, – это поддержка встроенной функции hash().

Эта поддержка позволяет использовать неизменяемые последовательности, такие как экземпляры tuple, в качестве ключей dict и хранить их в экземплярах set и frozenset.

Попытка вычислить хеш неизменяемой последовательности, содержащей нехешируемые значения, приведёт к TypeError.

Изменяемые типы последовательностейMutable Sequence Types

В следующей таблице приведены операции, определённые для изменяемых типов последовательностей. ABC collections.abc.MutableSequence предоставляется для упрощения корректной реализации этих операций в пользовательских типах последовательностей.

В таблице s – экземпляр изменяемого типа последовательности, t – любой итерируемый объект, а x – произвольный объект, удовлетворяющий всем ограничениям по типу и значению, накладываемым s (например, bytearray принимает только целые числа, удовлетворяющие ограничению по значению 0 <= x <= 255).

Операция

Результат

Примечания

s[i] = x

элемент i из s заменяется на x

del s[i]

удаляет элемент i из s

s[i:j] = t

срез s от i до j заменяется содержимым итерируемого объекта t

del s[i:j]

удаляет элементы s[i:j] из списка (то же, что и s[i:j] = [])

s[i:j:k] = t

элементы s[i:j:k] заменяются элементами из t

(1)

del s[i:j:k]

удаляет элементы s[i:j:k] из списка

s += t

расширяет s содержимым t (в основном то же, что и s[len(s):len(s)] = t)

s *= n

обновляет s, повторяя его содержимое n раз

(2)

Примечания:

  1. Если k не равно 1, то t должно иметь ту же длину, что и заменяемый срез.

  2. Значение n – целое число или объект, реализующий __index__(). Нулевые и отрицательные значения n очищают последовательность. Элементы последовательности не копируются; на них делаются множественные ссылки, как описано для s * n в разделе Общие операции с последовательностями.

Методы изменяемых последовательностей

Изменяемые типы последовательностей также поддерживают следующие методы:

sequence.append(value, /)

Добавляет value в конец последовательности. Это равносильно записи seq[len(seq):len(seq)] = [value].

sequence.clear()

Добавлено в версии 3.3.

Удаляет все элементы из sequence. Это равносильно записи del sequence[:].

sequence.copy()

Добавлено в версии 3.3.

Создаёт поверхностную копию sequence. Это равносильно записи sequence[:].

Подсказка

Метод copy() не является частью MutableSequence ABC, но большинство конкретных изменяемых типов последовательностей его предоставляют.

sequence.extend(iterable, /)

Расширяет sequence содержимым iterable. В основном это то же самое, что запись seq[len(seq):len(seq)] = iterable.

sequence.insert(index, value, /)

Вставляет value в sequence по указанному index. Это равносильно записи sequence[index:index] = [value].

sequence.pop(index=-1, /)

Извлекает элемент по index и также удаляет его из sequence. По умолчанию удаляется и возвращается последний элемент sequence.

sequence.remove(value, /)

Удаляет первый элемент из sequence, для которого sequence[i] == value.

Вызывает ValueError, если value не найден в sequence.

sequence.reverse()

Изменяет порядок элементов sequence на обратный на месте. Этот метод обеспечивает экономию памяти при обращении большой последовательности. Чтобы напомнить пользователям, что он работает с побочным эффектом, он возвращает None.

СпискиLists

Списки – это изменяемые последовательности, обычно используемые для хранения коллекций однородных элементов (степень однородности может варьироваться в зависимости от приложения).

class list(iterable=(), /)

Списки можно создать несколькими способами:

  • Используя пару квадратных скобок для обозначения пустого списка: []

  • Используя квадратные скобки, разделяя элементы запятыми: [a], [a, b, c]

  • Используя списковое включение: [x for x in iterable]

  • Используя конструктор типа: list() или list(iterable)

Конструктор создаёт список, элементы которого совпадают с элементами итерируемого объекта и располагаются в том же порядке. Итерируемый объект может быть последовательностью, контейнером, поддерживающим итерацию, или итератором. Если итерируемый объект уже является списком, создаётся и возвращается его копия (аналогично iterable[:]). Например, list('abc') возвращает ['a', 'b', 'c'], а list( (1, 2, 3) ) возвращает [1, 2, 3]. Если аргумент не указан, конструктор создаёт новый пустой список – [].

Многие другие операции также создают списки, включая встроенную функцию sorted().

Списки являются дженериками по типам своих элементов.

Списки реализуют все общие и изменяемые операции последовательностей. Списки также предоставляют следующий дополнительный метод:

sort(*, key=None, reverse=False)

Этот метод сортирует список на месте, используя только < сравнений между элементами. Исключения не подавляются – если какая-либо операция сравнения завершится ошибкой, вся сортировка завершится ошибкой (и список, скорее всего, останется в частично изменённом состоянии).

sort() принимает два аргумента, которые могут быть переданы только по ключевому слову (аргументы только по ключевому слову):

key задаёт функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента списка (например, key=str.lower). Ключ для каждого элемента списка вычисляется один раз и затем используется для всего процесса сортировки. Значение по умолчанию None означает, что элементы списка сортируются напрямую, без вычисления отдельного ключа.

Утилита functools.cmp_to_key() позволяет преобразовать функцию сравнения cmp в стиле 2.x в функцию key.

reverse – булево значение. Если установлено в True, то элементы списка сортируются так, как если бы каждое сравнение было обратным.

Этот метод изменяет последовательность на месте для экономии памяти при сортировке большой последовательности. Чтобы напомнить пользователям, что он работает с побочным эффектом, он не возвращает отсортированную последовательность (используйте sorted() для явного запроса нового отсортированного списка).

Метод sort() гарантированно устойчив. Сортировка называется устойчивой, если она не меняет относительный порядок элементов, которые считаются равными – это полезно при многоэтапной сортировке (например, сначала по отделу, затем по уровню зарплаты).

Примеры сортировки и краткое руководство по сортировке см. в Методы сортировки.

Особенность реализации CPython: Во время сортировки списка результат попыток изменить или даже проверить список не определён. Реализация Python на C делает список пустым на время сортировки и вызывает ValueError, если может обнаружить, что список был изменён во время сортировки.

См. также

Подробную информацию о гарантиях потокобезопасности для объектов list см. в Потокобезопасность объектов списка.

КортежиTuples

Кортежи – это неизменяемые последовательности, обычно используемые для хранения коллекций разнородных данных (например, пар, возвращаемых встроенной функцией enumerate()). Кортежи также используются в случаях, когда требуется неизменяемая последовательность однородных данных (например, для хранения в экземпляре set или dict).

class tuple(iterable=(), /)

Кортежи можно создать несколькими способами:

  • Используя пару круглых скобок для обозначения пустого кортежа: ()

  • Используя завершающую запятую для кортежа из одного элемента: a, или (a,)

  • Разделяя элементы запятыми: a, b, c или (a, b, c)

  • Используя встроенную функцию tuple(): tuple() или tuple(iterable)

Конструктор создаёт кортеж, элементы которого совпадают с элементами итерируемого объекта и располагаются в том же порядке. Итерируемый объект может быть последовательностью, контейнером, поддерживающим итерацию, или итератором. Если итерируемый объект уже является кортежем, он возвращается без изменений. Например, tuple('abc') возвращает ('a', 'b', 'c'), а tuple( [1, 2, 3] ) возвращает (1, 2, 3). Если аргумент не указан, конструктор создаёт новый пустой кортеж – ().

Обратите внимание, что кортеж создаётся запятой, а не круглыми скобками. Скобки необязательны, за исключением пустого кортежа или случаев, когда они необходимы для устранения синтаксической неоднозначности. Например, f(a, b, c) – это вызов функции с тремя аргументами, а f((a, b, c)) – это вызов функции с одним аргументом – кортежем из трёх элементов.

Кортежи реализуют все общие операции последовательностей.

Кортежи являются обобщёнными по типам своего содержимого. Для получения дополнительной информации обратитесь к документации по typing, посвящённой аннотированию кортежей.

Для гетерогенных коллекций данных, где доступ по имени понятнее, чем доступ по индексу, collections.namedtuple() может быть более подходящим выбором, чем простой объект кортежа.

ДиапазоныRanges

Тип range представляет собой неизменяемую последовательность чисел и обычно используется для цикла с определённым числом итераций в циклах for.

class range(stop, /)
class range(start, stop, step=1, /)

Аргументы конструктора range должны быть целыми числами (либо встроенными int, либо любым объектом, реализующим специальный метод __index__()). Если аргумент step опущен, по умолчанию используется 1. Если аргумент start опущен, по умолчанию используется 0. Если step равен нулю, возбуждается ValueError.

Для положительного step содержимое диапазона r определяется формулой r[i] = start + step*i, где i >= 0 и r[i] < stop.

Для отрицательного step содержимое диапазона по-прежнему определяется формулой r[i] = start + step*i, но ограничениями являются i >= 0 и r[i] > stop.

Объект диапазона будет пустым, если r[0] не удовлетворяет ограничению значения. Диапазоны поддерживают отрицательные индексы, но они интерпретируются как индексация с конца последовательности, определяемой положительными индексами.

Диапазоны, содержащие абсолютные значения больше sys.maxsize, допускаются, но некоторые функции (например len()) могут возбуждать OverflowError.

Примеры диапазонов:

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> list(range(0))
[]
>>> list(range(1, 0))
[]

Диапазоны реализуют все общие операции последовательностей, за исключением конкатенации и повторения (ввиду того, что объекты диапазонов могут представлять только последовательности, следующие строгому шаблону, а повторение и конкатенация обычно нарушают этот шаблон).

start

Значение параметра start (или 0, если параметр не был указан)

stop

Значение параметра stop

step

Значение параметра step (или 1, если параметр не был указан)

Преимущество типа range перед обычными list или tuple заключается в том, что объект range всегда занимает одинаковый (небольшой) объём памяти, независимо от размера диапазона, который он представляет (поскольку он хранит только значения start, stop и step, вычисляя отдельные элементы и поддиапазоны по мере необходимости).

Объекты диапазонов реализуют абстрактный базовый класс (ABC) collections.abc.Sequence и предоставляет такие возможности, как проверка на вхождение, поиск индекса элемента, срезы и поддержка отрицательных индексов (см. Типы последовательностей – list, tuple, range):

>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18

Проверка объектов диапазонов на равенство с == и != сравнивает их как последовательности. То есть два объекта диапазонов считаются равными, если они представляют одну и ту же последовательность значений. (Обратите внимание, что два равных объекта диапазонов могут иметь разные атрибуты start, stop и step, например range(0) == range(2, 1, 3) или range(0, 3, 2) == range(0, 4, 2).)

Изменено в версии 3.2: Реализует ABC Sequence. Поддерживает срезы и отрицательные индексы. Проверяет принадлежность объектов int за константное время вместо итерации по всем элементам.

Изменено в версии 3.3: Определяет ‘==’ и ‘!=’ для сравнения объектов диапазонов на основе последовательности значений, которые они определяют (вместо сравнения по идентичности объектов).

Добавлены атрибуты start, stop и step.

См. также

  • Рецепт linspace показывает, как реализовать ленивую версию диапазона, подходящую для приложений с плавающей запятой.

Сводка методов текстовых и двоичных типов последовательностейText and Binary Sequence Type Methods Summary

В следующей таблице приведены методы текстовых и двоичных типов последовательностей, сгруппированные по категориям.

Категория

Методы str

Методы bytes и bytearray

Форматирование

str.format()

str.format_map()

f-строки

Строковое форматирование в стиле printf

Форматирование байтов в стиле printf

Поиск и замена

str.find()

str.rfind()

bytes.find()

bytes.rfind()

str.index()

str.rindex()

bytes.index()

bytes.rindex()

str.startswith()

bytes.startswith()

str.endswith()

bytes.endswith()

str.count()

bytes.count()

str.replace()

bytes.replace()

Разделение и объединение

str.split()

str.rsplit()

bytes.split()

bytes.rsplit()

str.splitlines()

bytes.splitlines()

str.partition()

bytes.partition()

str.rpartition()

bytes.rpartition()

str.join()

bytes.join()

Классификация строк

str.isalpha()

bytes.isalpha()

str.isdecimal()

str.isdigit()

bytes.isdigit()

str.isnumeric()

str.isalnum()

bytes.isalnum()

str.isidentifier()

str.islower()

bytes.islower()

str.isupper()

bytes.isupper()

str.istitle()

bytes.istitle()

str.isspace()

bytes.isspace()

str.isprintable()

Преобразование регистра

str.lower()

bytes.lower()

str.upper()

bytes.upper()

str.casefold()

str.capitalize()

bytes.capitalize()

str.title()

bytes.title()

str.swapcase()

bytes.swapcase()

Дополнение и удаление символов

str.ljust()

str.rjust()

bytes.ljust()

bytes.rjust()

str.center()

bytes.center()

str.expandtabs()

bytes.expandtabs()

str.strip()

bytes.strip()

str.lstrip()

str.rstrip()

bytes.lstrip()

bytes.rstrip()

Преобразование и кодирование

str.translate()

bytes.translate()

str.maketrans()

bytes.maketrans()

str.encode()

bytes.decode()

Тип текстовой последовательности – strText Sequence Type – str

Текстовые данные в Python представлены объектами str, или строками. Строки – неизменяемые последовательности кодовых точек Unicode. Строковые литералы записываются различными способами:

  • Одинарные кавычки: 'allows embedded "double" quotes'

  • Двойные кавычки: "allows embedded 'single' quotes"

  • Тройные кавычки: '''Three single quotes''', """Three double quotes"""

Строки в тройных кавычках могут занимать несколько строк – все сопутствующие пробельные символы будут включены в строковый литерал.

Строковые литералы, являющиеся частью одного выражения и разделённые только пробельными символами, будут неявно объединены в один строковый литерал. То есть ("spam " "eggs") == "spam eggs".

Смотрите Строковые и байтовые литералы для получения дополнительной информации о различных формах строковых литералов, включая поддерживаемые управляющие последовательности и префикс r («сырой»), который отключает обработку большинства управляющих последовательностей.

Строки также могут быть созданы из других объектов с помощью конструктора str.

Поскольку отдельного типа «символ» не существует, индексация строки даёт строку длины 1. То есть для непустой строки s выполняется s[0] == s[0:1].

Также нет изменяемого строкового типа, но str.join() или io.StringIO можно использовать для эффективного построения строк из нескольких фрагментов.

Изменено в версии 3.3: Для обратной совместимости с серией Python 2 префикс u снова разрешён в строковых литералах. Он не влияет на значение строковых литералов и не может сочетаться с префиксом r.

class str(*, encoding='utf-8', errors='strict')
class str(object)
class str(object, encoding, errors='strict')
class str(object, *, errors)

Возвращает строковое представление объекта. Если объект не указан, возвращает пустую строку. В противном случае поведение str() зависит от того, указаны ли encoding или errors, как описано ниже.

Если не указаны ни encoding, ни errors, str(object) возвращает type(object).__str__(object), которое является «неформальным» или удобным для вывода строковым представлением объекта. Для строковых объектов это сама строка. Если объект не имеет метода __str__(), то str() возвращает repr(object).

Если указан хотя бы один из encoding или errors, object должен быть байтово-подобным объектом (например, bytes или bytearray). В этом случае, если объект является объектом bytes (или bytearray), то str(bytes, encoding, errors) эквивалентно bytes.decode(encoding, errors). В противном случае объект bytes, лежащий в основе буферного объекта, получается перед вызовом bytes.decode(). Смотрите Типы двоичных последовательностей – bytes, bytearray, memoryview и Протокол буфера для информации о буферных объектах.

Передача объекта bytes в str() без аргументов encoding или errors относится к первому случаю возврата неформального строкового представления (см. также параметр командной строки -b Python). Например:

>>> str(b'Zoot!')
"b'Zoot!'"

Для получения дополнительной информации о классе str и его методах смотрите Тип текстовой последовательности – str и раздел Методы строк ниже. Для вывода отформатированных строк смотрите разделы f-строки и Синтаксис форматной строки. Кроме того, смотрите раздел Службы обработки текста.

Методы строкString Methods

Строки реализуют все общие операции с последовательностями, а также дополнительные методы, описанные ниже.

Строки также поддерживают два стиля форматирования: один обеспечивает высокую степень гибкости и настройки (см. str.format(), Синтаксис форматной строки и Пользовательское форматирование строк), а другой основан на стиле C printf, который работает с более узким набором типов и немного сложнее в правильном использовании, но часто быстрее для тех случаев, с которыми может справиться (Форматирование строк в стиле printf).

Раздел Службы обработки текста стандартной библиотеки охватывает ряд других модулей, предоставляющих различные утилиты для работы с текстом (включая поддержку регулярных выражений в модуле re).

str.capitalize()

Возвращает копию строки, в которой первый символ переведён в верхний регистр, а остальные – в нижний.

Изменено в версии 3.8: Первый символ теперь переводится в регистр заголовка (titlecase) вместо заглавного. Это означает, что символы типа диграфов будут иметь заглавной только первую букву, а не весь символ.

str.casefold()

Возвращает копию строки, преобразованную для регистронезависимого сравнения. Такие строки могут использоваться для сравнения без учёта регистра.

Преобразование для регистронезависимого сравнения похоже на приведение к нижнему регистру, но более агрессивно, так как предназначено для удаления всех различий по регистру в строке. Например, немецкая строчная буква 'ß' эквивалентна "ss". Поскольку она уже в нижнем регистре, lower() ничего не сделает с 'ß'; casefold() преобразует её в "ss". Например:

>>> 'straße'.lower()
'straße'
>>> 'straße'.casefold()
'strasse'

Алгоритм приведения к одному регистру описан в разделе 3.13.3 «Default Case Folding» стандарта Unicode.

Добавлено в версии 3.3.

str.center(width, fillchar=' ', /)

Возвращает строку, выровненную по центру, длины width. Заполнение выполняется с помощью указанного fillchar (по умолчанию – пробел ASCII). Исходная строка возвращается, если width меньше или равно len(s). Например:

>>> 'Python'.center(10)
'  Python  '
>>> 'Python'.center(10, '-')
'--Python--'
>>> 'Python'.center(4)
'Python'
str.count(sub[, start[, end]])

Возвращает количество непересекающихся вхождений подстроки sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются как в нотации срезов.

Если sub пуста, возвращает количество пустых строк между символами, что равно длине строки плюс один. Например:

>>> 'spam, spam, spam'.count('spam')
3
>>> 'spam, spam, spam'.count('spam', 5)
2
>>> 'spam, spam, spam'.count('spam', 5, 10)
1
>>> 'spam, spam, spam'.count('eggs')
0
>>> 'spam, spam, spam'.count('')
17
str.encode(encoding='utf-8', errors='strict')

Возвращает строку, закодированную в bytes.

encoding по умолчанию равен 'utf-8'; список возможных значений см. в Стандартные кодировки.

errors управляет обработкой ошибок кодирования. Если 'strict' (по умолчанию), возбуждается исключение UnicodeError. Другие возможные значения: 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' и любое другое имя, зарегистрированное через codecs.register_error(). Подробности см. в Обработчики ошибок.

По соображениям производительности значение errors не проверяется на корректность, пока не произойдёт ошибка кодирования, не будет включён Режим разработки Python или не будет использована отладочная сборка. Например:

>>> encoded_str_to_bytes = 'Python'.encode()
>>> type(encoded_str_to_bytes)
<class 'bytes'>
>>> encoded_str_to_bytes
b'Python'

Изменено в версии 3.1: Добавлена поддержка именованных аргументов.

Изменено в версии 3.9: Значение аргумента errors теперь проверяется в Режиме разработки Python и в режиме отладки.

str.endswith(suffix[, start[, end]])

Возвращает True, если строка заканчивается указанным suffix, иначе возвращает False. suffix также может быть кортежем суффиксов для поиска. С необязательным start проверка начинается с этой позиции. С необязательным end сравнение прекращается на этой позиции. Использование start и end эквивалентно str[start:end].endswith(suffix). Например:

>>> 'Python'.endswith('on')
True
>>> 'a tuple of suffixes'.endswith(('at', 'in'))
False
>>> 'a tuple of suffixes'.endswith(('at', 'es'))
True
>>> 'Python is amazing'.endswith('is', 0, 9)
True

См. также startswith() и removesuffix().

str.expandtabs(tabsize=8)

Возвращает копию строки, в которой все символы табуляции заменены одним или несколькими пробелами в зависимости от текущей позиции и заданного размера табуляции. Позиции табуляции располагаются через каждые tabsize символов (по умолчанию 8, что даёт позиции табуляции на колонках 0, 8, 16 и так далее). Для разворачивания строки текущая колонка устанавливается в ноль и строка просматривается посимвольно. Если символ является табуляцией (\t), в результат вставляется один или несколько пробелов, пока текущая колонка не станет равна следующей позиции табуляции. (Сам символ табуляции не копируется.) Если символ – перевод строки (\n) или возврат каретки (\r), он копируется, а текущая колонка сбрасывается в ноль. Любой другой символ копируется без изменений, а текущая колонка увеличивается на единицу независимо от того, как символ представлен при печати. Например:

>>> '01\t012\t0123\t01234'.expandtabs()
'01      012     0123    01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01  012 0123    01234'
>>> print('01\t012\n0123\t01234'.expandtabs(4))
01  012
0123    01234
str.find(sub[, start[, end]])

Возвращает наименьший индекс в строке, где подстрока sub найдена в пределах среза s[start:end]. Необязательные аргументы start и end интерпретируются как в нотации срезов. Возвращает -1, если sub не найдена. Например:

>>> 'spam, spam, spam'.find('sp')
0
>>> 'spam, spam, spam'.find('sp', 5)
6

См. также rfind() и index().

Примечание

Метод find() следует использовать только если нужно знать позицию sub. Чтобы проверить, является ли sub подстрокой, используйте оператор in:

>>> 'Py' in 'Python'
True
str.format(*args, **kwargs)

Выполняет операцию форматирования строки. Строка, для которой вызывается этот метод, может содержать литеральный текст или поля замены, ограниченные фигурными скобками {}. Каждое поле замены содержит либо числовой индекс позиционного аргумента, либо имя именованного аргумента. Возвращает копию строки, в которой каждое поле замены заменено строковым значением соответствующего аргумента. Например:

>>> "The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'
>>> "The sum of {a} + {b} is {answer}".format(answer=1+2, a=1, b=2)
'The sum of 1 + 2 is 3'
>>> "{1} expects the {0} Inquisition!".format("Spanish", "Nobody")
'Nobody expects the Spanish Inquisition!'

См. Синтаксис строк формата для описания различных опций форматирования, которые можно указать в строках формата.

Примечание

При форматировании числа (int, float, complex, decimal.Decimal и подклассов) с типом n (например: '{:n}'.format(1234)) функция временно устанавливает локаль LC_CTYPE в локаль LC_NUMERIC для декодирования полей decimal_point и thousands_sep объекта localeconv(), если они не ASCII или длиннее 1 байта, и локаль LC_NUMERIC отличается от локали LC_CTYPE. Это временное изменение влияет на другие потоки.

Изменено в версии 3.7: При форматировании числа с типом n функция временно устанавливает локаль LC_CTYPE в локаль LC_NUMERIC в некоторых случаях.

str.format_map(mapping, /)

Аналогично str.format(**mapping), за исключением того, что mapping используется напрямую, а не копируется в dict. Это полезно, если, например, mapping является подклассом словаря:

>>> class Default(dict):
...     def __missing__(self, key):
...         return key
...
>>> '{name} was born in {country}'.format_map(Default(name='Guido'))
'Guido was born in country'

Добавлено в версии 3.2.

str.index(sub[, start[, end]])

Как find(), но возбуждает ValueError, если подстрока не найдена. Например:

>>> 'spam, spam, spam'.index('spam')
0
>>> 'spam, spam, spam'.index('eggs')
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    'spam, spam, spam'.index('eggs')
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
ValueError: substring not found

См. также rindex().

str.isalnum()

Возвращает True, если все символы строки являются буквенно-цифровыми и в строке есть хотя бы один символ, иначе False. Символ c считается буквенно-цифровым, если один из следующих вызовов возвращает True: c.isalpha(), c.isdecimal(), c.isdigit() или c.isnumeric(). Например:

>>> 'abc123'.isalnum()
True
>>> 'abc123!@#'.isalnum()
False
>>> ''.isalnum()
False
>>> ' '.isalnum()
False
str.isalpha()

Возвращает True, если все символы строки являются буквенными и в строке есть хотя бы один символ, иначе False. Буквенными считаются символы, определённые в базе данных символов Юникода как «Letter», т.е. с категорией общего назначения «Lm», «Lt», «Lu», «Ll» или «Lo». Обратите внимание, что это отличается от свойства Alphabetic, определённого в разделе 4.10 «Letters, Alphabetic, and Ideographic» стандарта Юникода. Например:

>>> 'Letters and spaces'.isalpha()
False
>>> 'LettersOnly'.isalpha()
True
>>> 'µ'.isalpha()  # не-ASCII символы также могут считаться буквенными
True

См. Unicode Properties.

str.isascii()

Возвращает True, если строка пуста или все символы строки являются ASCII, иначе False. Символы ASCII имеют кодовые точки в диапазоне U+0000-U+007F. Например:

>>> 'ASCII characters'.isascii()
True
>>> 'µ'.isascii()
False

Добавлено в версии 3.7.

str.isdecimal()

Возвращает True, если все символы строки являются десятичными цифрами и в строке есть хотя бы один символ, иначе False. Десятичные цифры – это символы, которые можно использовать для формирования чисел по основанию 10, например U+0660, ARABIC-INDIC DIGIT ZERO. Формально десятичный символ – это символ из общей категории Юникода «Nd». Например:

>>> '0123456789'.isdecimal()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isdecimal()  # арабо-индийские цифры от нуля до девяти
True
>>> 'alphabetic'.isdecimal()
False
str.isdigit()

Возвращает True, если все символы строки являются цифрами и в строке есть хотя бы один символ, иначе False. Цифры включают десятичные символы и цифры, требующие специальной обработки, например надстрочные цифры совместимости. Это охватывает цифры, которые не могут использоваться для формирования чисел по основанию 10, такие как Kharosthi numbers. Формально цифра – это символ, имеющий значение свойства Numeric_Type=Digit или Numeric_Type=Decimal.

Например:

>>> '0123456789'.isdigit()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isdigit()  # арабо-индийские цифры от нуля до девяти
True
>>> '⅕'.isdigit()  # обыкновенная дробь одна пятая
False
>>> '²'.isdecimal(), '²'.isdigit(),  '²'.isnumeric()
(False, True, True)

См. также isdecimal() и isnumeric().

str.isidentifier()

Возвращает True, если строка является корректным идентификатором согласно определению языка, раздел Names (идентификаторы и ключевые слова).

keyword.iskeyword() можно использовать для проверки, является ли строка s зарезервированным идентификатором, например def и class.

Пример:

>>> from keyword import iskeyword

>>> 'hello'.isidentifier(), iskeyword('hello')
(True, False)
>>> 'def'.isidentifier(), iskeyword('def')
(True, True)
str.islower()

Возвращает True, если все буквенные символы [4] в строке являются строчными и в строке есть хотя бы один буквенный символ, иначе False.

str.isnumeric()

Возвращает True, если все символы строки являются числовыми символами и в строке есть хотя бы один символ, иначе False. Числовые символы включают цифры и все символы, имеющие свойство числового значения Unicode, например U+2155, VULGAR FRACTION ONE FIFTH. Формально числовыми считаются символы со значением свойства Numeric_Type=Digit, Numeric_Type=Decimal или Numeric_Type=Numeric. Например:

>>> '0123456789'.isnumeric()
True
>>> '٠١٢٣٤٥٦٧٨٩'.isnumeric()  # арабо-индийские цифры от нуля до девяти
True
>>> '⅕'.isnumeric()  # обыкновенная дробь одна пятая
True
>>> '²'.isdecimal(), '²'.isdigit(),  '²'.isnumeric()
(False, True, True)

См. также isdecimal() и isdigit().

str.isprintable()

Возвращает True, если все символы строки являются печатными, False, если в ней есть хотя бы один непечатный символ.

Здесь «печатный» означает, что символ подходит для использования repr() в своём выводе; «непечатный» означает, что repr() на встроенных типах будет экранировать символ шестнадцатеричным кодом. Это не влияет на обработку строк, записываемых в sys.stdout или sys.stderr.

Печатные символы – это те, которые в базе данных символов Unicode (см. unicodedata) имеют общую категорию из группы Letter, Mark, Number, Punctuation или Symbol (L, M, N, P или S); плюс пробел ASCII 0x20. Непечатные символы – это символы из группы Separator или Other (Z или C), за исключением пробела ASCII.

Например:

>>> ''.isprintable(), ' '.isprintable()
(True, True)
>>> '\t'.isprintable(), '\n'.isprintable()
(False, False)

См. также isspace().

str.isspace()

Возвращает True, если в строке есть только пробельные символы и в ней есть хотя бы один символ, иначе False.

Например:

>>> ''.isspace()
False
>>> ' '.isspace()
True
>>> '\t\n'.isspace() # TAB и перевод строки
True
>>> '\u3000'.isspace() # Идеографический пробел
True

Символ считается пробельным, если в базе данных символов Unicode (см. unicodedata) его общая категория – Zs («Separator, space») или его двунаправленный класс – один из WS, B или S.

См. также isprintable().

str.istitle()

Возвращает True, если строка записана в заголовочном регистре и содержит хотя бы один символ. Например, прописные символы могут следовать только за символами без регистра, а строчные – только за символами с регистром. В противном случае возвращает False.

Например:

>>> 'Spam, Spam, Spam'.istitle()
True
>>> 'spam, spam, spam'.istitle()
False
>>> 'SPAM, SPAM, SPAM'.istitle()
False

См. также title().

str.isupper()

Возвращает True, если все буквенные символы [4] в строке являются прописными и в строке есть хотя бы один буквенный символ, иначе False.

>>> 'BANANA'.isupper()
True
>>> 'banana'.isupper()
False
>>> 'baNana'.isupper()
False
>>> ' '.isupper()
False
str.join(iterable, /)

Возвращает строку, полученную объединением строк в iterable. Если в iterable есть значения, не являющиеся строками, включая объекты bytes, возбуждается TypeError. Разделитель между элементами – это строка, предоставляющая данный метод. Например:

>>> ', '.join(['spam', 'spam', 'spam'])
'spam, spam, spam'
>>> '-'.join('Python')
'P-y-t-h-o-n'

См. также split().

str.ljust(width, fillchar=' ', /)

Возвращает строку, выровненную по левому краю в строке длины width. Заполнение выполняется с использованием указанного fillchar (по умолчанию пробел ASCII). Исходная строка возвращается, если width меньше или равно len(s).

Например:

>>> 'Python'.ljust(10)
'Python    '
>>> 'Python'.ljust(10, '.')
'Python....'
>>> 'Monty Python'.ljust(10, '.')
'Monty Python'

См. также rjust().

str.lower()

Возвращает копию строки, в которой все буквенные символы [4] преобразованы в нижний регистр. Например:

>>> 'Lower Method Example'.lower()
'lower method example'

Используемый алгоритм приведения к нижнему регистру описан в разделе 3.13.2 «Default Case Conversion» стандарта Unicode.

str.lstrip(chars=None, /)

Возвращает копию строки с удалёнными начальными символами. Аргумент chars задаёт строку, определяющую набор удаляемых символов. Если он опущен или равен None, аргумент chars по умолчанию удаляет пробельные символы, то есть символы, для которых str.isspace() истинно. Аргумент chars является не префиксом, а набором символов – удаляются любые комбинации его значений:

>>> '   spacious   '.lstrip()
'spacious   '
>>> 'www.example.com'.lstrip('cmowz.')
'example.com'

См. str.removeprefix() для метода, который удаляет один строковый префикс, а не набор символов. Например:

>>> 'Arthur: three!'.lstrip('Arthur: ')
'ee!'
>>> 'Arthur: three!'.removeprefix('Arthur: ')
'three!'
static str.maketrans(dict, /)
static str.maketrans(from, to, remove='', /)

Этот статический метод возвращает таблицу перевода, пригодную для использования в str.translate().

Если указан только один аргумент, он должен быть словарём, отображающим коды Unicode (целые числа) или символы (строки длины 1) в коды Unicode, строки (произвольной длины) или None. Ключи-символы при этом преобразуются в коды.

Если указано два аргумента, они должны быть строками одинаковой длины, и в результирующем словаре каждый символ из from будет отображаться на символ на той же позиции в to. Если есть третий аргумент, он должен быть строкой, символы которой в результате будут отображаться на None.

Изменено в версии 3.15: dict теперь может быть frozendict.

str.partition(sep, /)

Разделяет строку по первому вхождению sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий саму строку и две пустые строки.

Например:

>>> 'Monty Python'.partition(' ')
('Monty', ' ', 'Python')
>>> "Monty Python's Flying Circus".partition(' ')
('Monty', ' ', "Python's Flying Circus")
>>> 'Monty Python'.partition('-')
('Monty Python', '', '')

См. также rpartition().

str.removeprefix(prefix, /)

Если строка начинается с подстроки prefix, возвращается string[len(prefix):]. В противном случае возвращается копия исходной строки:

>>> 'TestHook'.removeprefix('Test')
'Hook'
>>> 'BaseTestCase'.removeprefix('Test')
'BaseTestCase'

Добавлено в версии 3.9.

См. также removesuffix() и startswith().

str.removesuffix(suffix, /)

Если строка заканчивается подстрокой suffix и эта suffix не пуста, возвращается string[:-len(suffix)]. В противном случае возвращается копия исходной строки:

>>> 'MiscTests'.removesuffix('Tests')
'Misc'
>>> 'TmpDirMixin'.removesuffix('Tests')
'TmpDirMixin'

Добавлено в версии 3.9.

См. также removeprefix() и endswith().

str.replace(old, new, /, count=-1)

Возвращает копию строки, в которой все вхождения подстроки old заменены на new. Если указан count, заменяются только первые count вхождений. Если count не указан или равен -1, заменяются все вхождения. Например:

>>> 'spam, spam, spam'.replace('spam', 'eggs')
'eggs, eggs, eggs'
>>> 'spam, spam, spam'.replace('spam', 'eggs', 1)
'eggs, spam, spam'

Изменено в версии 3.13: count теперь поддерживается в качестве именованного аргумента.

str.rfind(sub[, start[, end]])

Возвращает наибольший индекс в строке, по которому встречается подстрока sub, при условии, что sub находится в пределах s[start:end]. Необязательные аргументы start и end интерпретируются как в записи среза. Возвращает -1, если подстрока не найдена. Например:

>>> 'spam, spam, spam'.rfind('sp')
12
>>> 'spam, spam, spam'.rfind('sp', 0, 10)
6

См. также find() и rindex().

str.rindex(sub[, start[, end]])

Действует как rfind(), но возбуждает ValueError, если подстрока sub не найдена. Например:

>>> 'spam, spam, spam'.rindex('spam')
12
>>> 'spam, spam, spam'.rindex('eggs')
Traceback (most recent call last):
  File "<stdin-0>", line 1, in <module>
    'spam, spam, spam'.rindex('eggs')
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
ValueError: substring not found

См. также index() и find().

str.rjust(width, fillchar=' ', /)

Возвращает строку, выровненную по правому краю в строке длины width. Заполнение выполняется с использованием указанного fillchar (по умолчанию пробел ASCII). Исходная строка возвращается, если width меньше или равно len(s).

Например:

>>> 'Python'.rjust(10)
'    Python'
>>> 'Python'.rjust(10, '.')
'....Python'
>>> 'Monty Python'.rjust(10, '.')
'Monty Python'

См. также ljust() и zfill().

str.rpartition(sep, /)

Разделяет строку по последнему вхождению sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий две пустые строки и саму строку.

Например:

>>> 'Monty Python'.rpartition(' ')
('Monty', ' ', 'Python')
>>> "Monty Python's Flying Circus".rpartition(' ')
("Monty Python's Flying", ' ', 'Circus')
>>> 'Monty Python'.rpartition('-')
('', '', 'Monty Python')

См. также partition().

str.rsplit(sep=None, maxsplit=-1)

Возвращает список слов в строке, используя sep в качестве строки-разделителя. Если указан maxsplit, выполняется не более maxsplit разбиений, причём самых правых. Если sep не указан или равен None, в качестве разделителя используется любая строка из пробельных символов. За исключением разбиения справа, rsplit() ведёт себя как split(), подробно описанный ниже.

str.rstrip(chars=None, /)

Возвращает копию строки с удалёнными конечными символами. Аргумент chars – это строка, определяющая набор символов для удаления. Если он опущен или равен None, аргумент chars по умолчанию удаляет пробельные символы, то есть символы, для которых str.isspace() истинно. Аргумент chars не является суффиксом; вместо этого удаляются все комбинации его значений. Например:

>>> '   spacious   '.rstrip()
'   spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'

См. removesuffix() – метод, который удаляет одну строку-суффикс, а не все символы из набора. Например:

>>> 'Monty Python'.rstrip(' Python')
'M'
>>> 'Monty Python'.removesuffix(' Python')
'Monty'

См. также strip().

str.split(sep=None, maxsplit=-1)

Возвращает список слов в строке, используя sep в качестве строки-разделителя. Если указан maxsplit, выполняется не более maxsplit разбиений (следовательно, список будет содержать не более maxsplit+1 элементов). Если maxsplit не указан или равен -1, ограничения на количество разбиений нет (выполняются все возможные разбиения).

Если sep задан, последовательные разделители не группируются и считаются разделяющими пустые строки (например, '1,,2'.split(',') возвращает ['1', '', '2']). Аргумент sep может состоять из нескольких символов, используемых как один разделитель (для разбиения по нескольким разделителям используйте re.split()). Разбиение пустой строки с указанным разделителем возвращает [''].

Например:

>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',', maxsplit=1)
['1', '2,3']
>>> '1,2,,3,'.split(',')
['1', '2', '', '3', '']
>>> '1<>2<>3<4'.split('<>')
['1', '2', '3<4']

Если sep не указан или равен None, применяется другой алгоритм разбиения: последовательности пробельных символов считаются одним разделителем, и результат не будет содержать пустых строк в начале или конце, если строка содержит начальные или завершающие пробелы. Следовательно, разбиение пустой строки или строки, состоящей только из пробелов, с разделителем None возвращает [].

Например:

>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> '   1   2   3   '.split()
['1', '2', '3']

Если sep не указан или равен None, а maxsplit равен 0, учитываются только начальные последовательности пробельных символов.

Например:

>>> "".split(None, 0)
[]
>>> "   ".split(None, 0)
[]
>>> "   foo   ".split(maxsplit=0)
['foo   ']

См. также join() и rsplit().

str.splitlines(keepends=False)

Возвращает список строк в строке, разбивая её по границам строк. Символы перевода строки не включаются в результирующий список, если только keepends не задан и не равен true.

Этот метод разбивает строку по следующим границам строк. В частности, эти границы являются расширенным набором универсальных символов перевода строки.

Представление

Описание

\n

Перевод строки (LF)

\r

Возврат каретки (CR)

\r\n

Возврат каретки + перевод строки (CR+LF)

\v или \x0b

Линейная табуляция

\f или \x0c

Перевод страницы

\x1c

Разделитель файлов

\x1d

Разделитель групп

\x1e

Разделитель записей

\x85

Следующая строка (управляющий код C1)

\u2028

Разделитель строк

\u2029

Разделитель абзацев

Изменено в версии 3.2: \v и \f добавлены в список границ строк.

Например:

>>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
['ab c', '', 'de fg', 'kl']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']

В отличие от split(), когда задана строка-разделитель sep, этот метод возвращает пустой список для пустой строки, и концевой разрыв строки не приводит к появлению дополнительной строки:

>>> "".splitlines()
[]
>>> "One line\n".splitlines()
['One line']

Для сравнения, split('\n') возвращает:

>>> ''.split('\n')
['']
>>> 'Two lines\n'.split('\n')
['Two lines', '']
str.startswith(prefix[, start[, end]])

Возвращает True, если строка начинается с prefix, иначе возвращает False. prefix также может быть кортежем префиксов для поиска. При указании необязательного start строка проверяется начиная с этой позиции. При указании необязательного end сравнение строки прекращается на этой позиции.

Например:

>>> 'Python'.startswith('Py')
True
>>> 'a tuple of prefixes'.startswith(('at', 'a'))
True
>>> 'Python is amazing'.startswith('is', 7)
True

См. также endswith() и removeprefix().

str.strip(chars=None, /)

Возвращает копию строки с удалёнными начальными и конечными символами. Аргумент chars – это строка, определяющая набор символов для удаления. Если он опущен или равен None, аргумент chars по умолчанию удаляет пробельные символы, то есть символы, для которых str.isspace() истинно. Аргумент chars не является ни префиксом, ни суффиксом; вместо этого удаляются все комбинации его значений.

Например:

>>> '   spacious   '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'

Значения аргумента chars в начале и конце строки удаляются. Символы удаляются с начала до тех пор, пока не встретится символ строки, не входящий в набор символов из chars. Аналогичное действие выполняется в конце строки.

Например:

>>> comment_string = '#....... Section 3.2.1 Issue #32 .......'
>>> comment_string.strip('.#! ')
'Section 3.2.1 Issue #32'

См. также rstrip().

str.swapcase()

Возвращает копию строки, в которой прописные буквы преобразуются в строчные и наоборот. Например:

>>> 'Hello World'.swapcase()
'hELLO wORLD'

Следует учитывать, что s.swapcase().swapcase() == s не обязательно истинно. Например:

>>> 'straße'.swapcase().swapcase()
'strasse'

См. также str.lower() и str.upper().

str.title()

Возвращает строку, где каждое слово начинается с прописной буквы, а остальные символы – строчные.

Например:

>>> 'Hello world'.title()
'Hello World'

Алгоритм использует простое, не зависящее от языка определение слова как группы последовательных букв. Это определение работает во многих контекстах, но означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может быть нежелательным результатом:

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

Функция string.capwords() не имеет этой проблемы, поскольку разбивает слова только по пробелам.

В качестве альтернативы можно создать обходной путь для апострофов с помощью регулярных выражений:

>>> import re
>>> def titlecase(s):
...     return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0).capitalize(),
...                   s)
...
>>> titlecase("they're bill's friends.")
"They're Bill's Friends."

См. также istitle().

str.translate(table, /)

Возвращает копию строки, в которой каждый символ преобразован с помощью заданной таблицы трансляции. Таблица должна быть объектом, поддерживающим индексацию по __getitem__(), обычно это отображение или последовательность. При индексации по коду Unicode (целое число) объект таблицы может выполнить одно из следующих действий: вернуть код Unicode или строку, чтобы сопоставить символ одному или нескольким другим символам; вернуть None для удаления символа из результирующей строки; или возбудить исключение LookupError, чтобы оставить символ без изменений.

Можно использовать str.maketrans() для создания таблицы трансляции на основе сопоставлений символов в различных форматах.

В следующем примере используется отображение для замены 'a' на 'X', 'b' на 'Y' и удаления 'c':

>>> 'abc123'.translate({ord('a'): 'X', ord('b'): 'Y', ord('c'): None})
'XY123'

См. также модуль codecs для более гибкого подхода к настраиваемым сопоставлениям символов.

str.upper()

Возвращает копию строки, в которой все буквенные символы [4] преобразованы в верхний регистр. Обратите внимание, что s.upper().isupper() может быть False, если s содержит символы без регистра или если категория Unicode результирующего символа не «Lu» (буква, верхний регистр), а, например, «Lt» (буква, заглавный регистр).

Используемый алгоритм преобразования в верхний регистр описан в разделе 3.13.2 «Default Case Conversion» стандарта Unicode.

str.zfill(width, /)

Возвращает копию строки, дополненную слева символами '0' (цифра ASCII) до длины width. Ведущий знак ('+'/'-') обрабатывается так: заполнение вставляется после символа знака, а не перед ним. Исходная строка возвращается, если width меньше или равно len(s).

Например:

>>> "42".zfill(5)
'00042'
>>> "-42".zfill(5)
'-0042'

См. также rjust().

Форматированные строковые литералы (f-строки)Formatted String Literals (f-strings)

Добавлено в версии 3.6.

Изменено в версии 3.7: В выражениях внутри f-строк теперь можно использовать await и async for.

Изменено в версии 3.8: Добавлен спецификатор отладки (=)

Изменено в версии 3.12: Снято множество ограничений на выражения внутри f-строк. В частности, теперь разрешены вложенные строки, комментарии и обратные косые черты.

F-строка (формально форматированный строковый литерал) – это строковый литерал с префиксом f или F. Такой строковый литерал позволяет встраивать результаты произвольных выражений Python в поля подстановки, которые ограничены фигурными скобками ({}). Каждое поле подстановки должно содержать выражение, за которым необязательно может следовать:

  • спецификатор отладки – знак равенства (=);

  • спецификатор преобразования!s, !r или !a; и/или

  • спецификатор формата с префиксом в виде двоеточия (:).

Подробнее о синтаксисе этих полей см. раздел «Лексический анализ» про f-строки.

Спецификатор отладкиDebug specifier

Добавлено в версии 3.8.

Если после выражения поля подстановки указан спецификатор отладки – знак равенства (=), то результирующая f-строка будет содержать исходный код выражения, знак равенства и значение выражения. Это часто полезно для отладки:

>>> number = 14.3
>>> f'{number=}'
'number=14.3'

Пробелы до, внутри и после выражения, а также пробелы после знака равенства учитываются – они сохраняются в результате:

>>> f'{ number  -  4  = }'
' number  -  4  = 10.3'

Спецификатор преобразованияConversion specifier

По умолчанию значение выражения поля подстановки преобразуется в строку с помощью str():

>>> from fractions import Fraction
>>> one_third = Fraction(1, 3)
>>> f'{one_third}'
'1/3'

Если указан спецификатор отладки, но не указан спецификатор формата, преобразование по умолчанию вместо этого использует repr():

>>> f'{one_third = }'
'one_third = Fraction(1, 3)'

Преобразование можно явно указать с помощью одного из следующих спецификаторов:

Например:

>>> str(one_third)
'1/3'
>>> repr(one_third)
'Fraction(1, 3)'

>>> f'{one_third!s} is {one_third!r}'
'1/3 is Fraction(1, 3)'

>>> string = "¡kočka 😸!"
>>> ascii(string)
"'\\xa1ko\\u010dka \\U0001f638!'"

>>> f'{string = !a}'
"string = '\\xa1ko\\u010dka \\U0001f638!'"

Спецификатор форматаFormat specifier

После вычисления выражения и, возможно, преобразования с помощью явного спецификатора преобразования, оно форматируется с помощью функции format(). Если поле подстановки содержит спецификатор формата, вводимый двоеточием (:), то спецификатор передаётся в format() в качестве второго аргумента. Результат format() затем используется как окончательное значение для поля подстановки. Например:

>>> from fractions import Fraction
>>> one_third = Fraction(1, 3)
>>> f'{one_third:.6f}'
'0.333333'
>>> f'{one_third:_^+10}'
'___+1/3___'
>>> >>> f'{one_third!r:_^20}'
'___Fraction(1, 3)___'
>>> f'{one_third = :~>10}~'
'one_third = ~~~~~~~1/3~'

Шаблонные строковые литералы (t-строки)Template String Literals (t-strings)

T-строка (официально шаблонный строковый литерал) – это строковый литерал, начинающийся с префикса t или T.

Эти строки следуют тому же синтаксису и правилам вычисления, что и форматированные строковые литералы, со следующими отличиями:

  • Вместо вычисления в объект str, шаблонные строковые литералы вычисляются в объект string.templatelib.Template.

  • Протокол format() не используется. Вместо этого спецификатор формата и преобразования (если они есть) передаются новому объекту Interpolation, который создаётся для каждого вычисленного выражения. Код, обрабатывающий полученный объект Template, решает, как обрабатывать спецификаторы формата и преобразования.

  • Спецификаторы формата, содержащие вложенные поля подстановки, вычисляются заранее, до передачи объекту Interpolation. Например, интерполяция вида {amount:.{precision}f} вычислит внутреннее выражение {precision}, чтобы определить значение атрибута format_spec. Если бы precision было равно 2, результирующий спецификатор формата был бы '.2f'.

  • Если в выражении интерполяции указан знак равенства '=', текст выражения добавляется к литеральной строке, предшествующей соответствующей интерполяции. Сюда входят знак равенства и окружающие пробелы. Экземпляр Interpolation для выражения создаётся обычным образом, за исключением того, что conversion по умолчанию устанавливается в ‘r’ (repr()). Если указаны явное преобразование или спецификатор формата, это переопределяет поведение по умолчанию.

Форматирование строк в стиле printfprintf-style String Formatting

Примечание

Описанные здесь операции форматирования имеют ряд особенностей, которые приводят к распространённым ошибкам (например, некорректное отображение кортежей и словарей).

Использование форматированных строковых литералов, интерфейса str.format() или string.Template может помочь избежать этих ошибок. Каждая из этих альтернатив имеет свои компромиссы и преимущества с точки зрения простоты, гибкости и/или расширяемости.

Строковые объекты имеют одну уникальную встроенную операцию: оператор % (остаток от деления). Он также известен как оператор форматирования или интерполяции строк. Для format % values (где format – строка) спецификации преобразования % в format заменяются нулём или более элементами из values. Эффект аналогичен использованию функции sprintf() в языке C. Например:

>>> print('%s has %d quote types.' % ('Python', 2))
Python has 2 quote types.

Если format требует один аргумент, то values может быть одним объектом, не являющимся кортежем. [5] В противном случае values должен быть кортежем с количеством элементов, точно указанным в строке формата, или одним объектом отображения (например, словарём).

Спецификатор преобразования содержит два или более символа и состоит из следующих компонентов, которые должны располагаться в указанном порядке:

  1. Символ '%', обозначающий начало спецификатора.

  2. Ключ отображения (необязательно), состоящий из последовательности символов в круглых скобках (например, (somename)).

  3. Флаги преобразования (необязательно), влияющие на результат для некоторых типов преобразования.

  4. Минимальная ширина поля (необязательно). Если указана как '*' (звёздочка), то фактическая ширина берётся из следующего элемента кортежа в values, а преобразуемый объект следует после минимальной ширины поля и необязательной точности.

  5. Точность (необязательно), задаётся как '.' (точка), после которой следует значение точности. Если указана как '*' (звёздочка), фактическая точность берётся из следующего элемента кортежа в values, и преобразуемое значение следует после точности.

  6. Модификатор длины (необязательно).

  7. Тип преобразования.

Когда правый аргумент является словарём (или другим типом отображения), форматы в строке должны включать ключ отображения в скобках, указывающий на этот словарь, вставленный сразу после символа '%'. Ключ отображения выбирает значение для форматирования из отображения. Например:

>>> print('%(language)s has %(number)03d quote types.' %
...       {'language': "Python", "number": 2})
Python has 002 quote types.

В этом случае в формате не должно быть спецификаторов * (поскольку они требуют последовательного списка параметров).

Символы флагов преобразования:

Флаг

Значение

'#'

Преобразование значения будет использовать «альтернативную форму» (определённую ниже).

'0'

Для числовых значений преобразование будет дополняться нулями.

'-'

Преобразованное значение выравнивается по левому краю (переопределяет преобразование '0', если указаны оба).

' '

(пробел) Перед положительным числом (или пустой строкой), полученным в результате знакового преобразования, следует оставлять пробел.

'+'

Знак ('+' или '-') будет предшествовать преобразованию (переопределяет флаг «пробел»).

Модификатор длины (h, l или L) может присутствовать, но игнорируется, поскольку он не нужен для Python – так, например, %ld идентично %d.

Типы преобразования:

Преобразование

Значение

Примечания

'd'

Десятичное целое со знаком.

'i'

Десятичное целое со знаком.

'o'

Восьмеричное значение со знаком.

(1)

'u'

Устаревший тип – идентичен 'd'.

(6)

'x'

Шестнадцатеричное со знаком (строчные буквы).

(2)

'X'

Шестнадцатеричное со знаком (заглавные буквы).

(2)

'e'

Экспоненциальный формат с плавающей запятой (строчные буквы).

(3)

'E'

Экспоненциальный формат с плавающей запятой (заглавные буквы).

(3)

'f'

Десятичный формат с плавающей запятой.

(3)

'F'

Десятичный формат с плавающей запятой.

(3)

'g'

Формат с плавающей запятой. Использует экспоненциальный формат со строчными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат.

(4)

'G'

Формат с плавающей запятой. Использует экспоненциальный формат с заглавными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат.

(4)

'c'

Один символ (принимает целое число или строку из одного символа).

'r'

Строка (преобразует любой объект Python с помощью repr()).

(5)

's'

Строка (преобразует любой объект Python с помощью str()).

(5)

'a'

Строка (преобразует любой объект Python с помощью ascii()).

(5)

'%'

Ни один аргумент не преобразуется, результатом является символ '%' в итоговом выводе.

Для форматов с плавающей точкой результат должен быть правильно округлён до заданной точности p – количества знаков после десятичной точки. Режим округления совпадает с режимом встроенной функции round().

Примечания:

  1. Альтернативная форма вставляет ведущий восьмеричный спецификатор ('0o') перед первой цифрой.

  2. Альтернативная форма вставляет перед первой цифрой ведущий '0x' или '0X' (в зависимости от того, использовался ли формат 'x' или 'X').

  3. Альтернативная форма всегда включает десятичную точку в результат, даже если после неё нет цифр.

    Точность определяет количество цифр после десятичной точки; по умолчанию – 6.

  4. Альтернативная форма всегда включает десятичную точку в результат, а конечные нули не удаляются, как это было бы в противном случае.

    Точность определяет количество значащих цифр до и после десятичной точки; по умолчанию – 6.

  5. Если точность равна N, вывод усекается до N символов.

  6. См. PEP 237.

Поскольку строки Python имеют явную длину, преобразования %s не предполагают, что '\0' является концом строки.

Изменено в версии 3.1: %f преобразования для чисел, абсолютное значение которых превышает 1e50, больше не заменяются преобразованиями %g.

Типы бинарных последовательностей – bytes, bytearray, memoryviewBinary Sequence Types – bytes, bytearray, memoryview

Основные встроенные типы для работы с бинарными данными – bytes и bytearray. Они поддерживаются memoryview, который использует протокол буфера для доступа к памяти других бинарных объектов без необходимости создания копии.

Модуль array поддерживает эффективное хранение основных типов данных, таких как 32-битные целые числа и числа с плавающей точкой двойной точности IEEE754.

Объекты bytesBytes Objects

Объекты bytes – это неизменяемые последовательности отдельных байтов. Поскольку многие основные бинарные протоколы основаны на текстовой кодировке ASCII, объекты bytes предоставляют несколько методов, которые действительны только при работе с данными, совместимыми с ASCII, и тесно связаны со строковыми объектами во многих других отношениях.

class bytes(source=b'')
class bytes(source, encoding, errors='strict')

Во-первых, синтаксис литералов bytes в основном такой же, как для строковых литералов, за исключением того, что добавляется префикс b:

  • Одинарные кавычки: b'still allows embedded "double" quotes'

  • Двойные кавычки: b"still allows embedded 'single' quotes"

  • Тройные кавычки: b'''3 single quotes''', b"""3 double quotes"""

В литералах bytes допускаются только символы ASCII (независимо от объявленной кодировки исходного кода). Любые двоичные значения больше 127 должны вводиться в литералы bytes с помощью соответствующей управляющей последовательности.

Как и строковые литералы, литералы bytes также могут использовать префикс r для отключения обработки управляющих последовательностей. См. Строковые литералы и литералы bytes для получения дополнительной информации о различных формах литералов bytes, включая поддерживаемые управляющие последовательности.

Хотя литералы bytes и их представления основаны на тексте ASCII, объекты bytes на самом деле ведут себя как неизменяемые последовательности целых чисел, где каждое значение в последовательности ограничено так, что 0 <= x < 256 (попытки нарушить это ограничение вызовут ValueError). Это сделано намеренно, чтобы подчеркнуть, что хотя многие двоичные форматы содержат элементы на основе ASCII и могут быть полезно обработаны некоторыми текстовыми алгоритмами, в общем случае это не так для произвольных двоичных данных (слепое применение алгоритмов обработки текста к двоичным форматам, несовместимым с ASCII, обычно приводит к повреждению данных).

Помимо литералов, объекты bytes могут быть созданы несколькими другими способами:

  • Объект bytes, заполненный нулями заданной длины: bytes(10)

  • Из итерируемого объекта целых чисел: bytes(range(20))

  • Копирование существующих двоичных данных через буферный протокол: bytes(obj)

См. также встроенную функцию bytes.

Поскольку две шестнадцатеричные цифры соответствуют ровно одному байту, шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип bytes имеет дополнительный метод класса для чтения данных в этом формате:

classmethod fromhex(string, /)

Этот метод класса bytes возвращает объект bytes, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробельные символы ASCII игнорируются.

>>> bytes.fromhex('2Ef0 F1f2  ')
b'.\xf0\xf1\xf2'

Изменено в версии 3.7: bytes.fromhex() теперь пропускает все пробельные символы ASCII в строке, а не только пробелы.

Изменено в версии 3.14: bytes.fromhex() теперь принимает ASCII bytes и байтоподобные объекты в качестве входных данных.

Существует обратная функция преобразования для превращения объекта bytes в его шестнадцатеричное представление.

hex(*, bytes_per_sep=1)
hex(sep, bytes_per_sep=1)

Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.

>>> b'\xf0\xf1\xf2'.hex()
'f0f1f2'

Чтобы сделать шестнадцатеричную строку более читаемой, можно указать параметр sep – односимвольный разделитель, который будет включён в вывод. По умолчанию этот разделитель будет вставляться между каждым байтом. Второй необязательный параметр bytes_per_sep управляет интервалом. Положительные значения вычисляют позицию разделителя справа, отрицательные – слева.

>>> value = b'\xf0\xf1\xf2'
>>> value.hex('-')
'f0-f1-f2'
>>> value.hex('_', 2)
'f0_f1f2'
>>> b'UUDDLRLRAB'.hex(' ', -4)
'55554444 4c524c52 4142'

Добавлено в версии 3.5.

Изменено в версии 3.8: bytes.hex() теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.

Поскольку объекты bytes являются последовательностями целых чисел (похожими на кортеж), для объекта bytes b b[0] будет целым числом, а b[0:1] – объектом bytes длины 1. (Это отличается от текстовых строк, где и индексация, и извлечение среза дают строку длины 1).

Представление объектов bytes использует литеральный формат (b'...'), поскольку он часто более полезен, чем, например, bytes([46, 46, 46]). Всегда можно преобразовать объект bytes в список целых чисел с помощью list(b).

Объекты BytearrayBytearray Objects

Объекты bytearray являются изменяемым аналогом объектов bytes .

class bytearray(source=b'')
class bytearray(source, encoding, errors='strict')

Для объектов bytearray не существует специального литерального синтаксиса, вместо этого они всегда создаются вызовом конструктора:

  • Создание пустого экземпляра: bytearray()

  • Создание экземпляра, заполненного нулями заданной длины: bytearray(10)

  • Из итерируемого объекта целых чисел: bytearray(range(20))

  • Копирование существующих двоичных данных через буферный протокол: bytearray(b'Hi!')

Поскольку объекты bytearray являются изменяемыми, они поддерживают изменяемые операции последовательности в дополнение к общим операциям bytes и bytearray, описанным в Операции с bytes и bytearray.

См. также встроенную функцию bytearray.

Поскольку две шестнадцатеричные цифры соответствуют ровно одному байту, шестнадцатеричные числа часто используются для описания двоичных данных. Соответственно, тип bytearray имеет дополнительный метод класса для чтения данных в этом формате:

classmethod fromhex(string, /)

Этот метод класса bytearray возвращает объект bytearray, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробельные символы ASCII игнорируются.

>>> bytearray.fromhex('2Ef0 F1f2  ')
bytearray(b'.\xf0\xf1\xf2')

Изменено в версии 3.7: bytearray.fromhex() теперь пропускает все пробельные символы ASCII в строке, а не только пробелы.

Изменено в версии 3.14: bytearray.fromhex() теперь принимает ASCII bytes и байтоподобные объекты в качестве входных данных.

Существует обратная функция преобразования для превращения объекта bytearray в его шестнадцатеричное представление.

hex(*, bytes_per_sep=1)
hex(sep, bytes_per_sep=1)

Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.

>>> bytearray(b'\xf0\xf1\xf2').hex()
'f0f1f2'

Добавлено в версии 3.5.

Изменено в версии 3.8: Аналогично bytes.hex(), bytearray.hex() теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.

resize(size, /)

Изменяет размер bytearray так, чтобы он содержал size байт. size должен быть больше или равен 0.

Если bytearray нужно уменьшить, байты за пределами size отбрасываются.

Если bytearray нужно увеличить, все новые байты, находящиеся за пределами size, будут установлены в нулевые байты.

Это эквивалентно:

>>> def resize(ba, size):
...     if len(ba) > size:
...         del ba[size:]
...     else:
...         ba += b'\0' * (size - len(ba))

Примеры:

>>> shrink = bytearray(b'abc')
>>> shrink.resize(1)
>>> (shrink, len(shrink))
(bytearray(b'a'), 1)
>>> grow = bytearray(b'abc')
>>> grow.resize(5)
>>> (grow, len(grow))
(bytearray(b'abc\x00\x00'), 5)

Добавлено в версии 3.14.

take_bytes(n=None, /)

Удаляет первые n байт из bytearray и возвращает их как неизменяемый объект bytes. По умолчанию (если n равно None) возвращает все байты и очищает bytearray.

Если n отрицательно, то индекс считается с конца, и берутся первые len() плюс n байт. Если n выходит за границы, вызывается IndexError.

Если взять меньше полной длины, оставшиеся байты останутся в bytearray, что требует копирования. Если оставшиеся байты нужно отбросить, используйте resize() или del для усечения, а затем take_bytes() без указания размера.

Особенности реализации CPython: Взятие всех байтов – это операция без копирования.

Добавлено в версии 3.15: См. статью Что нового с примерами типовых шаблонов кода, которые можно оптимизировать с помощью bytearray.take_bytes().

Поскольку объекты bytearray являются последовательностями целых чисел (подобно списку), для объекта bytearray b, b[0] будет целым числом, а b[0:1] будет объектом bytearray длиной 1. (Это отличается от текстовых строк, где и индексирование, и срез возвращают строку длиной 1)

Представление объектов bytearray использует литеральный формат bytes (bytearray(b'...')), поскольку он часто более полезен, чем, например, bytearray([46, 46, 46]). Объект bytearray всегда можно преобразовать в список целых чисел с помощью list(b).

См. также

Подробную информацию о гарантиях потокобезопасности для объектов bytearray см. в разделе Потокобезопасность объектов bytearray.

Операции с bytes и bytearrayBytes and Bytearray Operations

Объекты bytes и bytearray поддерживают общие операции последовательности. Они взаимодействуют не только с операндами того же типа, но и с любым байтоподобным объектом. Благодаря такой гибкости их можно свободно смешивать в операциях, не вызывая ошибок. Однако тип возвращаемого результата может зависеть от порядка операндов.

Примечание

Методы объектов bytes и bytearray не принимают строки в качестве аргументов, так же как методы строк не принимают байты. Например, нужно писать:

a = "abc"
b = a.replace("a", "f")

и:

a = b"abc"
b = a.replace(b"a", b"f")

Некоторые операции с bytes и bytearray предполагают использование двоичных форматов, совместимых с ASCII, и поэтому их следует избегать при работе с произвольными двоичными данными. Эти ограничения описаны ниже.

Примечание

Использование этих операций на основе ASCII для манипуляции двоичными данными, которые не хранятся в формате на основе ASCII, может привести к повреждению данных.

Следующие методы объектов bytes и bytearray могут использоваться с произвольными двоичными данными.

bytes.count(sub[, start[, end]])
bytearray.count(sub[, start[, end]])

Возвращает количество непересекающихся вхождений подпоследовательности sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются как в нотации среза.

Подпоследовательность для поиска может быть любым байтоподобным объектом или целым числом от 0 до 255.

Если sub пуст, возвращает количество пустых срезов между символами, равное длине объекта bytes плюс один.

Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.

bytes.removeprefix(prefix, /)
bytearray.removeprefix(prefix, /)

Если двоичные данные начинаются со строки prefix, возвращается bytes[len(prefix):]. В противном случае возвращается копия исходных двоичных данных:

>>> b'TestHook'.removeprefix(b'Test')
b'Hook'
>>> b'BaseTestCase'.removeprefix(b'Test')
b'BaseTestCase'

Значением prefix может быть любой байтоподобный объект.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

Добавлено в версии 3.9.

bytes.removesuffix(suffix, /)
bytearray.removesuffix(suffix, /)

Если двоичные данные оканчиваются строкой suffix и эта suffix не пуста, возвращается bytes[:-len(suffix)]. В противном случае возвращается копия исходных двоичных данных:

>>> b'MiscTests'.removesuffix(b'Tests')
b'Misc'
>>> b'TmpDirMixin'.removesuffix(b'Tests')
b'TmpDirMixin'

Значением suffix может быть любой байтоподобный объект.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

Добавлено в версии 3.9.

bytes.decode(encoding='utf-8', errors='strict')
bytearray.decode(encoding='utf-8', errors='strict')

Возвращает байты, декодированные в str.

encoding по умолчанию равен 'utf-8'; список возможных значений см. в Стандартные кодировки.

Параметр errors управляет обработкой ошибок декодирования. Если 'strict' (по умолчанию), возбуждается исключение UnicodeError. Другие возможные значения: 'ignore', 'replace', и любое другое имя, зарегистрированное через codecs.register_error(). Подробнее см. в Обработчики ошибок.

По соображениям производительности значение errors не проверяется на корректность, пока не произойдёт ошибка декодирования, не будет включён Режим разработки Python или не будет использована отладочная сборка.

Примечание

Передача аргумента encoding в str позволяет декодировать любой байтоподобный объект напрямую, без необходимости создавать временный объект bytes или bytearray.

Изменено в версии 3.1: Добавлена поддержка именованных аргументов.

Изменено в версии 3.9: Значение аргумента errors теперь проверяется в Режиме разработки Python и в режиме отладки.

bytes.endswith(suffix[, start[, end]])
bytearray.endswith(suffix[, start[, end]])

Возвращает True, если двоичные данные оканчиваются указанным suffix, в противном случае возвращает False. suffix также может быть кортежем суффиксов для поиска. С необязательным start проверка начинается с этой позиции. С необязательным end сравнение прекращается на этой позиции.

Искомый суффикс (или суффиксы) может быть любым байтоподобным объектом.

bytes.find(sub[, start[, end]])
bytearray.find(sub[, start[, end]])

Возвращает наименьший индекс в данных, на котором найдена подпоследовательность sub, при условии, что sub содержится в срезе s[start:end]. Необязательные аргументы start и end интерпретируются как в нотации срезов. Возвращает -1, если sub не найдена.

Подпоследовательность для поиска может быть любым байтоподобным объектом или целым числом от 0 до 255.

Примечание

Метод find() следует использовать только если нужно знать позицию sub. Чтобы проверить, является ли sub подстрокой, используйте оператор in:

>>> b'Py' in b'Python'
True

Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.

bytes.index(sub[, start[, end]])
bytearray.index(sub[, start[, end]])

Как find(), но возбуждает ValueError, если подпоследовательность не найдена.

Подпоследовательность для поиска может быть любым байтоподобным объектом или целым числом от 0 до 255.

Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.

bytes.join(iterable, /)
bytearray.join(iterable, /)

Возвращает объект bytes или bytearray, представляющий собой конкатенацию последовательностей двоичных данных из iterable. Исключение TypeError возникнет, если в iterable окажутся значения, не являющиеся байтоподобными объектами, включая объекты str. Разделителем между элементами служит содержимое объекта bytes или bytearray, предоставляющего этот метод.

static bytes.maketrans(from, to, /)
static bytearray.maketrans(from, to, /)

Этот статический метод возвращает таблицу перевода, пригодную для использования с bytes.translate(), которая сопоставляет каждый символ из from с символом на той же позиции в to; from и to оба должны быть байтоподобными объектами и иметь одинаковую длину.

Добавлено в версии 3.1.

bytes.partition(sep, /)
bytearray.partition(sep, /)

Разделяет последовательность по первому вхождению sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель (или его копию bytearray) и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий копию исходной последовательности, за которой следуют два пустых объекта bytes или bytearray.

Разделитель для поиска может быть любым байтоподобным объектом.

bytes.replace(old, new, /, count=-1)
bytearray.replace(old, new, /, count=-1)

Возвращает копию последовательности, в которой все вхождения подпоследовательности old заменены на new. Если указан count, заменяются только первые count вхождений. Если count не задан или равен -1, заменяются все вхождения.

Искомая подпоследовательность и её замена могут быть любым байтоподобным объектом.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

Изменено в версии 3.15: count теперь поддерживается как именованный аргумент.

bytes.rfind(sub[, start[, end]])
bytearray.rfind(sub[, start[, end]])

Возвращает наибольший индекс в последовательности, на котором найдена подпоследовательность sub, так что sub находится в пределах s[start:end]. Необязательные аргументы start и end интерпретируются как в записи среза. В случае отсутствия возвращает -1.

Подпоследовательность для поиска может быть любым байтоподобным объектом или целым числом от 0 до 255.

Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.

bytes.rindex(sub[, start[, end]])
bytearray.rindex(sub[, start[, end]])

Действует как rfind(), но вызывает ValueError, если подпоследовательность sub не найдена.

Подпоследовательность для поиска может быть любым байтоподобным объектом или целым числом от 0 до 255.

Изменено в версии 3.3: Теперь также принимает целое число от 0 до 255 в качестве подпоследовательности.

bytes.rpartition(sep, /)
bytearray.rpartition(sep, /)

Разделяет последовательность по последнему вхождению sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель (или его копию bytearray) и часть после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий два пустых объекта bytes или bytearray, за которыми следует копия исходной последовательности.

Разделитель для поиска может быть любым байтоподобным объектом.

bytes.startswith(prefix[, start[, end]])
bytearray.startswith(prefix[, start[, end]])

Возвращает True, если двоичные данные начинаются с указанного префикса, иначе возвращает False. Префикс также может быть кортежем префиксов для поиска. С необязательным start проверка начинается с этой позиции. С необязательным end сравнение останавливается на этой позиции.

Префикс(ы) для поиска может быть любым байтоподобным объектом.

bytes.translate(table, /, delete=b'')
bytearray.translate(table, /, delete=b'')

Возвращает копию объекта bytes или bytearray, из которой удалены все байты, встречающиеся в необязательном аргументе delete, а оставшиеся байты преобразованы через заданную таблицу перекодировки, которая должна быть объектом bytes длиной 256.

Для создания таблицы перекодировки можно использовать метод bytes.maketrans().

Установите аргумент table равным None для преобразований, которые только удаляют символы:

>>> b'read this short text'.translate(None, b'aeiou')
b'rd ths shrt txt'

Изменено в версии 3.6: delete теперь поддерживается как именованный аргумент.

Следующие методы объектов bytes и bytearray имеют поведение по умолчанию, предполагающее использование бинарных форматов, совместимых с ASCII, но их можно использовать с произвольными двоичными данными, передав соответствующие аргументы. Обратите внимание, что все методы bytearray в этом разделе не работают на месте, а вместо этого создают новые объекты.

bytes.center(width, fillbyte=b' ', /)
bytearray.center(width, fillbyte=b' ', /)

Возвращает копию объекта, выровненную по центру в последовательности длины width. Заполнение выполняется с помощью указанного fillbyte (по умолчанию – пробел ASCII). Для объектов bytes исходная последовательность возвращается, если width меньше или равно len(s).

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

bytes.ljust(width, fillbyte=b' ', /)
bytearray.ljust(width, fillbyte=b' ', /)

Возвращает копию объекта, выровненную по левому краю в последовательности длины width. Заполнение выполняется с помощью указанного fillbyte (по умолчанию – пробел ASCII). Для объектов bytes исходная последовательность возвращается, если width меньше или равно len(s).

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

bytes.lstrip(bytes=None, /)
bytearray.lstrip(bytes=None, /)

Возвращает копию последовательности с удалёнными указанными начальными байтами. Аргумент bytes – это двоичная последовательность, задающая набор значений байтов, которые нужно удалить. Если он опущен или равен None, аргумент bytes по умолчанию удаляет пробельные символы ASCII. Аргумент bytes не является префиксом; вместо этого удаляются все комбинации его значений:

>>> b'   spacious   '.lstrip()
b'spacious   '
>>> b'www.example.com'.lstrip(b'cmowz.')
b'example.com'

Двоичная последовательность значений байтов для удаления может быть любым байтоподобным объектом. См. removeprefix() для метода, который удаляет одну строку-префикс, а не набор символов. Например:

>>> b'Arthur: three!'.lstrip(b'Arthur: ')
b'ee!'
>>> b'Arthur: three!'.removeprefix(b'Arthur: ')
b'three!'

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

bytes.rjust(width, fillbyte=b' ', /)
bytearray.rjust(width, fillbyte=b' ', /)

Возвращает копию объекта, выровненную по правому краю в последовательности длины width. Заполнение выполняется с помощью указанного fillbyte (по умолчанию – пробел ASCII). Для объектов bytes исходная последовательность возвращается, если width меньше или равно len(s).

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

bytes.rsplit(sep=None, maxsplit=-1)
bytearray.rsplit(sep=None, maxsplit=-1)

Разделяет двоичную последовательность на подпоследовательности того же типа, используя sep в качестве строки-разделителя. Если указан maxsplit, выполняется не более maxsplit разделений, а именно крайних справа. Если sep не указан или равен None, любая подпоследовательность, состоящая только из пробельных символов ASCII, считается разделителем. За исключением разделения справа, rsplit() ведёт себя как split(), который подробно описан ниже.

bytes.rstrip(bytes=None, /)
bytearray.rstrip(bytes=None, /)

Возвращает копию последовательности с удалёнными указанными завершающими байтами. Аргумент bytes – это двоичная последовательность, задающая набор удаляемых байтов. Если он опущен или равен None, то по умолчанию аргумент bytes удаляет пробельные символы ASCII. Аргумент bytes – это не суффикс; скорее, удаляются все комбинации его значений:

>>> b'   spacious   '.rstrip()
b'   spacious'
>>> b'mississippi'.rstrip(b'ipz')
b'mississ'

Двоичная последовательность удаляемых байтов может быть любым байтоподобным объектом. См. removesuffix() для метода, который удаляет одну строку-суффикс, а не весь набор символов. Например:

>>> b'Monty Python'.rstrip(b' Python')
b'M'
>>> b'Monty Python'.removesuffix(b' Python')
b'Monty'

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

bytes.split(sep=None, maxsplit=-1)
bytearray.split(sep=None, maxsplit=-1)

Разделяет двоичную последовательность на подпоследовательности того же типа, используя sep в качестве строки-разделителя. Если указан maxsplit и он неотрицателен, то выполняется не более maxsplit разбиений (таким образом, список будет содержать не более maxsplit+1 элементов). Если maxsplit не указан или равен -1, то ограничения на количество разбиений нет (выполняются все возможные разбиения).

Если указан sep, то последовательные разделители не группируются и считаются разграничивающими пустые подпоследовательности (например, b'1,,2'.split(b',') возвращает [b'1', b'', b'2']). Аргумент sep может состоять из многобайтовой последовательности как единого разделителя. Разбиение пустой последовательности с указанным разделителем возвращает [b''] или [bytearray(b'')] в зависимости от типа разбиваемого объекта. Аргумент sep может быть любым байтоподобным объектом.

Например:

>>> b'1,2,3'.split(b',')
[b'1', b'2', b'3']
>>> b'1,2,3'.split(b',', maxsplit=1)
[b'1', b'2,3']
>>> b'1,2,,3,'.split(b',')
[b'1', b'2', b'', b'3', b'']
>>> b'1<>2<>3<4'.split(b'<>')
[b'1', b'2', b'3<4']

Если sep не указан или равен None, применяется другой алгоритм разбиения: последовательности пробельных символов ASCII считаются одним разделителем, и результат не будет содержать пустых строк в начале или конце, если последовательность имеет начальные или завершающие пробелы. Следовательно, разбиение пустой последовательности или последовательности, состоящей только из пробельных символов ASCII, без указанного разделителя возвращает [].

Например:

>>> b'1 2 3'.split()
[b'1', b'2', b'3']
>>> b'1 2 3'.split(maxsplit=1)
[b'1', b'2 3']
>>> b'   1   2   3   '.split()
[b'1', b'2', b'3']
bytes.strip(bytes=None, /)
bytearray.strip(bytes=None, /)

Возвращает копию последовательности с удалёнными указанными начальными и завершающими байтами. Аргумент bytes – это двоичная последовательность, задающая набор удаляемых байтов. Если он опущен или равен None, то по умолчанию аргумент bytes удаляет пробельные символы ASCII. Аргумент bytes – это не префикс или суффикс; скорее, удаляются все комбинации его значений:

>>> b'   spacious   '.strip()
b'spacious'
>>> b'www.example.com'.strip(b'cmowz.')
b'example'

Двоичная последовательность удаляемых байтов может быть любым байтоподобным объектом.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если никаких изменений не было.

Следующие методы для объектов bytes и bytearray предполагают использование двоичных форматов, совместимых с ASCII, и не должны применяться к произвольным двоичным данным. Обратите внимание, что все методы bytearray в этом разделе не работают на месте, а создают новые объекты.

bytes.capitalize()
bytearray.capitalize()

Возвращает копию последовательности, где каждый байт интерпретируется как символ ASCII, первый байт преобразуется в верхний регистр, а остальные – в нижний. Не-ASCII байты передаются без изменений.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

bytes.expandtabs(tabsize=8)
bytearray.expandtabs(tabsize=8)

Возвращает копию последовательности, в которой все символы табуляции ASCII заменяются одним или несколькими пробелами ASCII, в зависимости от текущей позиции столбца и заданного размера табуляции. Позиции табуляции находятся каждые tabsize байт (по умолчанию 8, что даёт позиции табуляции на столбцах 0, 8, 16 и так далее). Для расширения последовательности текущий столбец устанавливается в ноль, и последовательность просматривается побайтно. Если байт является символом табуляции ASCII (b'\t'), в результат вставляется один или несколько пробелов, пока текущий столбец не сравняется со следующей позицией табуляции. (Сам символ табуляции не копируется.) Если текущий байт является символом новой строки ASCII (b'\n') или возврата каретки (b'\r'), он копируется, а текущий столбец сбрасывается в ноль. Любое другое значение байта копируется без изменений, а текущий столбец увеличивается на единицу независимо от того, как представляется значение байта при печати:

>>> b'01\t012\t0123\t01234'.expandtabs()
b'01      012     0123    01234'
>>> b'01\t012\t0123\t01234'.expandtabs(4)
b'01  012 0123    01234'

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

bytes.isalnum()
bytearray.isalnum()

Возвращает True, если все байты в последовательности являются буквенными символами ASCII или десятичными цифрами ASCII и последовательность непуста, иначе False. Буквенные символы ASCII – это значения байтов из диапазона b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. Десятичные цифры ASCII – это значения байтов из диапазона b'0123456789'.

Например:

>>> b'ABCabc1'.isalnum()
True
>>> b'ABC abc1'.isalnum()
False
bytes.isalpha()
bytearray.isalpha()

Возвращает True, если все байты в последовательности являются буквенными символами ASCII и последовательность непуста, иначе False. Буквенные символы ASCII – это значения байтов из диапазона b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.

Например:

>>> b'ABCabc'.isalpha()
True
>>> b'ABCabc1'.isalpha()
False
bytes.isascii()
bytearray.isascii()

Возвращает True, если последовательность пуста или все байты в последовательности являются ASCII, иначе False. Байты ASCII находятся в диапазоне 0-0x7F.

Добавлено в версии 3.7.

bytes.isdigit()
bytearray.isdigit()

Возвращает True, если все байты последовательности являются десятичными цифрами ASCII и последовательность не пуста, и False в противном случае. Десятичные цифры ASCII – это значения байтов из диапазона b'0123456789'.

Например:

>>> b'1234'.isdigit()
True
>>> b'1.23'.isdigit()
False
bytes.islower()
bytearray.islower()

Возвращает True, если в последовательности есть хотя бы один символ ASCII в нижнем регистре и нет символов ASCII в верхнем регистре, и False в противном случае.

Например:

>>> b'hello world'.islower()
True
>>> b'Hello world'.islower()
False

Строчные ASCII-символы – это байтовые значения в диапазоне b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы – это байтовые значения в диапазоне b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

bytes.isspace()
bytearray.isspace()

Возвращает True, если все байты последовательности являются пробельными символами ASCII и последовательность не пуста, и False в противном случае. Пробельные символы ASCII – это значения байтов из диапазона b' \t\n\r\x0b\f' (пробел, табуляция, перевод строки, возврат каретки, вертикальная табуляция, перевод страницы).

bytes.istitle()
bytearray.istitle()

Возвращает True, если последовательность находится в регистре заголовка (titlecase) ASCII и не пуста, и False в противном случае. См. bytes.title() для подробностей об определении «titlecase».

Например:

>>> b'Hello World'.istitle()
True
>>> b'Hello world'.istitle()
False
bytes.isupper()
bytearray.isupper()

Возвращает True, если в последовательности есть хотя бы один алфавитный символ ASCII в верхнем регистре и нет символов ASCII в нижнем регистре, и False в противном случае.

Например:

>>> b'HELLO WORLD'.isupper()
True
>>> b'Hello world'.isupper()
False

Строчные ASCII-символы – это байтовые значения в диапазоне b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы – это байтовые значения в диапазоне b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

bytes.lower()
bytearray.lower()

Возвращает копию последовательности, в которой все символы ASCII в верхнем регистре преобразованы в соответствующие символы нижнего регистра.

Например:

>>> b'Hello World'.lower()
b'hello world'

Строчные ASCII-символы – это байтовые значения в диапазоне b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы – это байтовые значения в диапазоне b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

bytes.splitlines(keepends=False)
bytearray.splitlines(keepends=False)

Возвращает список строк в двоичной последовательности, разбивая по границам строк ASCII. Этот метод использует подход универсального перевода строк для разделения строк. Разрывы строк не включаются в итоговый список, если только keepends не задано и не равно true.

Например:

>>> b'ab c\n\nde fg\rkl\r\n'.splitlines()
[b'ab c', b'', b'de fg', b'kl']
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
[b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']

В отличие от split(), когда задана строка-разделитель sep, этот метод возвращает пустой список для пустой строки, и концевой разрыв строки не приводит к появлению дополнительной строки:

>>> b"".split(b'\n'), b"Two lines\n".split(b'\n')
([b''], [b'Two lines', b''])
>>> b"".splitlines(), b"One line\n".splitlines()
([], [b'One line'])
bytes.swapcase()
bytearray.swapcase()

Возвращает копию последовательности, в которой все символы ASCII в нижнем регистре преобразованы в соответствующие символы верхнего регистра и наоборот.

Например:

>>> b'Hello World'.swapcase()
b'hELLO wORLD'

Строчные ASCII-символы – это байтовые значения в диапазоне b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы – это байтовые значения в диапазоне b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

В отличие от str.swapcase(), для двоичных версий всегда выполняется bin.swapcase().swapcase() == bin. Преобразования регистра симметричны в ASCII, хотя это не всегда верно для произвольных кодовых точек Unicode.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

bytes.title()
bytearray.title()

Возвращает версию двоичной последовательности, в которой каждое слово начинается с заглавной буквы ASCII, а остальные символы – строчные. Байтовые значения без регистра остаются без изменений.

Например:

>>> b'Hello world'.title()
b'Hello World'

Строчные ASCII-символы – это байтовые значения в диапазоне b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы – это байтовые значения в диапазоне b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. Все остальные байтовые значения не имеют регистра.

Алгоритм использует простое, не зависящее от языка определение слова как группы последовательных букв. Это определение работает во многих контекстах, но означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может быть нежелательным результатом:

>>> b"they're bill's friends from the UK".title()
b"They'Re Bill'S Friends From The Uk"

Обходной путь для апострофов можно построить с помощью регулярных выражений:

>>> import re
>>> def titlecase(s):
...     return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",
...                   lambda mo: mo.group(0)[0:1].upper() +
...                              mo.group(0)[1:].lower(),
...                   s)
...
>>> titlecase(b"they're bill's friends.")
b"They're Bill's Friends."

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

bytes.upper()
bytearray.upper()

Возвращает копию последовательности, в которой все строчные ASCII-символы преобразованы в соответствующие заглавные.

Например:

>>> b'Hello World'.upper()
b'HELLO WORLD'

Строчные ASCII-символы – это байтовые значения в диапазоне b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы – это байтовые значения в диапазоне b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

bytes.zfill(width, /)
bytearray.zfill(width, /)

Возвращает копию последовательности, дополненную слева цифрами b'0' ASCII, чтобы получить последовательность длины width. Ведущий знак (b'+'/ b'-') обрабатывается путём вставки дополнения после знака, а не до него. Для объектов bytes исходная последовательность возвращается, если width меньше или равно len(seq).

Например:

>>> b"42".zfill(5)
b'00042'
>>> b"-42".zfill(5)
b'-0042'

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

printf-стиль форматирования байтовprintf-style Bytes Formatting

Примечание

Описанные здесь операции форматирования обладают рядом особенностей, которые приводят ко многим распространённым ошибкам (например, неправильное отображение кортежей и словарей). Если выводимое значение может быть кортежем или словарём, оберните его в кортеж.

Объекты bytes (bytes/bytearray) имеют одну уникальную встроенную операцию: оператор % (modulo). Он также известен как оператор форматирования или интерполяции байтов. Для выражения format % values (где format – это объект bytes) спецификации преобразования % в format заменяются на ноль или более элементов из values. Эффект аналогичен использованию sprintf() в языке C.

Если format требует один аргумент, values может быть одним объектом, не являющимся кортежем. [5] В противном случае values должен быть кортежем с точным числом элементов, указанным в форматном объекте bytes, или одним отображающим объектом (например, словарём).

Спецификатор преобразования содержит два или более символа и состоит из следующих компонентов, которые должны располагаться в указанном порядке:

  1. Символ '%', обозначающий начало спецификатора.

  2. Ключ отображения (необязательно), состоящий из последовательности символов в круглых скобках (например, (somename)).

  3. Флаги преобразования (необязательно), влияющие на результат для некоторых типов преобразования.

  4. Минимальная ширина поля (необязательно). Если указана как '*' (звёздочка), то фактическая ширина берётся из следующего элемента кортежа в values, а преобразуемый объект следует после минимальной ширины поля и необязательной точности.

  5. Точность (необязательно), задаётся как '.' (точка), после которой следует значение точности. Если указана как '*' (звёздочка), фактическая точность берётся из следующего элемента кортежа в values, и преобразуемое значение следует после точности.

  6. Модификатор длины (необязательно).

  7. Тип преобразования.

Когда правый аргумент является словарём (или другим типом отображения), то форматы в объекте bytes должны включать ключ отображения в круглых скобках, указывающий на этот словарь, вставленный сразу после символа '%'. Ключ отображения выбирает значение для форматирования из отображения. Например:

>>> print(b'%(language)s has %(number)03d quote types.' %
...       {b'language': b"Python", b"number": 2})
b'Python has 002 quote types.'

В этом случае в формате не должно быть спецификаторов * (поскольку они требуют последовательного списка параметров).

Символы флагов преобразования:

Флаг

Значение

'#'

Преобразование значения будет использовать «альтернативную форму» (определённую ниже).

'0'

Для числовых значений преобразование будет дополняться нулями.

'-'

Преобразованное значение выравнивается по левому краю (переопределяет преобразование '0', если указаны оба).

' '

(пробел) Перед положительным числом (или пустой строкой), полученным в результате знакового преобразования, следует оставлять пробел.

'+'

Знак ('+' или '-') будет предшествовать преобразованию (переопределяет флаг «пробел»).

Модификатор длины (h, l или L) может присутствовать, но игнорируется, поскольку он не нужен для Python – так, например, %ld идентично %d.

Типы преобразования:

Преобразование

Значение

Примечания

'd'

Десятичное целое со знаком.

'i'

Десятичное целое со знаком.

'o'

Восьмеричное значение со знаком.

(1)

'u'

Устаревший тип – идентичен 'd'.

(8)

'x'

Шестнадцатеричное со знаком (строчные буквы).

(2)

'X'

Шестнадцатеричное со знаком (заглавные буквы).

(2)

'e'

Экспоненциальный формат с плавающей запятой (строчные буквы).

(3)

'E'

Экспоненциальный формат с плавающей запятой (заглавные буквы).

(3)

'f'

Десятичный формат с плавающей запятой.

(3)

'F'

Десятичный формат с плавающей запятой.

(3)

'g'

Формат с плавающей запятой. Использует экспоненциальный формат со строчными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат.

(4)

'G'

Формат с плавающей запятой. Использует экспоненциальный формат с заглавными буквами если показатель степени меньше -4 или не меньше точности, в противном случае – десятичный формат.

(4)

'c'

Один байт (принимает целое число или объект из одного байта).

'b'

Байты (любой объект, следующий протоколу буфера или имеющий __bytes__()).

(5)

's'

's' – псевдоним для 'b' и должен использоваться только в кодовых базах Python2/3.

(6)

'a'

Байты (преобразует любой объект Python с помощью repr(obj).encode('ascii', 'backslashreplace')).

(5)

'r'

'r' – псевдоним для 'a' и должен использоваться только в кодовых базах Python2/3.

(7)

'%'

Ни один аргумент не преобразуется, результатом является символ '%' в итоговом выводе.

Примечания:

  1. Альтернативная форма вставляет ведущий восьмеричный спецификатор ('0o') перед первой цифрой.

  2. Альтернативная форма вставляет перед первой цифрой ведущий '0x' или '0X' (в зависимости от того, использовался ли формат 'x' или 'X').

  3. Альтернативная форма всегда включает десятичную точку в результат, даже если после неё нет цифр.

    Точность определяет количество цифр после десятичной точки; по умолчанию – 6.

  4. Альтернативная форма всегда включает десятичную точку в результат, а конечные нули не удаляются, как это было бы в противном случае.

    Точность определяет количество значащих цифр до и после десятичной точки; по умолчанию – 6.

  5. Если точность равна N, вывод усекается до N символов.

  6. b'%s' устарело, но не будет удалено в серии 3.x.

  7. b'%r' устарело, но не будет удалено в серии 3.x.

  8. См. PEP 237.

Примечание

Версия этого метода для bytearray не работает на месте – она всегда создаёт новый объект, даже если изменения не вносились.

См. также

PEP 461 – добавление форматирования % для bytes и bytearray

Добавлено в версии 3.5.

Представления памятиMemory Views

Объекты memoryview позволяют коду Python получать доступ к внутренним данным объекта, поддерживающего протокол буфера, без копирования.

class memoryview(object)

Создаёт memoryview, ссылающийся на объект. Объект должен поддерживать протокол буфера. Встроенные объекты, поддерживающие протокол буфера, включают bytes и bytearray.

memoryview имеет понятие элемента, который является атомарной единицей памяти, обрабатываемой исходным объектом. Для многих простых типов, таких как bytes и bytearray, элемент – это один байт, но другие типы, например array.array, могут иметь более крупные элементы.

memoryview являются обобщёнными по типу своих базовых данных.

len(view) равно длине tolist(), которая является вложенным списком, представляющим представление. Если view.ndim = 1, то это равно количеству элементов в представлении.

Изменено в версии 3.12: Если view.ndim == 0, len(view) теперь вызывает TypeError вместо возврата 1.

Атрибут itemsize возвращает количество байт в одном элементе.

memoryview поддерживает срезы и индексацию для доступа к своим данным. Одномерный срез приводит к подпредставлению:

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'

Если format – один из собственных спецификаторов формата из модуля struct, то также поддерживается индексация целым числом или кортежем целых чисел, которая возвращает отдельный элемент с правильным типом. Одномерные memoryview можно индексировать целым числом или кортежем из одного целого. Многомерные memoryview можно индексировать кортежами ровно из ndim целых чисел, где ndim – количество измерений. Нулевые memoryview можно индексировать пустым кортежем.

Вот пример с небайтовым форматом:

>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
-11111111
>>> m[-1]
44444444
>>> m[::2].tolist()
[-11111111, -33333333]

Если базовый объект доступен для записи, memoryview поддерживает одномерное присваивание среза. Изменение размера не допускается:

>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')

Одномерные memoryview хэшируемых (только для чтения) типов с форматами 'B', 'b' или 'c' также хэшируемы. Хэш определяется как hash(m) == hash(m.tobytes()):

>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True

Изменено в версии 3.3: Одномерные memoryview теперь можно разрезать. Одномерные memoryview с форматами 'B', 'b' или 'c' теперь хэшируемы.

Изменено в версии 3.4: memoryview теперь автоматически регистрируется с помощью collections.abc.Sequence

Изменено в версии 3.5: memoryview теперь можно индексировать кортежем целых чисел.

Изменено в версии 3.14: memoryview теперь является обобщённым типом.

memoryview имеет несколько методов:

__eq__(exporter)

Memoryview и PEP 3118 экспортёр равны, если их формы эквивалентны и если все соответствующие значения равны при интерпретации кодов формата операндов с использованием синтаксиса struct.

Для подмножества строк формата struct, поддерживаемых в настоящее время tolist(), v и w равны, если v.tolist() == w.tolist():

>>> import array
>>> a = array.array('I', [1, 2, 3, 4, 5])
>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
>>> c = array.array('b', [5, 3, 1])
>>> x = memoryview(a)
>>> y = memoryview(b)
>>> x == a == y == b
True
>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
True
>>> z = y[::-2]
>>> z == c
True
>>> z.tolist() == c.tolist()
True

Если какая-либо строка формата не поддерживается модулем struct, то объекты всегда будут сравниваться как неравные (даже если строки формата и содержимое буфера одинаковы):

>>> from ctypes import BigEndianStructure, c_long
>>> class BEPoint(BigEndianStructure):
...     _fields_ = [("x", c_long), ("y", c_long)]
...
>>> point = BEPoint(100, 200)
>>> a = memoryview(point)
>>> b = memoryview(point)
>>> a == point
False
>>> a == b
False

Обратите внимание, что, как и для чисел с плавающей точкой, v is w не подразумевает v == w для объектов memoryview.

Изменено в версии 3.3: В предыдущих версиях сравнивалась необработанная память без учёта формата элемента и логической структуры массива.

tobytes(order='C')

Возвращает данные в буфере в виде байтовой строки. Это эквивалентно вызову конструктора bytes для memoryview.

>>> m = memoryview(b"abc")
>>> m.tobytes()
b'abc'
>>> bytes(m)
b'abc'

Для несплошных массивов результат равен плоскому списку, представляющему данные, со всеми элементами, преобразованными в байты. tobytes() поддерживает все строки формата, включая те, которые не соответствуют синтаксису модуля struct.

Добавлено в версии 3.8: order может быть {‘C’, ‘F’, ‘A’}. Когда order равен ‘C’ или ‘F’, данные исходного массива преобразуются в порядок C или Fortran. Для сплошных представлений ‘A’ возвращает точную копию физической памяти. В частности, порядок Fortran в памяти сохраняется. Для несплошных представлений данные сначала преобразуются в C. order=None то же самое, что order='C'.

hex(*, bytes_per_sep=1)
hex(sep, bytes_per_sep=1)

Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в буфере.

>>> m = memoryview(b"abc")
>>> m.hex()
'616263'

Добавлено в версии 3.5.

Изменено в версии 3.8: Аналогично bytes.hex(), memoryview.hex() теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.

tolist()

Возвращает данные в буфере в виде списка элементов.

>>> memoryview(b'abc').tolist()
[97, 98, 99]
>>> import array
>>> a = array.array('d', [1.1, 2.2, 3.3])
>>> m = memoryview(a)
>>> m.tolist()
[1.1, 2.2, 3.3]

Изменено в версии 3.3: tolist() теперь поддерживает все односимвольные нативные форматы в синтаксисе модуля struct, а также многомерные представления.

toreadonly()

Возвращает версию объекта memoryview, доступную только для чтения. Исходный объект memoryview остаётся неизменным.

>>> m = memoryview(bytearray(b'abc'))
>>> mm = m.toreadonly()
>>> mm.tolist()
[97, 98, 99]
>>> mm[0] = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> m[0] = 43
>>> mm.tolist()
[43, 98, 99]

Добавлено в версии 3.8.

release()

Освобождает буфер, предоставляемый объектом memoryview. Многие объекты выполняют специальные действия, когда на них удерживается представление (например, bytearray временно запрещает изменение размера); поэтому вызов release() удобен для снятия этих ограничений (и освобождения любых зависших ресурсов) как можно скорее.

После вызова этого метода любая дальнейшая операция над представлением вызывает ValueError (за исключением самого release(), который может быть вызван несколько раз):

>>> m = memoryview(b'abc')
>>> m.release()
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object

Протокол управления контекстом может использоваться для аналогичного эффекта с помощью оператора with:

>>> with memoryview(b'abc') as m:
...     m[0]
...
97
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object

Добавлено в версии 3.2.

cast(format, /)
cast(format, shape, /)

Преобразует memoryview в новый формат или форму. shape по умолчанию равен [byte_length//new_itemsize], что означает, что результирующее представление будет одномерным. Возвращаемое значение – новый memoryview, но сам буфер не копируется. Поддерживаемые преобразования: 1D -> C-contiguous и C-contiguous -> 1D.

Целевой формат ограничен одноэлементным нативным форматом в синтаксисе struct. Один из форматов должен быть байтовым ('B', 'b' или 'c'). Байтовая длина результата должна совпадать с исходной длиной. Обратите внимание, что все байтовые длины могут зависеть от операционной системы.

Преобразование 1D/long в 1D/unsigned bytes:

>>> import array
>>> a = array.array('l', [1,2,3])
>>> x = memoryview(a)
>>> x.format
'l'
>>> x.itemsize
8
>>> len(x)
3
>>> x.nbytes
24
>>> y = x.cast('B')
>>> y.format
'B'
>>> y.itemsize
1
>>> len(y)
24
>>> y.nbytes
24

Преобразование 1D/unsigned bytes в 1D/char:

>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> x[0] = b'a'
Traceback (most recent call last):
  ...
TypeError: memoryview: invalid type for format 'B'
>>> y = x.cast('c')
>>> y[0] = b'a'
>>> b
bytearray(b'ayz')

Преобразование 1D/bytes в 3D/ints в 1D/signed char:

>>> import struct
>>> buf = struct.pack("i"*12, *list(range(12)))
>>> x = memoryview(buf)
>>> y = x.cast('i', shape=[2,2,3])
>>> y.tolist()
[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
>>> y.format
'i'
>>> y.itemsize
4
>>> len(y)
2
>>> y.nbytes
48
>>> z = y.cast('b')
>>> z.format
'b'
>>> z.itemsize
1
>>> len(z)
48
>>> z.nbytes
48

Преобразование 1D/unsigned long в 2D/unsigned long:

>>> buf = struct.pack("L"*6, *list(range(6)))
>>> x = memoryview(buf)
>>> y = x.cast('L', shape=[2,3])
>>> len(y)
2
>>> y.nbytes
48
>>> y.tolist()
[[0, 1, 2], [3, 4, 5]]

Добавлено в версии 3.3.

Изменено в версии 3.5: Исходный формат больше не ограничен при преобразовании в байтовое представление.

count(value, /)

Подсчитывает количество вхождений value.

Добавлено в версии 3.14.

index(value, start=0, stop=sys.maxsize, /)

Возвращает индекс первого вхождения value (начиная с индекса start и до индекса stop).

Вызывает ValueError, если value не найден.

Добавлено в версии 3.14.

Также доступно несколько атрибутов только для чтения:

obj

Базовый объект memoryview:

>>> b  = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True

Добавлено в версии 3.3.

nbytes

nbytes == product(shape) * itemsize == len(m.tobytes()). Это объём в байтах, который массив занимал бы в непрерывном представлении. Он не обязательно равен len(m):

>>> import array
>>> a = array.array('i', [1,2,3,4,5])
>>> m = memoryview(a)
>>> len(m)
5
>>> m.nbytes
20
>>> y = m[::2]
>>> len(y)
3
>>> y.nbytes
12
>>> len(y.tobytes())
12

Многомерные массивы:

>>> import struct
>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
>>> x = memoryview(buf)
>>> y = x.cast('d', shape=[3,4])
>>> y.tolist()
[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
>>> len(y)
3
>>> y.nbytes
96

Добавлено в версии 3.3.

readonly

Логическое значение bool, указывающее, доступна ли память только для чтения.

format

Строка, содержащая формат (в стиле модуля struct) для каждого элемента в представлении. Memoryview может быть создан из экспортёров с произвольными строками формата, но некоторые методы (например, tolist()) ограничены нативными одноэлементными форматами.

Изменено в версии 3.3: формат 'B' теперь обрабатывается в соответствии с синтаксисом модуля struct. Это означает, что memoryview(b'abc')[0] == b'abc'[0] == 97.

itemsize

Размер в байтах каждого элемента memoryview:

>>> import array, struct
>>> m = memoryview(array.array('H', [32000, 32001, 32002]))
>>> m.itemsize
2
>>> m[0]
32000
>>> struct.calcsize('H') == m.itemsize
True
ndim

Целое число, указывающее количество измерений многомерного массива, которое представляет данный блок памяти.

shape

Кортеж целых чисел длиной ndim, задающий форму памяти как N-мерного массива.

Изменено в версии 3.3: пустой кортеж вместо None, когда ndim = 0.

strides

Кортеж целых чисел длиной ndim, задающий размер в байтах для доступа к каждому элементу по каждому измерению массива.

Изменено в версии 3.3: пустой кортеж вместо None, когда ndim = 0.

suboffsets

Используется внутри для массивов в стиле PIL. Значение носит только информационный характер.

c_contiguous

Логическое значение (bool), указывающее, является ли память C-непрерывной.

Добавлено в версии 3.3.

f_contiguous

Логическое значение (bool), указывающее, является ли память непрерывной по Фортрану.

Добавлено в версии 3.3.

contiguous

Логическое значение (bool), указывающее, является ли память непрерывной.

Добавлено в версии 3.3.

Информацию о потокобезопасности объектов memoryview в сборке со свободной многопоточностью см. в Потокобезопасность объектов memoryview.

Типы множеств – set, frozensetSet Types – set, frozenset

Объект set – это неупорядоченная коллекция уникальных хэшируемых объектов. Обычно используется для проверки принадлежности, удаления дубликатов из последовательности и выполнения математических операций, таких как пересечение, объединение, разность и симметрическая разность. (О других контейнерах см. встроенные классы dict, list и tuple, а также модуль collections.)

Как и другие коллекции, множества поддерживают x in set, len(set) и for x in set. Будучи неупорядоченной коллекцией, множество не запоминает положение элементов или порядок вставки. Поэтому множества не поддерживают индексацию, срезы и другое поведение, свойственное последовательностям.

В настоящее время существует два встроенных типа множеств: set и frozenset. Тип set является изменяемым – содержимое можно менять с помощью методов вроде add() и remove(). Поскольку он изменяемый, у него нет хэш-значения, и его нельзя использовать ни как ключ словаря, ни как элемент другого множества. Тип frozenset является неизменяемым и хэшируемым – его содержимое нельзя изменить после создания; поэтому его можно использовать как ключ словаря или как элемент другого множества.

Непустые множества (кроме frozenset) можно создать, поместив список элементов, разделённый запятыми, в фигурные скобки, например: {'jack', 'sjoerd'}, а также с помощью конструктора set.

Конструкторы обоих классов работают одинаково:

class set(iterable=(), /)
class frozenset(iterable=(), /)

Возвращает новый объект set или frozenset, элементы которого берутся из iterable. Элементы множества должны быть хэшируемыми. Чтобы представлять множества множеств, внутренние множества должны быть frozenset объектами. Если iterable не указан, возвращается новое пустое множество.

Множества можно создать несколькими способами:

  • Используйте разделённый запятыми список элементов в фигурных скобках: {'jack', 'sjoerd'}

  • Используйте абстракцию множества: {c for c in 'abracadabra' if c not in 'abc'}

  • Используйте конструктор типа: set(), set('foobar'), set(['a', 'b', 'foo'])

Экземпляры set и frozenset предоставляют следующие операции:

len(s)

Возвращает количество элементов в множестве s (мощность s).

x in s

Проверяет принадлежность x множеству s.

x not in s

Проверяет отсутствие x в множестве s.

frozenset.isdisjoint(other, /)
set.isdisjoint(other, /)

Возвращает True, если у множества нет общих элементов с other. Множества не пересекаются тогда и только тогда, когда их пересечение – пустое множество.

frozenset.issubset(other, /)
set.issubset(other, /)
set <= other

Проверяет, принадлежит ли каждый элемент множества множеству other.

set < other

Проверяет, является ли множество строгим подмножеством other, то есть set <= other and set != other.

frozenset.issuperset(other, /)
set.issuperset(other, /)
set >= other

Проверяет, принадлежит ли каждый элемент other множеству.

set > other

Проверяет, является ли множество строгим надмножеством other, то есть set >= other and set != other.

frozenset.union(*others)
set.union(*others)
set | other | ...

Возвращает новое множество, содержащее элементы из исходного множества и всех остальных.

frozenset.intersection(*others)
set.intersection(*others)
set & other & ...

Возвращает новое множество, содержащее элементы, общие для исходного множества и всех остальных.

frozenset.difference(*others)
set.difference(*others)
set - other - ...

Возвращает новое множество, содержащее элементы исходного множества, которых нет в других.

frozenset.symmetric_difference(other, /)
set.symmetric_difference(other, /)
set ^ other

Возвращает новое множество, содержащее элементы, которые есть либо в исходном множестве, либо в other, но не в обоих.

frozenset.copy()
set.copy()

Возвращает поверхностную копию множества.

Обратите внимание: не-операторные версии методов union(), intersection(), difference(), symmetric_difference(), issubset() и issuperset() принимают в качестве аргумента любой итерируемый объект. В отличие от них, их аналоги на основе операторов требуют, чтобы аргументы были множествами. Это устраняет подверженные ошибкам конструкции вроде set('abc') & 'cbs' в пользу более читаемой set('abc').intersection('cbs').

И set, и frozenset поддерживают сравнение множеств. Два множества равны тогда и только тогда, когда каждый элемент одного содержится в другом (каждое является подмножеством другого). Множество меньше другого тогда и только тогда, когда первое является собственным подмножеством второго (является подмножеством, но не равным). Множество больше другого тогда и только тогда, когда первое является собственным надмножеством второго (является надмножеством, но не равным).

Экземпляры set сравниваются с экземплярами frozenset на основе их элементов. Например, set('abc') == frozenset('abc') возвращает True, и то же самое делает set('abc') in set([frozenset('abc')]).

Сравнения на подмножество и равенство не обобщаются до функции полного упорядочения. Например, любые два непустых непересекающихся множества не равны и не являются подмножествами друг друга, поэтому все из следующих возвращают False: a<b, a==b или a>b.

Поскольку множества определяют лишь частичное упорядочение (отношения подмножеств), результат метода list.sort() для списков множеств не определён.

Элементы множества, как и ключи словаря, должны быть хэшируемыми.

Бинарные операции, в которых смешиваются экземпляры set и frozenset, возвращают тип первого операнда. Например: frozenset('ab') | set('bc') возвращает экземпляр frozenset.

В следующей таблице перечислены операции, доступные для set, которые не применимы к неизменяемым экземплярам frozenset:

set.update(*others)
set |= other | ...

Обновляет множество, добавляя элементы из всех других.

set.intersection_update(*others)
set &= other & ...

Обновляет множество, оставляя только те элементы, которые есть в нём и во всех других.

set.difference_update(*others)
set -= other | ...

Обновляет множество, удаляя элементы, найденные в других.

set.symmetric_difference_update(other, /)
set ^= other

Обновляет множество, оставляя только элементы, которые есть в одном из множеств, но не в обоих.

set.add(elem, /)

Добавляет элемент elem в множество.

set.remove(elem, /)

Удаляет элемент elem из множества. Вызывает KeyError, если elem отсутствует в множестве.

set.discard(elem, /)

Удаляет элемент elem из множества, если он присутствует.

set.pop()

Удаляет и возвращает произвольный элемент множества. Вызывает KeyError, если множество пусто.

set.clear()

Удаляет все элементы из множества.

Обратите внимание: не-операторные версии методов update(), intersection_update(), difference_update() и symmetric_difference_update() принимают любой итерируемый объект в качестве аргумента.

Обратите внимание: аргумент elem методов __contains__(), remove() и discard() может быть множеством. Для поддержки поиска эквивалентного frozenset создаётся временное множество из elem.

set и frozenset являются обобщёнными по типу своих элементов.

См. также

Подробную информацию о гарантиях потокобезопасности для объектов set см. в Потокобезопасность для объектов set.

Типы отображений – dict, frozendictMapping types – dict, frozendict

A mapping object maps hashable values to arbitrary objects. There are currently two standard mapping types, the dictionary and frozendict. (For other containers see the built-in list, set, and tuple classes, and the collections module.)

Ключами словаря могут быть почти любые значения. Значения, которые не являются хэшируемыми, то есть содержащие списки, словари или другие изменяемые типы (сравниваемые по значению, а не по идентичности объекта), не могут использоваться в качестве ключей. Значения, которые сравниваются как равные (например, 1, 1.0 и True), могут взаимозаменяемо использоваться для индексации одной и той же записи словаря.

class dict(**kwargs)
class dict(mapping, /, **kwargs)
class dict(iterable, /, **kwargs)

Возвращает новый словарь, инициализированный из необязательного позиционного аргумента и, возможно, пустого набора именованных аргументов.

Словари могут быть созданы несколькими способами:

  • Используйте разделённый запятыми список пар key: value в фигурных скобках: {'jack': 4098, 'sjoerd': 4127} или {4098: 'jack', 4127: 'sjoerd'}

  • Используйте словарное включение: {}, {x: x ** 2 for x in range(10)}

  • Используйте конструктор типа: dict(), dict([('foo', 100), ('bar', 200)]), dict(foo=100, bar=200)

Если позиционный аргумент не передан, создаётся пустой словарь. Если позиционный аргумент передан и определяет метод keys(), словарь создаётся вызовом __getitem__() для аргумента с каждым возвращённым ключом из этого метода. В противном случае позиционный аргумент должен быть объектом итерируемый объект. Каждый элемент итерируемого объекта также должен быть итерируемым ровно с двумя элементами. Первый элемент каждой пары становится ключом в новом словаре, а второй – соответствующим значением. Если ключ встречается более одного раза, последнее значение для этого ключа становится соответствующим значением в новом словаре.

Если переданы именованные аргументы, они и их значения добавляются в словарь, созданный из позиционного аргумента. Если добавляемый ключ уже присутствует, значение из именованного аргумента заменяет значение из позиционного аргумента.

Словари считаются равными тогда и только тогда, когда они содержат одинаковые пары (key, value) (независимо от порядка). Операции сравнения порядка (‘<’, ‘<=’, ‘>=’, ‘>’) вызывают TypeError. Чтобы проиллюстрировать создание словарей и равенство, следующие примеры возвращают словарь, равный {"one": 1, "two": 2, "three": 3}:

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> f = dict({'one': 1, 'three': 3}, two=2)
>>> a == b == c == d == e == f
True

Передача именованных аргументов, как в первом примере, работает только для ключей, являющихся допустимыми идентификаторами Python. В противном случае можно использовать любые допустимые ключи.

Словари сохраняют порядок вставки. Обратите внимание, что обновление ключа не влияет на порядок. Ключи, добавленные после удаления, вставляются в конец.

>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(d)
['one', 'two', 'three', 'four']
>>> list(d.values())
[1, 2, 3, 4]
>>> d["one"] = 42
>>> d
{'one': 42, 'two': 2, 'three': 3, 'four': 4}
>>> del d["two"]
>>> d["two"] = None
>>> d
{'one': 42, 'three': 3, 'four': 4, 'two': None}

Изменено в версии 3.7: Порядок словарей гарантированно соответствует порядку вставки. Это поведение было деталью реализации CPython начиная с версии 3.6.

Словари являются обобщёнными по двум типам, обозначающим (соответственно) типы ключей и значений словаря.

Вот операции, которые поддерживают словари (и, следовательно, должны поддерживать пользовательские типы отображений):

list(d)

Возвращает список всех ключей, используемых в словаре d.

len(d)

Возвращает количество элементов в словаре d.

d[key]

Возвращает элемент словаря d с ключом key. Вызывает KeyError, если key отсутствует в отображении.

Если подкласс dict определяет метод __missing__(), а key отсутствует, операция d[key] вызывает этот метод с ключом key в качестве аргумента. Затем операция d[key] возвращает или возбуждает результат вызова __missing__(key). Никакие другие операции или методы не вызывают __missing__(). Если __missing__() не определён, возбуждается KeyError. __missing__() должен быть методом; он не может быть переменной экземпляра:

>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
...
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1

Пример выше показывает часть реализации collections.Counter. Другой метод __missing__() используется в collections.defaultdict.

d[key] = value

Устанавливает d[key] в значение value.

del d[key]

Удаляет d[key] из d. Вызывает KeyError, если key отсутствует в отображении.

key in d

Возвращает True, если d содержит ключ key, иначе False.

key not in d

Эквивалентно not key in d.

iter(d)

Возвращает итератор по ключам словаря. Это краткая форма записи для iter(d.keys()).

clear()

Удаляет все элементы из словаря.

copy()

Возвращает поверхностную копию словаря.

classmethod fromkeys(iterable, value=None, /)

Создаёт новый словарь с ключами из iterable и значениями, установленными в value.

fromkeys() – это метод класса, возвращающий новый словарь. value по умолчанию равен None. Все значения ссылаются на один и тот же экземпляр, поэтому обычно не имеет смысла делать value изменяемым объектом, например пустым списком. Чтобы получить разные значения, используйте вместо этого dict comprehension.

get(key, default=None, /)

Возвращает значение для key, если key присутствует в словаре, иначе default. Если default не указан, по умолчанию принимается None, поэтому этот метод никогда не вызывает исключение KeyError.

items()

Возвращает новое представление элементов словаря (пары (key, value)). См. документацию по объектам-представлениям.

keys()

Возвращает новое представление ключей словаря. См. документацию по объектам-представлениям.

pop(key, /)
pop(key, default, /)

Если key присутствует в словаре, удаляет его и возвращает значение, иначе возвращает default. Если default не указан и key отсутствует в словаре, возбуждается KeyError.

popitem()

Удаляет и возвращает пару (key, value) из словаря. Пары возвращаются в порядке LIFO.

popitem() полезен для разрушающего обхода словаря, как часто используется в алгоритмах над множествами. Если словарь пуст, вызов popitem() вызывает исключение KeyError.

Изменено в версии 3.7: Теперь гарантируется порядок LIFO. В предыдущих версиях popitem() мог вернуть произвольную пару ключ/значение.

reversed(d)

Возвращает обратный итератор по ключам словаря. Это сокращение для reversed(d.keys()).

Добавлено в версии 3.8.

setdefault(key, default=None, /)

Если key есть в словаре, возвращает его значение. Если нет, вставляет key со значением default и возвращает default. default по умолчанию равен None.

update(**kwargs)
update(mapping, /, **kwargs)
update(iterable, /, **kwargs)

Обновляет словарь парами ключ/значение из mapping или iterable и kwargs, перезаписывая существующие ключи. Возвращает None.

update() принимает либо другой объект с методом keys() (в этом случае __getitem__() вызывается для каждого ключа, возвращённого этим методом), либо итерируемый объект пар ключ/значение (кортежи или другие итерабельные объекты длины два). Если указаны именованные аргументы, словарь затем обновляется этими парами: d.update(red=1, blue=2).

values()

Возвращает новое представление (view) значений словаря. См. документацию по объектам-представлениям.

Сравнение на равенство между двумя представлениями dict.values() всегда возвращает False. Это также относится к сравнению dict.values() с самим собой:

>>> d = {'a': 1}
>>> d.values() == d.values()
False
d | other

Создаёт новый словарь, содержащий объединённые ключи и значения из d и other; оба должны быть словарями. Значения из other имеют приоритет, если d и other имеют одинаковые ключи.

Добавлено в версии 3.9.

d |= other

Обновляет словарь d ключами и значениями из other, который может быть либо отображением, либо итерируемым объектом пар ключ/значение. Значения из other имеют приоритет, если d и other имеют одинаковые ключи.

Добавлено в версии 3.9.

Словари и их представления обратимы.

>>> d = {"one": 1, "two": 2, "three": 3, "four": 4}
>>> d
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> list(reversed(d))
['four', 'three', 'two', 'one']
>>> list(reversed(d.values()))
[4, 3, 2, 1]
>>> list(reversed(d.items()))
[('four', 4), ('three', 3), ('two', 2), ('one', 1)]

Изменено в версии 3.8: Теперь словари обратимы.

См. также

frozendict и types.MappingProxyType можно использовать для создания представления dict только для чтения.

См. также

Подробную информацию о гарантиях безопасности потоков для объектов dict см. в Thread safety for dict objects.

Объекты представления словаряDictionary view objects

Объекты, возвращаемые dict.keys(), dict.values() и dict.items(), являются объектами-представлениями. Они предоставляют динамическое представление записей словаря, то есть при изменении словаря представление отражает эти изменения.

Представления словаря можно обходить для получения соответствующих данных, а также они поддерживают проверку принадлежности:

len(dictview)

Возвращает количество записей в словаре.

iter(dictview)

Возвращает итератор по ключам, значениям или элементам (представленным в виде кортежей (key, value)) в словаре.

Ключи и значения обходятся в порядке вставки. Это позволяет создавать пары (value, key) с помощью zip(): pairs = zip(d.values(), d.keys()). Другой способ создать такой же список – pairs = [(v, k) for (k, v) in d.items()].

Обход представлений во время добавления или удаления записей из словаря может вызвать RuntimeError или не позволить обойти все записи.

Изменено в версии 3.7: Теперь гарантируется, что порядок словаря соответствует порядку вставки.

x in dictview

Возвращает True, если x находится в ключах, значениях или элементах (items) базового словаря (в последнем случае x должен быть кортежем (key, value)).

reversed(dictview)

Возвращает реверсивный итератор по ключам, значениям или элементам словаря. Представление (view) будет обходиться в порядке, обратном порядку вставки.

Изменено в версии 3.8: Представления словарей теперь можно обходить в обратном порядке.

dictview.mapping

Возвращает types.MappingProxyType, который оборачивает исходный словарь, на который ссылается представление.

Добавлено в версии 3.10.

Представления ключей (keys views) ведут себя как множества, поскольку их элементы уникальны и хешируемы. Представления элементов (items views) также поддерживают операции, подобные множествам, так как пары (ключ, значение) уникальны, а ключи хешируемы. Если все значения в представлении элементов также хешируемы, то такое представление может взаимодействовать с другими множествами. (Представления значений (values views) не рассматриваются как множества, поскольку элементы обычно не уникальны.) Для представлений, подобных множествам, доступны все операции, определённые для абстрактного базового класса collections.abc.Set (например, ==, < или ^). При использовании операторов множеств представления, подобные множествам, принимают любой итерируемый объект в качестве второго операнда, в отличие от множеств, которые принимают только множества.

Пример использования представления словаря:

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # итерация
>>> n = 0
>>> for val in values:
...     n += val
...
>>> print(n)
504

>>> # ключи и значения перебираются в одном порядке (порядок вставки)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # объекты представления динамичны и отражают изменения словаря
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']

>>> # операции над множествами
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}
True
>>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}
True

>>> # получить прокси только для чтения исходного словаря
>>> values.mapping
mappingproxy({'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500

Замороженные словариFrozen dictionaries

class frozendict(**kwargs)
class frozendict(mapping, /, **kwargs)
class frozendict(iterable, /, **kwargs)

Возвращает новый замороженный словарь, инициализированный из необязательного позиционного аргумента и, возможно, пустого набора именованных аргументов.

frozendict имеет API, схожий с API dict, со следующими отличиями:

  • dict имеет больше методов, чем frozendict:

  • frozendict может быть хеширован с помощью hash(frozendict), если все ключи и значения могут быть хешированы.

  • frozendict |= other не изменяет frozendict на месте, а создаёт новый замороженный словарь.

frozendict не является подклассом dict, а наследует напрямую от object.

Как и словари, frozendicts являются обобщёнными по двум типам, обозначающим (соответственно) типы ключей и значений frozendict.

classmethod fromkeys(iterable, value=None, /)

Аналогично dict.fromkeys(), но повторно вызывает конструктор типа с инициализированным frozendict, если тип является подклассом frozendict или если конструктор вернул frozendict.

Добавлено в версии 3.15.

Типы контекстных менеджеровContext Manager Types

Оператор with в Python поддерживает понятие контекста выполнения, определяемого контекстным менеджером. Это реализовано с помощью пары методов, которые позволяют пользовательским классам определять контекст выполнения, который входит в действие до выполнения тела оператора и выходит из него по завершении оператора:

contextmanager.__enter__()

Входит в контекст выполнения и возвращает либо этот объект, либо другой объект, связанный с контекстом выполнения. Значение, возвращаемое этим методом, связывается с идентификатором в предложении as оператора with, использующего данный контекстный менеджер.

Примером контекстного менеджера, который возвращает сам себя, является файловый объект. Файловые объекты возвращают себя из __enter__(), чтобы позволить использовать open() в качестве контекстного выражения в операторе with.

Примером контекстного менеджера, возвращающего связанный объект, является менеджер, возвращаемый decimal.localcontext(). Такие менеджеры устанавливают активный десятичный контекст в копию исходного десятичного контекста и затем возвращают эту копию. Это позволяет вносить изменения в текущий десятичный контекст в теле оператора with, не затрагивая код за пределами оператора with.

contextmanager.__exit__(exc_type, exc_val, exc_tb)

Выходит из контекста выполнения и возвращает логический флаг, указывающий, следует ли подавить возникшее исключение. Если исключение возникло при выполнении тела оператора with, аргументы содержат тип исключения, значение и информацию о трассировке. В противном случае все три аргумента равны None.

Возврат истинного значения из этого метода приведёт к тому, что оператор with подавит исключение и продолжит выполнение с оператора, следующего сразу за оператором with. В противном случае исключение продолжит распространяться после завершения выполнения этого метода.

Если этот метод вызывает исключение при обработке предыдущего исключения из блока with, то возбуждается новое исключение, а исходное исключение сохраняется в его атрибуте __context__.

Переданное исключение никогда не должно явно возбуждаться повторно – вместо этого метод должен вернуть ложное значение, чтобы указать, что метод завершился успешно и не хочет подавлять возникшее исключение. Это позволяет коду управления контекстом легко определить, произошёл ли на самом деле сбой метода __exit__().

Python определяет несколько контекстных менеджеров для поддержки простой синхронизации потоков, своевременного закрытия файлов или других объектов, а также более простого управления активным контекстом десятичной арифметики. Конкретные типы не рассматриваются особым образом, помимо реализации протокола управления контекстом. См. модуль contextlib для примеров.

Генераторы Python и декоратор contextlib.contextmanager предоставляют удобный способ реализации этих протоколов. Если генераторная функция декорирована декоратором contextlib.contextmanager, она вернёт контекстный менеджер, реализующий необходимые методы __enter__() и __exit__(), вместо итератора, который производит недекорированная генераторная функция.

Обратите внимание, что в структуре типа для объектов Python в Python/C API нет специального слота для любого из этих методов. Типы расширений, желающие определить эти методы, должны предоставлять их как обычный метод, доступный из Python. По сравнению с накладными расходами на установку контекста выполнения, накладные расходы на один поиск в словаре класса пренебрежимо малы.

Типы аннотаций типов – Generic Alias, UnionType Annotation Types – Generic Alias, Union

Основными встроенными типами для аннотаций типов являются Generic Alias и Union.

Тип Generic AliasGeneric Alias Type

Объекты GenericAlias обычно создаются путём индексации (subscripting) класса. Чаще всего они используются с классами-контейнерами, такими как list или dict. Например, list[int] – это объект GenericAlias, созданный индексацией класса list с аргументом int. Объекты GenericAlias предназначены в первую очередь для использования с аннотациями типов.

Примечание

Обычно индексировать (subscript) класс можно только в том случае, если класс реализует специальный метод __class_getitem__().

Объект GenericAlias действует как прокси для обобщённого типа, реализуя параметризованные обобщённые типы (parameterized generics).

Для класса-контейнера аргумент(ы), передаваемые при индексации (subscription) класса, могут указывать тип(ы) элементов, которые содержит объект. Например, set[bytes] можно использовать в аннотациях типов для обозначения set, в котором все элементы имеют тип bytes.

Для класса, который определяет __class_getitem__(), но не является контейнером, аргумент(ы), передаваемые при индексации класса, часто указывают тип(ы) возвращаемого значения одного или нескольких методов, определённых для объекта. Например, regular expressions можно использовать как для типа данных str, так и для типа данных bytes:

  • Если x = re.search('foo', 'foo'), то x будет объектом re.Match, в котором возвращаемые значения x.group(0) и x[0] будут иметь тип str. Такой объект можно представить в аннотациях типов с помощью GenericAlias re.Match[str].

  • Если y = re.search(b'bar', b'bar') (обратите внимание на b для bytes), y также будет экземпляром re.Match, но возвращаемые значения y.group(0) и y[0] будут оба иметь тип bytes. В аннотациях типов эта разновидность объектов re.Match обозначается с помощью re.Match[bytes].

Объекты GenericAlias являются экземплярами класса types.GenericAlias, который также можно использовать для непосредственного создания объектов GenericAlias. Специализации определённых пользователем обобщённых классов могут не быть экземплярами types.GenericAlias, но они предоставляют аналогичную функциональность.

T[X, Y, ...]

Создаёт GenericAlias, представляющий тип T, параметризованный типами X, Y и другими в зависимости от используемого T. Например, функция, ожидающая list, содержащий элементы float:

def average(values: list[float]) -> float:
    return sum(values) / len(values)

Ещё один пример для отображений с использованием dict, который является обобщённым типом, принимающим два параметра типа, представляющих тип ключа и тип значения. В этом примере функция ожидает dict с ключами типа str и значениями типа int:

def send_post_request(url: str, body: dict[str, int]) -> None:
    ...

Встроенные функции isinstance() и issubclass() не принимают типы GenericAlias для второго аргумента:

>>> isinstance([1, 2], list[str])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() argument 2 cannot be a parameterized generic

Среда выполнения Python не принуждает к соблюдению аннотаций типов. Это распространяется на обобщённые типы и их параметры типа. При создании объекта-контейнера из GenericAlias элементы контейнера не проверяются на соответствие их типу. Например, следующий код не рекомендуется, но будет выполнен без ошибок:

>>> t = list[str]
>>> t([1, 2, 3])
[1, 2, 3]

Кроме того, параметризованные обобщённые типы стирают параметры типа при создании объекта:

>>> t = list[str]
>>> type(t)
<class 'types.GenericAlias'>

>>> l = t()
>>> type(l)
<class 'list'>

Экземпляры GenericAlias не являются классами во время выполнения, хотя они ведут себя как классы (их можно инстанцировать и наследовать от них):

>>> import inspect
>>> inspect.isclass(list[int])
False

Это верно и для определённых пользователем обобщённых типов.

Вызов repr() или str() для обобщённого типа показывает параметризованный тип:

>>> repr(list[int])
'list[int]'

>>> str(list[int])
'list[int]'

Метод __getitem__() обобщённых контейнеров возбудит исключение, чтобы предотвратить ошибки вроде dict[str][str]:

>>> dict[str][str]
Traceback (most recent call last):
  ...
TypeError: dict[str] is not a generic class

Однако такие выражения допустимы, когда используются переменные типа. Индекс должен содержать столько же элементов, сколько элементов переменных типа в __args__ объекта GenericAlias.

>>> from typing import TypeVar
>>> Y = TypeVar('Y')
>>> dict[str, Y][int]
dict[str, int]

Стандартные обобщённые классыStandard Generic Classes

Следующие классы стандартной библиотеки поддерживают параметризованные обобщённые типы. Этот список не является исчерпывающим.

Специальные атрибуты объектов GenericAliasSpecial Attributes of GenericAlias objects

Все параметризованные обобщённые типы реализуют специальные атрибуты только для чтения.

genericalias.__origin__

Этот атрибут указывает на непараметризованный обобщённый класс:

>>> list[int].__origin__
<class 'list'>
genericalias.__args__

Этот атрибут представляет собой tuple (возможно, длины 1) обобщённых типов, переданных исходному __class_getitem__() обобщённого класса:

>>> dict[str, list[int]].__args__
(<class 'str'>, list[int])
genericalias.__parameters__

Этот атрибут представляет собой лениво вычисляемый кортеж (возможно, пустой) уникальных переменных типа, найденных в __args__:

>>> from typing import TypeVar

>>> T = TypeVar('T')
>>> list[T].__parameters__
(~T,)

Примечание

Объект GenericAlias с параметрами typing.ParamSpec может не иметь корректного __parameters__ после подстановки, поскольку typing.ParamSpec предназначен в первую очередь для статической проверки типов.

genericalias.__unpacked__

Логическое значение, которое истинно, если псевдоним был распакован с помощью оператора * (см. TypeVarTuple).

Добавлено в версии 3.12.

См. также

PEP 484 – Аннотации типов

Представление инфраструктуры Python для аннотаций типов.

PEP 585 – Аннотации обобщённых типов в стандартных коллекциях

Представление возможности нативно параметризовать классы стандартной библиотеки при условии, что они реализуют специальный метод класса __class_getitem__().

Дженерики, пользовательские дженерики и typing.Generic

Документация по реализации обобщённых классов, которые можно параметризовать во время выполнения и которые понятны статическим анализаторам типов.

Добавлено в версии 3.9.

Тип объединенияUnion Type

Объект объединения хранит значение операции | (побитовое ИЛИ) над несколькими объектами типов. Эти типы предназначены в первую очередь для аннотаций типов. Выражение типа объединения обеспечивает более чистый синтаксис подсказок типов по сравнению с индексированием typing.Union.

X | Y | ...

Определяет объект объединения, который содержит типы X, Y и так далее. X | Y означает либо X, либо Y. Это эквивалентно typing.Union[X, Y]. Например, следующая функция ожидает аргумент типа int или float:

def square(number: int | float) -> int | float:
    return number ** 2

Примечание

Оператор | не может использоваться во время выполнения для определения объединений, в которых один или несколько членов являются прямой ссылкой. Например, int | "Foo", где "Foo" является ссылкой на ещё не определённый класс, вызовет ошибку во время выполнения. Для объединений, содержащих прямые ссылки, всё выражение следует задавать в виде строки, например "int | Foo".

union_object == other

Объекты объединения можно проверять на равенство с другими объектами объединения. Подробнее:

  • Объединения объединений уплощаются:

    (int | str) | float == int | str | float
    
  • Избыточные типы удаляются:

    int | str | int == int | str
    
  • При сравнении объединений порядок не учитывается:

    int | str == str | int
    
  • Создаёт экземпляры typing.Union:

    int | str == typing.Union[int, str]
    type(int | str) is typing.Union
    
  • Опциональные типы можно записать как объединение с None:

    str | None == typing.Optional[str]
    
isinstance(obj, union_object)
issubclass(obj, union_object)

Вызовы isinstance() и issubclass() также поддерживаются с объектом объединения:

>>> isinstance("", int | str)
True

Однако параметризованные дженерики в объектах объединения проверить нельзя:

>>> isinstance(1, int | list[int])  # вычисление по короткой схеме
True
>>> isinstance([1], int | list[int])
Traceback (most recent call last):
  ...
TypeError: isinstance() argument 2 cannot be a parameterized generic

Тип объекта объединения, доступный пользователю, можно получить через typing.Union и использовать для проверок isinstance():

>>> import typing
>>> isinstance(int | str, typing.Union)
True
>>> typing.Union()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'typing.Union' instances

Примечание

Метод __or__() для объектов типов был добавлен для поддержки синтаксиса X | Y. Если метакласс реализует __or__(), Union может переопределить его:

>>> class M(type):
...     def __or__(self, other):
...         return "Hello"
...
>>> class C(metaclass=M):
...     pass
...
>>> C | int
'Hello'
>>> int | C
int | C

См. также

PEP 604 – PEP proposing the X | Y syntax and the Union type.

Добавлено в версии 3.10.

Изменено в версии 3.14: Объекты объединения теперь являются экземплярами typing.Union. Ранее они были экземплярами types.UnionType, который остаётся псевдонимом для typing.Union.

Другие встроенные типыOther Built-in Types

Интерпретатор поддерживает несколько других видов объектов. Большинство из них поддерживают только одну или две операции.

МодулиModules

Единственная специальная операция над модулем – это доступ к атрибутам: m.name, где m – это модуль, а name обращается к имени, определённому в таблице символов модуля m. Атрибутам модуля можно присваивать значения. (Обратите внимание, что оператор import строго говоря, не является операцией над объектом модуля; import foo не требует существования объекта модуля с именем foo, а требует (внешнего) определения для модуля с именем foo где-то.)

Специальным атрибутом каждого модуля является __dict__. Это словарь, содержащий таблицу символов модуля. Изменение этого словаря действительно изменит таблицу символов модуля, но прямое присваивание атрибуту __dict__ невозможно (можно написать m.__dict__['a'] = 1, что определит m.a как 1, но нельзя написать m.__dict__ = {}). Изменять __dict__ напрямую не рекомендуется.

Модули, встроенные в интерпретатор, записываются так: <module 'sys' (built-in)>. Если загружены из файла, они записываются как <module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>.

Классы и экземпляры классовClasses and Class Instances

См. Объекты, значения и типы и Определения классов.

ФункцииFunctions

Объекты-функции создаются определениями функций. Единственная операция над объектом-функцией – это вызов: func(argument-list).

На самом деле существует два вида объектов-функций: встроенные функции и определяемые пользователем функции. Оба поддерживают одну и ту же операцию (вызов функции), но реализация различается, отсюда разные типы объектов.

Дополнительную информацию см. в разделе Определения функций.

МетодыMethods

Методы – это функции, которые вызываются с использованием точечной нотации. Существует две разновидности: встроенные методы (такие как append() у списков) и методы экземпляров классов. Встроенные методы описываются вместе с типами, которые их поддерживают.

Если обратиться к методу (функции, определённой в пространстве имён класса) через экземпляр, возвращается специальный объект: связанный метод (также называемый метод экземпляра). При вызове он добавляет аргумент self в список аргументов. Связанные методы имеют два специальных атрибута только для чтения: m.__self__ – объект, над которым выполняется метод, а m.__func__ – функция, реализующая метод. Вызов m(arg-1, arg-2, ..., arg-n) полностью эквивалентен вызову m.__func__(m.__self__, arg-1, arg-2, ..., arg-n).

Как и объекты функций, объекты связанных методов поддерживают получение произвольных атрибутов. Однако, поскольку атрибуты метода на самом деле хранятся в базовом объекте функции (method.__func__), установка атрибутов метода на связанных методах запрещена. Попытка установить атрибут на методе приводит к возникновению исключения AttributeError. Чтобы установить атрибут метода, необходимо явно установить его на базовом объекте функции:

>>> class C:
...     def method(self):
...         pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method'  # нельзя установить на методе
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'

Дополнительную информацию см. в разделе Методы экземпляров.

Объекты кодаCode Objects

Объекты кода используются реализацией для представления «псевдокомпилированного» исполняемого кода Python, например тела функции. Они отличаются от объектов функций тем, что не содержат ссылки на глобальное окружение выполнения. Объекты кода возвращаются встроенной функцией compile() и могут быть извлечены из объектов функций через их атрибут __code__. Также см. модуль code.

Доступ к __code__ вызывает событие аудита object.__getattr__ с аргументами obj и "__code__".

Объект кода можно выполнить или вычислить, передав его (вместо строки исходного кода) встроенным функциям exec() или eval().

Дополнительную информацию см. в разделе Стандартная иерархия типов.

Объекты типовType Objects

Объекты типов представляют различные типы объектов. Тип объекта можно получить с помощью встроенной функции type(). Над типами не определено специальных операций. Стандартный модуль types определяет имена для всех стандартных встроенных типов.

Типы записываются так: <class 'int'>.

Объект NullThe Null Object

Этот объект возвращается функциями, которые не возвращают значение явно. Он не поддерживает никаких специальных операций. Существует ровно один нулевой объект с именем None (встроенное имя). type(None)() возвращает тот же синглтон.

Он записывается как None.

Объект многоточияThe Ellipsis Object

Этот объект обычно используется для обозначения того, что что-то пропущено. Он не поддерживает никаких специальных операций. Существует ровно один объект многоточия с именем Ellipsis (встроенное имя). type(Ellipsis)() возвращает синглтон Ellipsis.

Он записывается как Ellipsis или ....

При обычном использовании ... в качестве объекта Ellipsis встречается в нескольких разных местах, например:

Python также использует три точки в случаях, которые не являются объектами Ellipsis, например:

  • В Doctest ELLIPSIS используется как шаблон для отсутствующего содержимого.

  • Стандартное приглашение Python в интерактивной оболочке, когда ввод неполный.

Наконец, документация Python часто использует три точки в обычном английском значении для обозначения пропущенного содержимого, даже в примерах кода, где они также используются как Ellipsis.

Объект NotImplementedThe NotImplemented Object

Этот объект возвращается из сравнений и бинарных операций, когда они должны работать с типами, которые не поддерживают. Дополнительную информацию см. в разделе Сравнения. Существует ровно один объект NotImplemented. type(NotImplemented)() возвращает экземпляр-синглтон.

Он записывается как NotImplemented.

Внутренние объектыInternal Objects

Эту информацию см. в разделе Стандартная иерархия типов. Там описываются объекты стековых фреймов, объекты трассировки и объекты срезов.

Специальные атрибутыSpecial Attributes

Реализация добавляет несколько специальных атрибутов только для чтения к некоторым типам объектов, где это уместно. Некоторые из них не сообщаются встроенной функцией dir().

definition.__name__

Имя класса, функции, метода, дескриптора или экземпляра генератора.

definition.__qualname__

Полное имя класса, функции, метода, дескриптора, или экземпляра генератора.

Добавлено в версии 3.3.

definition.__module__

Имя модуля, в котором был определён класс или функция.

definition.__doc__

Строка документации класса или функции, или None, если не определена.

definition.__type_params__

Параметры типа обобщённых классов, функций и псевдонимов типов. Для классов и функций, которые не являются обобщёнными, это будет пустой кортеж.

Добавлено в версии 3.12.

Ограничение длины преобразования целого числа в строкуInteger string conversion length limitation

В CPython существует глобальное ограничение на преобразование между int и str для смягчения атак типа «отказ в обслуживании». Это ограничение только применяется к десятичной или другим системам счисления, не являющимся степенями двойки. Преобразования в шестнадцатеричную, восьмеричную и двоичную системы не ограничены. Ограничение можно настроить.

Тип int в CPython – это число произвольной длины, хранящееся в двоичной форме (обычно называемое «bignum»). Не существует алгоритма, который мог бы преобразовать строку в двоичное целое или двоичное целое в строку за линейное время, кроме случая, когда основание является степенью двойки. Даже лучшие известные алгоритмы для основания 10 имеют субквадратичную сложность. Преобразование большого значения, такого как int('1' * 500_000), может занять более секунды на быстром CPU.

Ограничение размера преобразования предлагает практический способ избежать CVE 2020-10735.

Ограничение применяется к количеству цифровых символов во входной или выходной строке, когда задействован нелинейный алгоритм преобразования. Символы подчёркивания и знак не учитываются в ограничении.

Когда операция превышает ограничение, вызывается ValueError:

>>> import sys
>>> sys.set_int_max_str_digits(4300)  # Для иллюстрации, это значение по умолчанию.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit
>>> i = int('2' * 4300)
>>> len(str(i))
4300
>>> i_squared = i*i
>>> len(str(i_squared))
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
>>> len(hex(i_squared))
7144
>>> assert int(hex(i_squared), base=16) == i*i  # Шестнадцатеричный формат не ограничен.

Значение ограничения по умолчанию – 4300 цифр, как указано в sys.int_info.default_max_str_digits. Наименьшее настраиваемое ограничение – 640 цифр, как указано в sys.int_info.str_digits_check_threshold.

Проверка:

>>> import sys
>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info
>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info
>>> msg = int('578966293710682886880994035146873798396722250538762761564'
...           '9252925514383915483333812743580549779436104706260696366600'
...           '571186405732').to_bytes(53, 'big')
...

Добавлено в версии 3.12.

Затронутые APIAffected APIs

Ограничение применяется только к потенциально медленным преобразованиям между int и str или bytes:

  • int(string) с основанием 10 по умолчанию.

  • int(string, base) для всех оснований, не являющихся степенью двойки.

  • str(integer).

  • repr(integer).

  • любое другое преобразование строки в основание 10, например f"{integer}", "{}".format(integer) или b"%d" % integer.

Ограничения не применяются к функциям с линейным алгоритмом:

Настройка ограниченияConfiguring the limit

Перед запуском Python можно использовать переменную окружения или флаг командной строки интерпретатора для настройки ограничения:

  • PYTHONINTMAXSTRDIGITS, например, PYTHONINTMAXSTRDIGITS=640 python3, чтобы установить ограничение 640, или PYTHONINTMAXSTRDIGITS=0 python3, чтобы отключить ограничение.

  • -X int_max_str_digits, например, python3 -X int_max_str_digits=640

  • sys.flags.int_max_str_digits содержит значение PYTHONINTMAXSTRDIGITS или -X int_max_str_digits. Если заданы и переменная окружения, и опция -X, то опция -X имеет приоритет. Значение -1 указывает, что обе не были установлены, поэтому при инициализации использовалось значение sys.int_info.default_max_str_digits.

Из кода можно проверить текущий лимит и установить новый с помощью этих sys API:

Информацию о значениях по умолчанию и минимальном можно найти в sys.int_info:

Добавлено в версии 3.12.

Внимание

Установка низкого лимита может привести к проблемам. Хотя это редко, существует код, содержащий десятичные целочисленные константы в исходниках, которые превышают минимальный порог. Следствие установки лимита: исходный код Python, содержащий десятичные целочисленные литералы длиннее лимита, вызовет ошибку при разборе, обычно во время запуска или импорта, или даже во время установки – в любой момент, когда актуальный .pyc ещё не существует для этого кода. Обходной путь для исходников, содержащих такие большие константы, – преобразовать их в 0x шестнадцатеричную форму, так как у неё нет лимита.

Тщательно тестируйте приложение, если используете низкий лимит. Убедитесь, что тесты запускаются с лимитом, установленным заранее через переменную окружения или флаг, чтобы он применялся во время запуска и даже на любом этапе установки, который может вызвать Python для предварительной компиляции .py исходников в .pyc файлы.