Spec-Zone.ru › Python 3.12

Встроенные типы

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

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

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

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

Проверка истинности

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

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

  • константы, определённые как ложные: None и False
  • ноль любого числового типа: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • пустые последовательности и коллекции: '', (), [], {}, set(), range(0)

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

Логические операции — 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 — синтаксическая ошибка.

Сравнения

В 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, complex

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

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

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

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

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

Операция

Результат

Примечания

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

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» с необязательным префиксом «+» или «-», обозначающие «не число» (NaN) и положительную или отрицательную бесконечность.
  5. Python определяет pow(0, 0) и 0 ** 0 как 1, как принято во многих языках программирования.
  6. Принимаемые числовые литералы могут содержать цифры от 0 до 9 или любые эквивалентные символы Юникода (кодовые точки со свойством Nd).

    Полный список кодовых точек со свойством 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.

Побитовые операции для целочисленных типов

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

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

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

Операция

Результат

Примечания

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()) или больше).

Дополнительные методы целочисленных типов

Тип 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)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6

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

int.bit_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. Значение аргумента signed по умолчанию — False.

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

>>> (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 должен быть либо объектом, подобным байтам, либо итерируемым объектом, выдающим байты.

Аргумент 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.

Дополнительные методы типа float

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

float.as_integer_ratio()

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

float.is_integer()

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

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

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

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().

Обратите внимание, что экспонента записывается в десятичной, а не в шестнадцатеричной системе и задаёт степень числа 2, на которую нужно умножить коэффициент. Например, шестнадцатеричная строка 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'

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

Для чисел 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 long и P = 2**61 - 1 на машинах с 64-разрядными типами C long.

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

  • Если 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):
    """Compute the hash of a rational number m / n.

    Assumes m and n are integers, with n positive.
    Equivalent to hash(fractions.Fraction(m, n)).

    """
    P = sys.hash_info.modulus
    # Remove common factors of P.  (Unnecessary if m and n already coprime.)
    while m % P == n % P == 0:
        m, n = m // P, n // P

    if n % P == 0:
        hash_value = sys.hash_info.inf
    else:
        # Fermat's Little Theorem: pow(n, P-1, P) is 1, so
        # pow(n, P-2, P) gives the inverse of n modulo 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):
    """Compute the hash of a float 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):
    """Compute the hash of a complex number z."""

    hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
    # do a signed reduction modulo 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

Логический тип — bool

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

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

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

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

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

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

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

Чтобы объекты-контейнеры поддерживали итерируемый объект, необходимо определить один метод:

container.__iter__()

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

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

iterator.__iter__()

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

iterator.__next__()

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

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

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

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

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

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

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

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

Операции в следующей таблице поддерживаются большинством типов последовательностей — как изменяемых, так и неизменяемых. 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)

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

s.index(x[, i[, j]])

индекс первого вхождения x в s (на индексе i или после него и до индекса j)

(8)

s.count(x)

общее количество вхождений x в s

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

Прямые и обратные итераторы по изменяемым последовательностям обращаются к значениям с помощью индекса. Этот индекс продолжает увеличиваться (или уменьшаться), даже если базовая последовательность изменяется. Итератор завершается только при возникновении 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]]
    

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

  3. Если i или j отрицательны, индекс отсчитывается от конца последовательности s: подставляется len(s) + i или len(s) + j. Обратите внимание, что -0 по-прежнему является 0.
  4. Срез s от i до j определяется как последовательность элементов с индексом k, для которого выполняется i <= k < j. Если i или j больше len(s), используйте len(s). Если i не задан или равен None, используйте 0. Если j не задан или равен None, используйте len(s). Если i больше или равен j, срез пуст.
  5. Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n*k, для которого выполняется 0 <= n < (j-i)/k. Иными словами, индексы равны i, i+k, i+2*k, i+3*k и так далее, пока не будет достигнуто j (само j не включается). Если k положительно, значения i и j ограничиваются значением len(s), если они больше него. Если k отрицательно, значения i и j ограничиваются значением len(s) - 1, если они больше него. Если i или j не заданы либо равны None, они становятся граничными значениями (конкретная граница зависит от знака k). Обратите внимание: k не может быть равен нулю. Если k равен None, он обрабатывается как 1.
  6. Конкатенация неизменяемых последовательностей всегда приводит к созданию нового объекта. Это означает, что построение последовательности путём многократной конкатенации имеет квадратичную вычислительную сложность относительно общей длины последовательности. Чтобы добиться линейной вычислительной сложности, необходимо использовать один из приведённых ниже вариантов:

    • при конкатенации объектов str можно сформировать список и в конце использовать str.join() либо записывать данные в экземпляр io.StringIO и извлечь его значение по завершении
    • при конкатенации объектов bytes аналогично можно использовать bytes.join() или io.BytesIO, либо выполнять конкатенацию на месте с объектом bytearray. Объекты bytearray являются изменяемыми и используют эффективный механизм избыточного выделения памяти
    • при конкатенации объектов tuple вместо этого расширяйте list
    • для других типов изучите соответствующую документацию по классам
  7. Некоторые типы последовательностей (например, range) поддерживают только последовательности элементов, соответствующие определённым шаблонам, и поэтому не поддерживают конкатенацию или повторение последовательностей.
  8. index вызывает ValueError, если x не найден в s. Не все реализации поддерживают передачу дополнительных аргументов i и j. Эти аргументы позволяют эффективно искать в подпоследовательностях. Передача дополнительных аргументов примерно эквивалентна использованию s[i:j].index(x), но без копирования данных; возвращаемый индекс отсчитывается от начала последовательности, а не от начала среза.

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

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

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

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

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

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

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

Операция

Результат

Примечания

s[i] = x

элемент i последовательности s заменяется на x

s[i:j] = t

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

del 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.append(x)

добавляет x в конец последовательности (то же, что и s[len(s):len(s)] = [x])

s.clear()

удаляет все элементы из s (то же, что и del s[:])

(5)

s.copy()

создаёт поверхностную копию s (то же, что и s[:])

(5)

s.extend(t) или s += t

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

s *= n

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

(6)

s.insert(i, x)

вставляет x в s по индексу i (то же, что и s[i:i] = [x])

s.pop() или s.pop(i)

возвращает элемент с индексом i и одновременно удаляет его из s

(2)

s.remove(x)

удаляет первый элемент из s, для которого s[i] равно x

(3)

s.reverse()

изменяет порядок элементов s на обратный на месте

(4)

Примечания:

  1. Если k не равен 1, длина t должна совпадать с длиной заменяемого среза.
  2. Необязательный аргумент i по умолчанию равен -1, поэтому по умолчанию удаляется и возвращается последний элемент.
  3. remove() вызывает ValueError, если x не найден в s.
  4. Метод reverse() изменяет последовательность на месте, чтобы экономить память при обращении порядка большой последовательности. Чтобы напомнить пользователям о том, что метод действует побочным эффектом, он не возвращает последовательность с обратным порядком.
  5. clear() и copy() включены для согласованности с интерфейсами изменяемых контейнеров, не поддерживающих операции среза (например, dict и set). copy() не входит в ABC collections.abc.MutableSequence, но его реализует большинство конкретных классов изменяемых последовательностей.

    Добавлено в версии 3.3: методы clear() и copy().

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

Списки

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

class list([iterable])

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

  • С помощью пары квадратных скобок для обозначения пустого списка: []
  • С помощью квадратных скобок с элементами, разделёнными запятыми: [a], [a, b, c]
  • С помощью генератора списка: [x for x in iterable]
  • С помощью конструктора типа: list() или list(iterable)

Конструктор создаёт список, элементы которого совпадают с элементами iterable и расположены в том же порядке. iterable может быть последовательностью, контейнером, поддерживающим итерацию, или объектом-итератором. Если 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, если обнаруживает, что список был изменён.

Кортежи

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

class tuple([iterable])

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

  • С помощью пары круглых скобок для обозначения пустого кортежа: ()
  • С помощью завершающей запятой для кортежа из одного элемента: a, или (a,)
  • С помощью элементов, разделённых запятыми: a, b, c или (a, b, c)
  • С помощью встроенного типа tuple(): tuple() или tuple(iterable)

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

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

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

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

Диапазоны

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

class range(stop)
class range(start, stop[, step])

Аргументы конструктора 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.

Объект range будет пустым, если 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))
[]

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

start

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

stop

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

step

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

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

Объекты range реализуют 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

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

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

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

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

См. также

  • В рецепте linspace показано, как реализовать ленивую версию range для задач с плавающей точкой.

Тип текстовой последовательности — 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(object='')
class str(object=b'', encoding='utf-8', errors='strict')

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

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

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

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

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

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

Методы строк

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

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

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

str.capitalize()

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

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

str.casefold()

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

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

Алгоритм свёртки регистра описан в разделе 3.13 «Свёртка регистра по умолчанию» стандарта Unicode.

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

str.center(width[, fillchar])

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

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

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

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

str.encode(encoding='utf-8', errors='strict')

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

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

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

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

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

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

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

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

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'
str.find(sub[, start[, end]])

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

Примечание

Метод 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'

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

Примечание

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

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

str.format_map(mapping)

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

>>> 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, если подстрока не найдена.

str.isalnum()

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

str.isalpha()

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

str.isascii()

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

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

str.isdecimal()

Возвращает True, если все символы строки являются десятичными цифрами и строка содержит хотя бы один символ, и False в противном случае. Десятичные цифры можно использовать для записи чисел в системе счисления с основанием 10, например U+0660, АРАБСКО-ИНДИЙСКАЯ ЦИФРА НОЛЬ. Формально десятичный символ — это символ категории Unicode General Category «Nd».

str.isdigit()

Возвращает True, если все символы строки являются цифрами и строка содержит хотя бы один символ, и False в противном случае. К цифрам относятся десятичные цифры, а также цифры, требующие специальной обработки, например совместимые надстрочные цифры. Сюда входят цифры, которые нельзя использовать для записи чисел в системе счисления с основанием 10, например числа кхароштхи. Формально цифра — это символ со значением свойства Numeric_Type=Digit или Numeric_Type=Decimal.

str.isidentifier()

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

С помощью 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, ОБЫКНОВЕННАЯ ДРОБЬ ОДНА ПЯТАЯ. Формально числовыми являются символы со значением свойства Numeric_Type=Digit, Numeric_Type=Decimal или Numeric_Type=Numeric.

str.isprintable()

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

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

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

str.isspace()

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

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

str.istitle()

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

str.isupper()

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

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

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

str.ljust(width[, fillchar])

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

str.lower()

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

Используемый алгоритм преобразования в нижний регистр описан в разделе 3.13 «Свёртка регистра по умолчанию» стандарта Unicode.

str.lstrip([chars])

Возвращает копию строки с удалёнными начальными символами. Аргумент chars — строка, задающая набор удаляемых символов. Если аргумент опущен или равен None, по умолчанию удаляются пробельные символы. Аргумент 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(x[, y[, z]])

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

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

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

str.partition(sep)

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

str.removeprefix(prefix, /)

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

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

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

str.removesuffix(suffix, /)

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

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

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

str.replace(old, new[, count])

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

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

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

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

Как rfind(), но вызывает исключение ValueError, если подстрока sub не найдена.

str.rjust(width[, fillchar])

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

str.rpartition(sep)

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

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

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

str.rstrip([chars])

Возвращает копию строки с удалёнными конечными символами. Аргумент chars — строка, задающая набор удаляемых символов. Если аргумент опущен или равен None, по умолчанию удаляются пробельные символы. Аргумент chars задаёт не суффикс: удаляются все сочетания символов из этого набора:

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

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

>>> 'Monty Python'.rstrip(' Python')
'M'
>>> 'Monty Python'.removesuffix(' Python')
'Monty'
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']
str.splitlines(keepends=False)

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

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

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

Описание

\n

Перевод строки

\r

Возврат каретки

\r\n

Возврат каретки + перевод строки

\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, сравнение строки заканчивается на этой позиции.

str.strip([chars])

Возвращает копию строки без начальных и конечных символов. Аргумент chars — это строка, задающая набор удаляемых символов. Если аргумент опущен или None, по умолчанию из строки удаляются пробельные символы. Аргумент 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'
str.swapcase()

Возвращает копию строки, в которой символы верхнего регистра преобразованы в нижний, и наоборот. Обратите внимание, что s.swapcase().swapcase() == s не обязательно выполняется.

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."
str.translate(table)

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

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

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

str.upper()

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

Используемый алгоритм преобразования в верхний регистр описан в разделе 3.13 «Стандартное преобразование регистра» стандарта Юникод.

str.zfill(width)

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

Например:

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

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

Примечание

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

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

Если для 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)

'%'

Аргумент не преобразуется; в результате получается символ '%'.

Примечания:

  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, memoryview

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

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

Объекты bytes

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

class bytes([source[, encoding[, errors]]])

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

  • Одинарные кавычки: b'still allows embedded "double" quotes'
  • Двойные кавычки: b"still allows embedded 'single' quotes"
  • Тройные кавычки: b'''3 single quotes''', b"""3 double quotes"""

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

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

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

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

  • Байтовый объект заданной длины, заполненный нулями: bytes(10)
  • Из итерируемого объекта целых чисел: bytes(range(20))
  • Копированием существующих бинарных данных с помощью буферного протокола: bytes(obj)

См. также встроенный тип bytes.

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

classmethod fromhex(string)

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

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

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

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

hex([sep[, bytes_per_sep]])

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

>>> 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 являются последовательностями целых чисел (подобно кортежу), для байтового объекта b выражение b[0] вернёт целое число, а b[0:1] — байтовый объект длиной 1. (В отличие от текстовых строк, где и индексирование, и срезы возвращают строку длиной 1.)

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

Объекты bytearray

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

class bytearray([source[, encoding[, errors]]])

Для объектов 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 в строке, а не только пробелы.

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

hex([sep[, bytes_per_sep]])

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

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

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

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

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

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

Операции с bytes и bytearray

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

Примечание

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

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 интерпретируются так же, как в записи среза.

Искомая подпоследовательность может быть любым bytes-подобным объектом или целым числом в диапазоне от 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 может быть любым bytes-подобным объектом.

Примечание

Версия этого метода для 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 может быть любым bytes-подобным объектом.

Примечание

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

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

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

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

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

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

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

Примечание

Передача аргумента encoding в str позволяет декодировать любой bytes-подобный объект напрямую, без необходимости создавать временный объект 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-подобным объектом.

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

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

Искомая подпоследовательность может быть любым bytes-подобным объектом или целым числом в диапазоне от 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, если подпоследовательность не найдена.

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

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

bytes.join(iterable)
bytearray.join(iterable)

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

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

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

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

bytes.partition(sep)
bytearray.partition(sep)

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

Искомый разделитель может быть любым bytes-подобным объектом.

bytes.replace(old, new[, count])
bytearray.replace(old, new[, count])

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

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

Примечание

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

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

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

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

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

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

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

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

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

bytes.rpartition(sep)
bytearray.rpartition(sep)

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

Искомый разделитель может быть любым bytes-подобным объектом.

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

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

Искомый префикс или префиксы могут быть любым bytes-подобным объектом.

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])
bytearray.center(width[, fillbyte])

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

Примечание

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

bytes.ljust(width[, fillbyte])
bytearray.ljust(width[, fillbyte])

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

Примечание

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

bytes.lstrip([chars])
bytearray.lstrip([chars])

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

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

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

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

Примечание

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

bytes.rjust(width[, fillbyte])
bytearray.rjust(width[, fillbyte])

Возвращает копию объекта, выровненную по правому краю последовательности длиной 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([chars])
bytearray.rstrip([chars])

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

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

Двоичная последовательность значений байтов для удаления может быть любым bytes-подобным объектом. Метод, удаляющий одну строку-суффикс, а не все символы из набора, описан в разделе 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 может быть любым bytes-подобным объектом.

Например:

>>> 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([chars])
bytearray.strip([chars])

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

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

Двоичная последовательность значений байтов для удаления может быть любым bytes-подобным объектом.

Примечание

Версия этого метода для 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, если последовательность записана в стиле заглавных букв ASCII и не пуста, и False в противном случае. Подробнее об определении «регистра заголовка» см. в bytes.title().

Например:

>>> 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)

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

Например:

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

Примечание

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

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

Примечание

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

Объекты bytes (bytes/bytearray) имеют одну уникальную встроенную операцию: оператор % (остаток от деления). Он также известен как оператор форматирования или интерполяции bytes. В выражении 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'; его следует использовать только в кодовых базах Python 2/3.

(6)

'a'

Байты (преобразует любой объект Python с помощью repr(obj).encode('ascii', 'backslashreplace')).

(5)

'r'

'r' — псевдоним для 'a'; его следует использовать только в кодовых базах Python 2/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.

Представления памяти

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

class memoryview(object)

Создаёт memoryview, ссылающееся на object. object должен поддерживать буферный протокол. К встроенным объектам, поддерживающим буферный протокол, относятся bytes и bytearray.

У объекта memoryview есть понятие элемента — атомарной единицы памяти, обрабатываемой исходным object. Для многих простых типов, таких как bytes и bytearray, элементом является один байт, но у других типов, например array.array, элементы могут быть больше.

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, также поддерживается индексация целым числом или кортежем целых чисел, возвращающая отдельный элемент правильного типа. Одномерные представления памяти можно индексировать целым числом или одноэлементным кортежем. Многомерные представления памяти можно индексировать кортежами, содержащими ровно ndim целых чисел, где ndim — количество измерений. Нульмерные представления памяти можно индексировать пустым кортежем.

Вот пример с форматом, отличным от байтового:

>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
-11111111
>>> m[-1]
44444444
>>> m[::2].tolist()
[-11111111, -33333333]

Если базовый объект доступен для записи, представление памяти поддерживает присваивание срезу в одном измерении. Изменение размера не допускается:

>>> 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')

Одномерные представления памяти хешируемых (доступных только для чтения) типов с форматами ‘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: Теперь одномерные представления памяти можно нарезать срезами. Одномерные представления памяти с форматами ‘B’, ‘b’ или ‘c’ теперь хешируемы.

Изменено в версии 3.4: Теперь memoryview автоматически регистрируется в collections.abc.Sequence

Изменено в версии 3.5: Теперь представления памяти можно индексировать кортежем целых чисел.

У memoryview есть несколько методов:

__eq__(exporter)

Представление памяти и экспортёр 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 для представления памяти.

>>> 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([sep[, bytes_per_sep]])

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

>>> 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[, shape])

Преобразует представление памяти в новый формат или форму. По умолчанию shape равно [byte_length//new_itemsize], то есть результирующее представление будет одномерным. Возвращаемое значение — новое представление памяти, но сам буфер не копируется. Поддерживаются преобразования 1D -> C-смежный и C-смежный -> 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: Исходный формат больше не ограничен при преобразовании в байтовое представление.

Также доступны несколько атрибутов только для чтения:

obj

Базовый объект представления памяти:

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

Логическое значение, указывающее, доступна ли память только для чтения.

format

Строка, содержащая формат (в стиле модуля struct) каждого элемента представления. Представление памяти можно создать из экспортёров с произвольными строками формата, однако некоторые методы (например, tolist()) ограничены собственными форматами одного элемента.

Изменено в версии 3.3: Формат 'B' теперь обрабатывается согласно синтаксису модуля struct. Это означает, что memoryview(b'abc')[0] == b'abc'[0] == 97.

itemsize

Размер каждого элемента представления памяти в байтах:

>>> 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: При ndim = 0 возвращается пустой кортеж вместо None.

strides

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

Изменено в версии 3.3: При ndim = 0 возвращается пустой кортеж вместо None.

suboffsets

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

c_contiguous

Логическое значение, указывающее, является ли память C-смежной.

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

f_contiguous

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

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

contiguous

Логическое значение, указывающее, является ли память смежной.

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

Типы множеств — 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.

isdisjoint(other)

Возвращает True, если у множества нет общих элементов с other. Множества не пересекаются тогда и только тогда, когда их пересечение — пустое множество.

issubset(other)
set <= other

Проверяет, содержится ли каждый элемент множества в other.

set < other

Проверяет, является ли множество строгим подмножеством other, то есть set <= other and set != other.

issuperset(other)
set >= other

Проверяет, содержится ли каждый элемент other в множестве.

set > other

Проверяет, является ли множество строгим надмножеством other, то есть set >= other and set != other.

union(*others)
set | other | ...

Возвращает новое множество, содержащее элементы исходного множества и всех остальных.

intersection(*others)
set & other & ...

Возвращает новое множество, содержащее общие элементы исходного множества и всех остальных.

difference(*others)
set - other - ...

Возвращает новое множество, содержащее элементы исходного множества, отсутствующие в остальных.

symmetric_difference(other)
set ^ other

Возвращает новое множество, содержащее элементы, которые принадлежат либо исходному множеству, либо other, но не обоим сразу.

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:

update(*others)
set |= other | ...

Обновляет множество, добавляя элементы из всех остальных множеств.

intersection_update(*others)
set &= other & ...

Обновляет множество, оставляя в нём только элементы, найденные в нём самом и во всех остальных множествах.

difference_update(*others)
set -= other | ...

Обновляет множество, удаляя элементы, найденные в остальных множествах.

symmetric_difference_update(other)
set ^= other

Обновляет множество, оставляя только элементы, найденные в одном из множеств, но не в обоих.

add(elem)

Добавляет элемент elem в множество.

remove(elem)

Удаляет элемент elem из множества. Если elem не содержится в множестве, вызывает исключение KeyError.

discard(elem)

Удаляет элемент elem из множества, если он в нём присутствует.

pop()

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

clear()

Удаляет все элементы из множества.

Обратите внимание: версии методов update(), intersection_update(), difference_update() и symmetric_difference_update(), не использующие операторы, принимают в качестве аргумента любой итерируемый объект.

Обратите внимание: аргумент elem методов __contains__(), remove() и discard() может быть множеством. Для поиска эквивалентного frozenset из elem создаётся временный объект.

Типы отображения — dict

Объект отображения сопоставляет хешируемые значения произвольным объектам. Отображения — это изменяемые объекты. В настоящее время существует только один стандартный тип отображения — словарь. (О других контейнерах см. встроенные классы list, set и tuple, а также модуль collections.)

Ключами словаря могут быть почти любые значения. Значения, которые не являются хешируемыми, то есть значения, содержащие списки, словари или другие изменяемые типы (которые сравниваются по значению, а не по идентичности объектов), нельзя использовать в качестве ключей. Равные при сравнении значения (например, 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__() для аргумента с каждым ключом, возвращённым этим методом. В противном случае позиционный аргумент должен быть объектом итерируемого типа. Каждый элемент итерируемого объекта сам должен быть итерируемым объектом, содержащим ровно два элемента. Первый элемент каждого элемента становится ключом нового словаря, а второй — соответствующим значением. Если ключ встречается более одного раза, соответствующим значением в новом словаре становится последнее значение для этого ключа.

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

Для иллюстрации все следующие примеры возвращают словарь, равный {"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. В противном случае можно использовать любые допустимые ключи.

Вот операции, поддерживаемые словарями (и, следовательно, которые должны поддерживать пользовательские типы отображений):

list(d)

Возвращает список всех ключей, используемых в словаре d.

len(d)

Возвращает количество элементов в словаре d.

d[key]

Возвращает элемент словаря d с ключом key. Если key отсутствует в отображении, вызывает исключение KeyError.

Если в подклассе 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. В collections.defaultdict используется другой метод __missing__.

d[key] = value

Устанавливает d[key] равным value.

del d[key]

Удаляет d[key] из d. Если key отсутствует в отображении, вызывает исключение KeyError.

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 изменяемый объект, например пустой список. Чтобы получить разные значения, используйте вместо этого включение словаря.

get(key, default=None)

Возвращает значение для key, если key есть в словаре, иначе default. Если default не указан, по умолчанию используется None, поэтому этот метод никогда не вызывает исключение KeyError.

items()

Возвращает новое представление элементов словаря (пар (key, value)). См. описание объектов-представлений.

keys()

Возвращает новое представление ключей словаря. См. описание объектов-представлений.

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([other])

Обновляет словарь парами ключ/значение из other, перезаписывая существующие ключи. Возвращает None.

update() принимает либо другой объект с методом keys() (в этом случае __getitem__() вызывается для каждого ключа, возвращённого методом), либо итерируемый объект с парами ключ/значение (в виде кортежей или других итерируемых объектов длины два). Если заданы именованные аргументы, словарь затем обновляется этими парами ключ/значение: d.update(red=1, blue=2).

values()

Возвращает новое представление значений словаря. См. описание объектов-представлений.

Сравнение на равенство одного представления dict.values() с другим всегда возвращает False. Это также справедливо при сравнении dict.values() с самим собой:

>>> d = {'a': 1}
>>> d.values() == d.values()
False
d | other

Создаёт новый словарь, объединяющий ключи и значения d и other, которые оба должны быть словарями. Если у d и other есть общие ключи, приоритет имеют значения из other.

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

d |= other

Обновляет словарь d ключами и значениями из other, который может быть как отображением, так и итерируемым объектом с парами ключ/значение. Если у d и other есть общие ключи, приоритет имеют значения из other.

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

Словари равны тогда и только тогда, когда содержат одинаковые пары (key, value) (независимо от порядка). Операции сравнения порядка (‘<’, ‘<=’, ‘>=’, ‘>’) вызывают исключение TypeError.

Словари сохраняют порядок вставки. Обратите внимание, что обновление ключа не влияет на порядок. Ключи, добавленные после удаления, помещаются в конец.

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

Словари и представления словарей допускают обратный перебор.

>>> 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: Теперь словари допускают обратный перебор.

См. также

types.MappingProxyType можно использовать для создания представления dict только для чтения.

Объекты-представления словаря

Объекты, возвращаемые методами 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 присутствует среди ключей, значений или элементов исходного словаря (в последнем случае x должен быть кортежем (key, value)).

reversed(dictview)

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

Изменено в версии 3.8: Теперь представления словарей допускают обратный перебор.

dictview.mapping

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

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

Представления ключей подобны множествам, поскольку их элементы уникальны и хешируемы. Представления элементов также поддерживают операции, подобные операциям над множествами, поскольку пары (ключ, значение) уникальны, а ключи хешируемы. Если все значения в представлении элементов также хешируемы, это представление может взаимодействовать с другими множествами. (Представления значений не считаются подобными множествам, поскольку их элементы обычно не уникальны.) Для представлений, подобных множествам, доступны все операции, определённые для абстрактного базового класса collections.abc.Set (например, ==, < или ^). При использовании операторов множеств подобные множествам представления принимают в качестве второго операнда любой итерируемый объект, в отличие от множеств, которые принимают только множества.

Пример использования представления словаря:

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # iteration
>>> n = 0
>>> for val in values:
...     n += val
...
>>> print(n)
504

>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']

>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}
True
>>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}
True

>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy({'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500

Типы менеджеров контекста

Оператор 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.

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

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

Генераторы Python и декоратор contextlib.contextmanager предоставляют удобный способ реализации этих протоколов. Если функция-генератор декорирована декоратором contextlib.contextmanager, она возвращает менеджер контекста, реализующий необходимые методы __enter__() и __exit__(), а не итератор, создаваемый недекорированной функцией-генератором.

Обратите внимание, что в структуре типов объектов Python в Python/C API нет специального слота для любого из этих методов. Типы расширений, которым необходимо определить эти методы, должны предоставлять их как обычные методы, доступные из Python. По сравнению с затратами на настройку контекста времени выполнения накладные расходы на поиск в словаре класса ничтожны.

Типы аннотаций типов — Обобщённый псевдоним, Объединение

Основные встроенные типы для аннотаций типов — это обобщённый псевдоним и объединение.

Тип обобщённого псевдонима

Объекты GenericAlias обычно создаются посредством индексации класса. Чаще всего они используются с классами-контейнерами, такими как list или dict. Например, list[int] — это объект GenericAlias, созданный индексацией класса list с аргументом int. Объекты GenericAlias предназначены в первую очередь для использования в аннотациях типов.

Примечание

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

Объект GenericAlias выступает в качестве прокси для обобщённого типа, реализуя параметризованные обобщённые типы.

Для класса-контейнера аргумент(ы), переданные при индексации класса, могут указывать тип(ы) элементов, содержащихся в объекте. Например, 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.

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'>

Вызов 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]

Стандартные обобщённые классы

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

  • tuple
  • list
  • dict
  • set
  • frozenset
  • type
  • collections.deque
  • collections.defaultdict
  • collections.OrderedDict
  • collections.Counter
  • collections.ChainMap
  • collections.abc.Awaitable
  • collections.abc.Coroutine
  • collections.abc.AsyncIterable
  • collections.abc.AsyncIterator
  • collections.abc.AsyncGenerator
  • collections.abc.Iterable
  • collections.abc.Iterator
  • collections.abc.Generator
  • collections.abc.Reversible
  • collections.abc.Container
  • collections.abc.Collection
  • collections.abc.Callable
  • collections.abc.Set
  • collections.abc.MutableSet
  • collections.abc.Mapping
  • collections.abc.MutableMapping
  • collections.abc.Sequence
  • collections.abc.MutableSequence
  • collections.abc.ByteString
  • collections.abc.MappingView
  • collections.abc.KeysView
  • collections.abc.ItemsView
  • collections.abc.ValuesView
  • contextlib.AbstractContextManager
  • contextlib.AbstractAsyncContextManager
  • dataclasses.Field
  • functools.cached_property
  • functools.partialmethod
  • os.PathLike
  • queue.LifoQueue
  • queue.Queue
  • queue.PriorityQueue
  • queue.SimpleQueue
  • re.Pattern
  • re.Match
  • shelve.BsdDbShelf
  • shelve.DbfilenameShelf
  • shelve.Shelf
  • types.MappingProxyType
  • weakref.WeakKeyDictionary
  • weakref.WeakMethod
  • weakref.WeakSet
  • weakref.WeakValueDictionary

Специальные атрибуты объектов GenericAlias

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

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__

Логическое значение, равное true, если псевдоним был распакован с помощью оператора * (см. TypeVarTuple).

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

См. также

PEP 484 — Подсказки типов

Представление платформы Python для аннотаций типов.

PEP 585 — Подсказки типов для обобщённых типов в стандартных коллекциях

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

Generics, user-defined generics and typing.Generic

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

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

Тип объединения

Объект объединения хранит результат операции | (побитовое ИЛИ) над несколькими объектами типов. Эти типы предназначены в первую очередь для аннотаций типов. Выражение типа объединения позволяет использовать более простой синтаксис подсказок типов по сравнению с 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]
    
  • Необязательные типы можно записывать как объединение с 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])  # short-circuit evaluation
True
>>> isinstance([1], int | list[int])
Traceback (most recent call last):
  ...
TypeError: isinstance() argument 2 cannot be a parameterized generic

Тип объекта объединения, доступный пользователю, можно получить через types.UnionType и использовать для проверок с помощью isinstance(). Создать экземпляр этого типа нельзя:

>>> import types
>>> isinstance(int | str, types.UnionType)
True
>>> types.UnionType()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'types.UnionType' 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, предлагающий синтаксис X | Y и тип Union.

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

Другие встроенные типы

Интерпретатор поддерживает несколько других видов объектов. Большинство из них поддерживают только одну или две операции.

Модули

Единственная специальная операция для модуля — доступ к атрибуту: 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'>.

Классы и экземпляры классов

См. Объекты, значения и типы и Определения классов.

Функции

Объекты функций создаются определениями функций. Единственная операция над объектом функции — вызов: func(argument-list).

Существует два вида объектов функций: встроенные функции и функции, определённые пользователем. Оба вида поддерживают одну и ту же операцию (вызов функции), но их реализация различается, поэтому различаются и типы объектов.

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

Методы

Методы — это функции, вызываемые с помощью записи атрибута. Существует два вида методов: встроенные методы (например, 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'  # can't set on the 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'

Дополнительные сведения см. в разделе Методы экземпляров.

Объекты кода

Объекты кода используются реализацией для представления «псевдоскомпилированного» исполняемого кода Python, например тела функции. Они отличаются от объектов функций тем, что не содержат ссылки на глобальную среду выполнения. Объекты кода возвращаются встроенной функцией compile(); их также можно извлечь из объектов функций через атрибут __code__. См. также модуль code.

Обращение к __code__ вызывает событие аудита object.__getattr__ с аргументами obj и "__code__".

Объект кода можно выполнить или вычислить, передав его (вместо исходной строки) встроенной функции exec() или eval().

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

Объекты типов

Объекты типов представляют различные типы объектов. Тип объекта можно получить с помощью встроенной функции type(). Специальных операций над типами нет. Стандартный модуль types определяет имена всех стандартных встроенных типов.

Типы записываются так: <class 'int'>.

Объект Null

Этот объект возвращается функциями, которые явно не возвращают значение. Он не поддерживает специальных операций. Существует ровно один объект Null, называемый None (встроенное имя). type(None)() возвращает тот же одиночный объект.

Он записывается как None.

Объект Ellipsis

Этот объект обычно используется при срезах (см. Срезы). Он не поддерживает специальных операций. Существует ровно один объект Ellipsis, называемый Ellipsis (встроенное имя). type(Ellipsis)() возвращает одиночный объект Ellipsis.

Он записывается как Ellipsis или ....

Объект NotImplemented

Этот объект возвращается при сравнении и бинарных операциях, если операция применяется к типам, которые её не поддерживают. Дополнительные сведения см. в разделе Сравнения. Существует ровно один объект NotImplemented. type(NotImplemented)() возвращает этот одиночный экземпляр.

Он записывается как NotImplemented.

Внутренние объекты

См. Стандартная иерархия типов. В ней описаны объекты кадров стека, объекты трассировки стека и объекты срезов.

Специальные атрибуты

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

definition.__name__

Имя класса, функции, метода, дескриптора или экземпляра генератора.

definition.__qualname__

Полное имя класса, функции, метода, дескриптора или экземпляра генератора.

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

definition.__module__

Имя модуля, в котором был определён класс или функция.

definition.__doc__

Строка документации класса или функции либо None, если она не определена.

definition.__type_params__

Параметры типа обобщённых классов, функций и псевдонимов типов. Для классов и функций, которые не являются обобщёнными, это будет пустой кортеж.

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

Ограничение длины преобразования целых чисел в строки

В CPython действует глобальное ограничение на преобразование между int и str, предназначенное для защиты от атак типа «отказ в обслуживании». Это ограничение применяется только к десятичным и другим системам счисления, основание которых не является степенью двойки. Преобразования в шестнадцатеричную, восьмеричную и двоичную системы не ограничены. Ограничение можно настроить.

Тип int в CPython — это целое число произвольной длины, хранящееся в двоичном формате (обычно называемое «большим числом», или bignum). Не существует алгоритма, позволяющего преобразовать строку в двоичное целое число или двоичное целое число в строку за линейное время, если только основание системы счисления не является степенью 2. Даже самые эффективные известные алгоритмы для основания 10 имеют субквадратичную сложность. Преобразование большого значения, такого как int('1' * 500_000), может занять более секунды даже на быстром процессоре.

Ограничение размера преобразования — практичный способ избежать CVE 2020-10735.

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

Если операция превысит ограничение, будет вызвано исключение ValueError:

>>> import sys
>>> sys.set_int_max_str_digits(4300)  # Illustrative, this is the default.
>>> _ = 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  # Hexadecimal is unlimited.

Значение ограничения по умолчанию — 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.11.

Затронутые API

Ограничение применяется только к потенциально медленным преобразованиям между int и str или bytes:

  • int(string) с основанием по умолчанию 10.
  • int(string, base) для всех оснований, не являющихся степенью 2.
  • str(integer).
  • repr(integer).
  • любое другое преобразование строки в число с основанием 10, например f"{integer}", "{}".format(integer) или b"%d" % integer.

Ограничения не применяются к функциям с линейным алгоритмом:

  • int(string, base) с основанием 2, 4, 8, 16 или 32.
  • int.from_bytes() и int.to_bytes().
  • hex(), oct(), bin().
  • Мини-язык спецификаций формата для шестнадцатеричных, восьмеричных и двоичных чисел.
  • Преобразование str в float.
  • Преобразование str в decimal.Decimal.

Настройка ограничения

До запуска 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.

В коде текущее ограничение можно проверить, а новое — задать с помощью следующих API sys:

  • sys.get_int_max_str_digits() и sys.set_int_max_str_digits() — это функции получения и установки ограничения для всего интерпретатора. У субинтерпретаторов свои ограничения.

Сведения о значениях по умолчанию и минимальном значении приведены в sys.int_info:

  • sys.int_info.default_max_str_digits — значение ограничения по умолчанию, заданное при компиляции.
  • sys.int_info.str_digits_check_threshold — наименьшее допустимое значение ограничения (кроме 0, отключающего его).

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

Предупреждение

Установка низкого ограничения может привести к проблемам. Хотя такое встречается редко, существует код, содержащий в исходном тексте десятичные целочисленные константы, превышающие минимальный порог. Из-за установленного ограничения исходный код Python, содержащий десятичные целочисленные литералы, длина которых превышает это ограничение, вызовет ошибку при разборе — обычно во время запуска, импорта или даже установки, то есть всякий раз, когда для этого кода ещё нет актуального .pyc. В качестве обходного решения такие большие константы в исходном коде можно записать в шестнадцатеричной форме 0x, поскольку на неё ограничение не распространяется.

Тщательно протестируйте приложение, если используете низкое ограничение. Убедитесь, что тесты запускаются с ограничением, заданным заранее через переменную среды или флаг, чтобы оно действовало при запуске и даже во время установки, если на этом этапе Python используется для предварительной компиляции исходных файлов .py в файлы .pyc.

Рекомендуемая конфигурация

Предполагается, что значение sys.int_info.default_max_str_digits по умолчанию подходит для большинства приложений. Если приложению требуется другое ограничение, задайте его из основной точки входа, используя код, совместимый с разными версиями Python, поскольку эти API были добавлены в выпусках обновлений безопасности версий до 3.12.

Пример:

>>> import sys
>>> if hasattr(sys, "set_int_max_str_digits"):
...     upper_bound = 68000
...     lower_bound = 4004
...     current_limit = sys.get_int_max_str_digits()
...     if current_limit == 0 or current_limit > upper_bound:
...         sys.set_int_max_str_digits(upper_bound)
...     elif current_limit < lower_bound:
...         sys.set_int_max_str_digits(lower_bound)

Чтобы полностью отключить ограничение, задайте значение 0.

Сноски

[1]

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

[2]

Вследствие этого список [1, 2] считается равным [1.0, 2.0]; то же справедливо для кортежей.

[3]

Они должны это делать, поскольку анализатор не может определить тип операндов.

[4] (1,2,3,4)

К символам с регистром относятся символы, общее свойство категории которых имеет одно из значений: «Lu» (буква, верхний регистр), «Ll» (буква, нижний регистр) или «Lt» (буква, титульный регистр).

[5] (1,2)

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

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/stdtypes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API