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

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

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

Некоторые классы коллекций могут изменяться. Методы, которые добавляют, вычитают или переставляют свои элементы на месте и не возвращают определенный элемент, никогда не возвращают сам экземпляр коллекции, а только 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 для значения false и 1 или True для значения true, если не указано иное. (Важное исключение: логические операции or и and всегда возвращают один из своих операндов.)

Логические операции — and, or, not

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

Операция

Результат

Записи

x or y

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

(1)

x and y

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

(2)

not x

если x равно false, то True, иначе False

(3)

Записи:

  1. Это оператор короткого замыкания, поэтому он вычисляет второй аргумент только в том случае, если первый имеет значение false.

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

  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, поддерживаются типами, которые являются iterable или реализуют метод __contains__().

Числовые типы — int, float, complex

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

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

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

Конструкторы int(), float(), и 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).

    Смотрите https://www.unicode.org/Public/14.0.0/ucd/extracted/DerivedNumericType.txt полный список кодовых точек со свойством 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

побитовое or из x и y

(4)

x ^ y

побитовое exclusive or из x и y

(4)

x & y

побитовое and из 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 abstract base class. Кроме того, он предоставляет еще несколько методов:

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'

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

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

Аргумент signed определяет, используется ли дополнение two для представления целого числа. Если значение 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 должен быть либо bytes-like object, либо итеративным производящим байтом.

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

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

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

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

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

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

Дополнительные методы для Float

Тип float реализует numbers.Real abstract base class. float также имеет следующие дополнительные методы.

float.as_integer_ratio()

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

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, а шестнадцатеричные строки, созданные с помощью символа формата C %a или Java Double.toHexString, принимаются 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-разрядной длиной и P = 2**61 - 1 на машинах с 64-разрядной длиной C.

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

  • Если 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, эквивалентного встроенному хэшу, для вычисления хэша рационального числа 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

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

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

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

container.__iter__()

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

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

iterator.__iter__()

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

iterator.__next__()

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

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

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

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

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

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

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

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

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

В этой таблице перечислены операции последовательности, отсортированные по возрастанию приоритета. В таблице 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)

длина с

min(s)

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

max(s)

самый большой товар из ов

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

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

(8)

s.count(x)

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

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

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

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

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

В таблице 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. t должен иметь ту же длину, что и заменяемый фрагмент.

  2. Необязательный аргумент i по умолчанию имеет значение -1, так что по умолчанию последний элемент удаляется и возвращается.

  3. remove() вызывает ValueError, когда x не найден в s.

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

  5. clear() и copy() включены для обеспечения согласованности с интерфейсами изменяемых контейнеров, которые не поддерживают операции нарезки (например, dict и set). copy() не поддерживается часть collections.abc.MutableSequence ABC, но большинство конкретных классов изменяемых последовательностей предоставляют ее.

    Добавлено в версии 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 может быть либо последовательностью, контейнером, поддерживающим итерацию, либо объектом iterator. Если iterable уже является списком, создается копия и возвращается, аналогично iterable[:]. Например, list('abc') возвращает ['a', 'b', 'c'], а list( (1, 2, 3) ) возвращает [1, 2, 3]. Если аргумент не указан, конструктор создает новый пустой список [].

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

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

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

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

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

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

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

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

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

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

Примеры сортировки и краткое руководство по сортировке приведены в разделе Сортировка, КАК.

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

Кортежи

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

class tuple([iterable])

Кортежи могут быть сконструированы несколькими способами:

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

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

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

  • Используя встроенный tuple(): tuple() или tuple(iterable)

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

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

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

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

Диапазоны

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

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

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

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

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

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

Допустимы диапазоны, содержащие абсолютные значения, превышающие 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))
[]

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

start

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

stop

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

step

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

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

Объекты Range реализуют collections.abc.Sequence ABC и предоставляют такие функции, как тесты на сдерживание, поиск по индексу элемента, нарезка и поддержка отрицательных индексов (см. Типы последовательностей — 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, которые сравниваются одинаково, могут иметь разные атрибуты start, stop и step, например range(0) == range(2, 1, 3) или range(0, 3, 2) == range(0, 4, 2).)

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

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

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

См.также

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

Тип текстовой последовательности — str

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Строковые методы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

str.expandtabs(tabsize=8)

Возвращает копию строки, в которой все символы табуляции заменены одним или несколькими пробелами, в зависимости от текущего столбца и заданного размера табуляции. Позиции табуляции указаны в каждом символе tabsize (по умолчанию 8, что соответствует позициям табуляции в столбцах 0, 8, 16 и так далее). Чтобы расширить строку, текущему столбцу присваивается нулевое значение, и строка проверяется посимвольно. Если это символ табуляции (\t), в результат вставляется один или несколько пробелов, пока текущий столбец не будет равен следующей позиции табуляции. (Сам символ табуляции не копируется.) Если символ представляет собой новую строку (\n) или return (\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 интерпретируются как в нотации фрагмента. Возвращает -1, если sub не найден.

Примечание

Метод 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 или длиннее меньше 1 байта, и языковой стандарт 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 как «Буква», т.е. те, которые имеют свойство общей категории «Lm», «Lt», «Lu», «Ll» или «Lo». Обратите внимание, что это отличается от свойства «Алфавитный», определенного в стандарте Unicode.

str.isascii()

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

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

str.isdecimal()

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

str.isdigit()

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

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 в противном случае. К числовым символам относятся цифровые символы и все символы, которые имеют свойство числового значения в Юникоде, например, U+2155, ОБЫЧНАЯ ДРОБЬ В ОДНУ ПЯТУЮ. Формально числовыми символами являются символы со значением свойства Numeric_Type=Цифра, Numeric_Type=Десятичный или Numeric_Type=Числовой.

str.isprintable()

Возвращает True, если все символы в строке доступны для печати или строка пустая, False в противном случае. Непечатаемые символы - это символы, определенные в базе данных символов Unicode как «Другие» или «Разделитель», за исключением пробела ASCII (0x20), который считается пригодным для печати. (Обратите внимание, что печатаемые символы в данном контексте - это те, которые не следует экранировать при вызове repr() для строки. Это не имеет никакого отношения к обработке строк, записанных в sys.stdout или sys.stderr.)

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

str.ljust(width[, fillchar])

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

str.lower()

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

Используемый алгоритм использования нижнего регистра описан в разделе 3.13 стандарта Unicode.

str.lstrip([chars])

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

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

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

str.partition(sep)

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

str.removeprefix(prefix, /)

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

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

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

str.removesuffix(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, такой, что sub содержится в пределах s[start:end]. Необязательные аргументы start и end интерпретируются как в нотации фрагмента. Возвращает -1 в случае сбоя.

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

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

str.rjust(width[, fillchar])

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

str.rpartition(sep)

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

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

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

str.rstrip([chars])

Возвращает копию строки с удаленными конечными символами. Аргумент chars - это строка, указывающая набор символов, которые необходимо удалить. Если он опущен или None, в аргументе chars по умолчанию удаляются пробелы. Аргумент 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 может состоять из нескольких символов (например, '1<>2<>3'.split('<>') возвращает ['1', '2', '3']). При разделении пустой строки указанным разделителем возвращается [''].

Например:

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

Если значение sep не указано или равно None, применяется другой алгоритм разделения: последовательные пробелы рассматриваются как единый разделитель, и результат не будет содержать пустых строк в начале или в конце, если строка содержит начальный или конечный пробелы. Следовательно, при разделении пустой строки или строки, состоящей только из пробелов, разделителем 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)

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

Этот метод выполняет разбиение на следующие линейные границы. В частности, границы являются надмножеством universal newlines.

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

Описание

\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, если строка начинается с префикса , в противном случае верните ``False``. Префикс * также может быть набором префиксов для поиска. С необязательным *start проверьте строку, начинающуюся с этой позиции. Используя необязательный параметр end, остановите сравнение строк в этой позиции.

str.strip([chars])

Возвращает копию строки с удаленными начальными и конечными символами. Аргумент chars - это строка, указывающая набор символов, которые необходимо удалить. Если он опущен или None, в аргументе chars по умолчанию удаляются пробелы. Аргумент 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__(), обычно это mapping или sequence. При индексации с помощью порядкового номера в Юникоде (целого числа) объект table может выполнять любое из следующих действий: возвращать порядковый номер в Юникоде или строку, чтобы сопоставить символ с одним или несколькими другими символами; возвращать None, чтобы удалить символ из возвращаемой строки; или вызывать исключение LookupError, чтобы сопоставить символ самому себе.

Вы можете использовать str.maketrans() для создания карты перевода из сопоставлений между символами в разных форматах.

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

str.upper()

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

Используемый алгоритм использования верхнего регистра описан в разделе 3.13 стандарта Unicode.

str.zfill(width)

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

Например:

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

printf -стиль форматирования строки

Примечание

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

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

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

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

Объекты в байтах

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

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

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

В дополнение к литеральным формам объекты bytes могут быть созданы рядом других способов:

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

  • Из повторяющегося набора целых чисел: bytes(range(20))

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

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

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

classmethod fromhex(string)

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

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

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

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

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

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

Объекты Bytearray

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

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

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

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

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

  • Из повторяющегося набора целых чисел: bytearray(range(20))

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

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

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

Поскольку 2 шестнадцатеричные цифры в точности соответствуют одному байту, шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип 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 используется литеральный формат bytes (bytearray(b'...')), поскольку он часто более полезен, чем, например, bytearray([46, 46, 46]). Вы всегда можете преобразовать объект bytearray в список целых чисел, используя list(b).

Операции с байтами и Bytearray

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

Примечание

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

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 интерпретируются как в нотации slice.

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

Префикс * может быть любым bytes-like object.

Примечание

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

Добавлено в версии 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'

Суффикс * может быть любым bytes-like object.

Примечание

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

Суффикс(ы) для поиска может быть любым bytes-like object.

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

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

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

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

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

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

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

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

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

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

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

Разделитель для поиска может быть любым bytes-like object.

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

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

Подпоследовательность для поиска и ее замены может быть любой bytes-like object.

Примечание

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

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

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

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

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

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

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

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

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

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

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

Разделитель для поиска может быть любым bytes-like object.

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

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

Префикс(ы) для поиска может быть любым bytes-like object.

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

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

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

Примечание

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

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

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

Примечание

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

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

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

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

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

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

Примечание

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

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

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

Примечание

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

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, то по умолчанию в аргументе chars удаляются пробелы ASCII. Аргумент chars не является суффиксом; вместо этого все комбинации его значений удаляются:

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

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

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

Примечание

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

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'1<>2<>3'.split(b'<>') возвращает [b'1', b'2', b'3']). Разделение пустой последовательности указанным разделителем возвращает значение [b''] или [bytearray(b'')] в зависимости от типа разделяемого объекта. Аргумент sep может быть любым bytes-like object.

Например:

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

Если значение 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, то по умолчанию в аргументе chars удаляются пробелы ASCII. Аргумент chars не является префиксом или суффиксом; вместо этого все комбинации его значений удаляются:

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

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

Примечание

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

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

bytes.capitalize()
bytearray.capitalize()

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

Примечание

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

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'

Примечание

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

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

Примечание

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

bytes.splitlines(keepends=False)
bytearray.splitlines(keepends=False)

Возвращает список строк в двоичной последовательности, прерывающийся на границах строк в формате ASCII. В этом методе используется подход universal newlines для разделения строк. Разрывы строк не включаются в результирующий список, если только не задано значение 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.

Примечание

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

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

Примечание

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

bytes.upper()
bytearray.upper()

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

Например:

>>> b'Hello World'.upper()
b'HELLO WORLD'

Строчные символы ASCII - это байтовые значения в последовательности b'abcdefghijklmnopqrstuvwxyz'. Символы ASCII в верхнем регистре - это байтовые значения в последовательности b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

Примечание

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

bytes.zfill(width)
bytearray.zfill(width)

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

Например:

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

Примечание

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

printf-стиль форматирования байтов

Примечание

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

Объекты Bytes (bytes/bytearray) имеют одну уникальную встроенную операцию: оператор % (по модулю). Он также известен как оператор форматирования байтов или интерполяции. Учитывая format % values (где format - объект bytes), % спецификации преобразования в format заменяются нулем или более элементами values. Эффект аналогичен использованию sprintf() в языке Си.

Если для format требуется один аргумент, values может быть единственным объектом, не являющимся кортежем. [5] В противном случае, значения должны быть кортежем с точным количеством элементов, указанным в объекте format 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'

Байты (любой объект, следующий за buffer protocol или имеющий __bytes__()).

(5)

's'

's' является псевдонимом для 'b' и должен использоваться только для кодовых баз Python2/3.

(6)

'a'

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

(5)

'r'

'r' является псевдонимом для 'a' и должен использоваться только для кодовых баз Python2/3.

(7)

'%'

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

Записи:

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

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

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

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

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

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

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

  6. b'%s' является устаревшим, но не будет удален в течение серии 3.x.

  7. b'%r' является устаревшим, но не будет удален в течение серии 3.x.

  8. Смотрите PEP 237.

Примечание

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

См.также

PEP 461 - Добавление % форматирования к bytes и bytearray

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

Виды памяти

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

class memoryview(object)

Создайте memoryview, который ссылается на object. object должен поддерживать протокол buffer. Встроенные объекты, поддерживающие протокол buffer, включают bytes и bytearray.

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

len(view) равно длине tolist. Если view.ndim = 0, то длина равна 1. Если view.ndim = 1, то длина равна количеству элементов в представлении. Для больших размеров длина равна длине вложенного списка, представленного в представлении. Атрибут itemsize указывает количество байт в одном элементе.

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

Одномерные представления памяти типов hashable (доступные только для чтения) с форматами „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“ теперь имеют значение hashable.

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

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

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

Преобразуйте memoryview в новый формат или форму. shape по умолчанию имеет значение [byte_length//new_itemsize], что означает, что результирующий вид будет одномерным. Возвращаемое значение представляет собой новый вид памяти, но сам буфер не копируется. Поддерживаются следующие преобразования: 1D -> C-contiguous и C-непрерывное -> 1D.

Конечный формат ограничен собственным форматом с одним элементом в синтаксисе struct. Один из форматов должен быть байтовым («B», «b» или «c»). Длина байта результата должна совпадать с исходной длиной. Обратите внимание, что длина всех байтов может зависеть от операционной системы.

Преобразуйте 1D/длинный в 1D/беззнаковый байт:

>>> 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/байт без знака в 1D/символ:

>>> 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/байт в 3D/целые числа в 1D/символ со знаком:

>>> 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 в длину 2D/unsigned:

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

Базовый объект memoryview:

>>> b  = bytearray(b'xyz')
>>> m = memoryview(b)
>>> m.obj is b
True

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

nbytes

nbytes == product(shape) * itemsize == len(m.tobytes()). Это объем пространства в байтах, который массив будет использовать в непрерывном представлении. Он не обязательно равен len(m):

>>> import array
>>> a = array.array('i', [1,2,3,4,5])
>>> m = memoryview(a)
>>> len(m)
5
>>> m.nbytes
20
>>> y = m[::2]
>>> len(y)
3
>>> y.nbytes
12
>>> len(y.tobytes())
12

Многомерные массивы:

>>> import struct
>>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)])
>>> x = memoryview(buf)
>>> y = x.cast('d', shape=[3,4])
>>> y.tolist()
[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]
>>> len(y)
3
>>> y.nbytes
96

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

readonly

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

format

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

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

itemsize

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

>>> import array, struct
>>> m = memoryview(array.array('H', [32000, 32001, 32002]))
>>> m.itemsize
2
>>> m[0]
32000
>>> struct.calcsize('H') == m.itemsize
True
ndim

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

shape

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

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

strides

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

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

suboffsets

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

c_contiguous

Bool, указывающий, является ли память C-contiguous.

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

f_contiguous

Bool, указывающий, является ли память Fortran contiguous.

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

contiguous

Bool, указывающий, является ли объем памяти contiguous.

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

Установленные типы — set, frozenset

Объект set представляет собой неупорядоченную коллекцию различных объектов hashable. Обычно используется для проверки принадлежности, удаления дубликатов из последовательности и вычисления математических операций, таких как пересечение, объединение, разность и симметричная разность. (О других контейнерах смотрите во встроенных классах dict, list, и tuple, а также в модуле collections.)

Как и другие коллекции, наборы поддерживают x in set, len(set), и for x in set. Будучи неупорядоченной коллекцией, наборы не записывают положение элементов или порядок их вставки. Соответственно, наборы не поддерживают индексацию, нарезку или другое поведение, подобное последовательности.

В настоящее время существует два встроенных типа наборов: set и frozenset. Тип set является изменяемым - содержимое может быть изменено с помощью таких методов, как add() и remove(). Поскольку он изменяем, он не имеет хэш-значения и не может использоваться ни как ключ словаря, ни как элемент другого набора. Тип frozenset является неизменяемым и hashable — его содержимое не может быть изменено после его создания; поэтому его можно использовать как ключ словаря или как элемент другого набора.

Непустые наборы (и замороженные наборы) могут быть созданы путем помещения списка элементов, разделенных запятыми, в фигурные скобки, например: {'jack', 'sjoerd'}, в дополнение к конструктору set.

Конструкторы для обоих классов работают одинаково:

class set([iterable])
class frozenset([iterable])

Возвращает новый объект set или frozenset, элементы которого взяты из iterable. Элементы набора должны быть hashable. Чтобы представлять наборы множеств, внутренние наборы должны быть объектами 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, если множество не имеет элементов, общих с другими. Множества не пересекаются тогда и только тогда, когда их пересечение является пустым множеством.

issubset(other)
set <= 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

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

copy()

Верните уменьшенную копию набора.

Обратите внимание, что версии программного обеспечения, не предназначенные для работы с операторами union(), intersection(), difference(), symmetric_difference(), issubset(), и issuperset() методы будут принимать любые повторяемый в качестве аргумента. В отличие от этого, их аналоги, основанные на операторах, требуют, чтобы их аргументы были наборами. Это исключает подверженные ошибкам конструкции типа set('abc') & 'cbs' в пользу более удобочитаемой set('abc').intersection('cbs').

Как set, так и frozenset поддерживают set для сравнения наборов. Два набора равны тогда и только тогда, когда каждый элемент каждого набора содержится в другом (каждый из них является подмножеством другого). Набор меньше другого набора тогда и только тогда, когда первый набор является соответствующим подмножеством второго набора (является подмножеством, но не равным). Набор больше другого набора тогда и только тогда, когда первый набор является соответствующим надмножеством второго набора (является надмножеством, но не равным).

Экземпляры set сравниваются с экземплярами frozenset на основе их элементов. Например, set('abc') == frozenset('abc') возвращает True, как и set('abc') in set([frozenset('abc')]).

Сравнения подмножества и равенства не обобщаются на функцию полного упорядочения. Например, любые два непустых непересекающихся множества не равны и не являются подмножествами друг друга, поэтому все из следующего возвращают False: a<b, a==b, или a>b.

Поскольку наборы определяют только частичный порядок (отношения подмножеств), выходные данные метода list.sort() не определены для списков наборов.

Заданные элементы, такие как ключи словаря, должны быть hashable.

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

discard(elem)

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

pop()

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

clear()

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

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

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

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

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

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

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

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

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

Если подкласс dict определяет метод __missing__(), а key отсутствует, операция d[key] вызывает этот метод с ключом key в качестве аргумента. Затем операция d[key] возвращает или вызывает все, что было возвращено или вызвано вызовом __missing__(key). Никакие другие операции или методы не вызывают __missing__(). Если __missing__() не определено, вызывается KeyError. __missing__() должно быть методом; это не может быть переменной экземпляра:

>>> class Counter(dict):
...     def __missing__(self, key):
...         return 0
>>> c = Counter()
>>> c['red']
0
>>> c['red'] += 1
>>> c['red']
1

В приведенном выше примере показана часть реализации collections.Counter. В collections.defaultdict используется другой метод __missing__.

d[key] = value

Установите для d[key] значение *.

del d[key]

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

key in d

Возвращает True, если в d есть ключ key, иначе False.

key not in d

Эквивалентно not key in d.

iter(d)

Возвращает итератор по ключам словаря. Это сокращение для iter(d.keys()).

clear()

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

copy()

Верните неполную копию словаря.

classmethod fromkeys(iterable[, value])

Создайте новый словарь с ключами из iterable и значениями, установленными в value.

fromkeys() - это метод класса, который возвращает новый словарь. значение по умолчанию равно None. Все значения относятся только к одному экземпляру, поэтому, как правило, не имеет смысла, чтобы value был изменяемым объектом, таким как пустой список. Чтобы получить разные значения, используйте вместо этого dict comprehension.

get(key[, default])

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

items()

Возвращает новый вид элементов словаря (пары (key, value)). Смотрите documentation of view objects.

keys()

Возвращает новый вид ключей словаря. Смотрите documentation of view objects.

pop(key[, default])

Если key есть в словаре, удалите его и верните его значение, в противном случае верните default. Если значение default не задано и key нет в словаре, то будет поднят KeyError.

popitem()

Удалите и верните пару (key, value) из словаря. Пары возвращаются в порядке LIFO.

popitem() полезно выполнять деструктивную итерацию по словарю, что часто используется в алгоритмах set. Если словарь пуст, вызов popitem() вызывает KeyError.

Изменено в версии 3.7: Порядок LIFO теперь гарантирован. В предыдущих версиях popitem() возвращал произвольную пару ключ/значение.

reversed(d)

Возвращает обратный итератор по ключам словаря. Это сокращение для reversed(d.keys()).

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

setdefault(key[, default])

Если key есть в словаре, верните его значение. Если нет, вставьте key со значением default и верните default. default по умолчанию имеет значение None.

update([other])

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

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

values()

Возвращает новое представление значений словаря. Смотрите documentation of view objects.

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

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

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

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

d |= other

Обновите словарь d ключами и значениями из other, которые могут быть либо mapping, либо iterable из пар ключ/значение. Значения other имеют приоритет, когда d и 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.

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

Примером контекстного менеджера, который возвращает сам себя, является file object. Файловые объекты возвращают сами себя из __enter__(), чтобы разрешить использование open() в качестве контекстного выражения в инструкции with.

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

contextmanager.__exit__(exc_type, exc_val, exc_tb)

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

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

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

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

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

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

Типы аннотаций Type — Generic Alias, Union

Основными встроенными типами для type annotations являются Generic Alias и Union.

Общий тип псевдонима

GenericAlias объекты обычно создаются с помощью subscripting класса. Чаще всего они используются с container classes, например, с list или dict. Например, list[int] является объектом GenericAlias, созданным путем добавления аргумента в класс list int. GenericAlias объекты предназначены в первую очередь для использования с type annotations.

Примечание

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

Объект GenericAlias действует как прокси-сервер для generic type, реализуя параметризованные обобщения.

Для класса-контейнера аргументы, передаваемые в subscription класса, могут указывать тип(ы) элементов, которые содержит объект. Например, set[bytes] может использоваться в аннотациях к типу для обозначения set, в котором все элементы относятся к типу bytes.

Для класса, который определяет __class_getitem__(), но не является контейнером, аргументы, предоставляемые для подписки на класс, часто будут указывать тип(ы) возвращаемого значения одного или нескольких методов, определенных для объекта. Например, regular expressions может использоваться как для типа данных str, так и для типа данных bytes:

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

Другой пример для объектов mapping, использующих 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 не применяет type annotations. Это распространяется на универсальные типы и их параметры типа. При создании объекта-контейнера из 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

Однако такие выражения допустимы, когда используется type variables. Индекс должен содержать столько элементов, сколько элементов переменной типа GenericAlias в __args__ объекта.

>>> from typing import TypeVar
>>> Y = TypeVar('Y')
>>> dict[str, Y][int]
dict[str, int]

Стандартные универсальные классы

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

Специальные атрибуты объектов 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__().

Дженерики, user-defined generics и typing.Generic

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

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

Тип соединения

Объект объединения содержит значение операции | (побитовое или) над несколькими type objects. Эти типы предназначены в первую очередь для type annotations. Выражение типа объединения обеспечивает более четкий синтаксис указания типа по сравнению с 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

Однако parameterized generics в объектах объединения не может быть проверено:

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

Пользовательский тип объекта union может быть доступен из 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__(), объединение может переопределить его:

>>> 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 и тип объединения.

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

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

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

Модули

Единственной специальной операцией над модулем является доступ к атрибуту: m.name, где m - это модуль, а name обращается к имени, определенному в таблице символов m. Атрибуты модуля могут быть назначены. (Обратите внимание, что оператор import, строго говоря, не является операцией над объектом module; для import foo не требуется существование объекта module с именем 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).

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

Смотрите Определения функций для получения дополнительной информации.

Методы

Методы - это функции, которые вызываются с использованием обозначения атрибута. Существует два варианта: built-in methods (например, append() в списках) и class instance method. Описаны встроенные методы и типы, которые их поддерживают.

Если вы обращаетесь к методу (функции, определенной в пространстве имен класса) через экземпляр, вы получаете специальный объект: объект bound method (также называемый instance method). При вызове он добавит аргумент self в список аргументов. Связанные методы имеют два специальных атрибута, доступных только для чтения: m.__self__ - это объект, с которым работает метод, и m.__func__ - это функция, реализующая метод. Вызов m(arg-1, arg-2, ..., arg-n) полностью эквивалентен вызову m.__func__(m.__self__, arg-1, arg-2, ..., arg-n).

Как и function objects, объекты связанного метода поддерживают получение произвольных атрибутов. Однако, поскольку атрибуты метода фактически хранятся в базовом функциональном объекте (method.__func__), установка атрибутов метода для связанных методов запрещена. Попытка задать атрибут методу приводит к возникновению AttributeError. Чтобы задать атрибут метода, вам необходимо явно задать его для базового объекта function:

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

Смотрите Методы экземпляра для получения дополнительной информации.

Объекты кода

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

При обращении к __code__ возникает ошибка auditing event object.__getattr__ с аргументами obj и "__code__".

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

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

Введите объекты

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

Типы записываются следующим образом: <class 'int'>.

Нулевой объект

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

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

Объект с многоточием

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

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

Невыполненный объект

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

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

Логические значения

Логические значения - это два постоянных объекта False и True. Они используются для представления истинностных значений (хотя другие значения также могут считаться ложными или истинными). В числовых контекстах (например, при использовании в качестве аргумента арифметического оператора) они ведут себя как целые числа 0 и 1 соответственно. Встроенная функция bool() может быть использована для преобразования любого значения в логическое, если это значение можно интерпретировать как истинное (см. раздел Проверка истинностного значения выше).

Они записываются как False и True соответственно.

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

Смотрите Иерархия стандартных типов для получения этой информации. В нем описываются объекты stack frame objects, traceback objects, и slice.

Особые атрибуты

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

object.__dict__

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

instance.__class__

Класс, к которому принадлежит экземпляр класса.

class.__bases__

Набор базовых классов объекта класса.

definition.__name__

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

definition.__qualname__

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

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

class.__mro__

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

class.mro()

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

class.__subclasses__()

Каждый класс хранит список слабых ссылок на свои непосредственные подклассы. Этот метод возвращает список всех ссылок, которые все еще существуют. Список приведен в порядке определения. Пример:

>>> int.__subclasses__()
[<class 'bool'>, <enum 'IntEnum'>, <flag 'IntFlag'>, <class 're._constants._NamedIntConstant'>]

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

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

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

Настройка лимита

Перед запуском 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. Если заданы как параметр env var, так и параметр -X, параметр -X имеет приоритет. Значение -1 указывает на то, что оба параметра были сброшены, поэтому при инициализации было использовано значение sys.int_info.default_max_str_digits.

Из кода вы можете проверить текущее ограничение и установить новое, используя эти sys API:

  • sys.get_int_max_str_digits() и sys.set_int_max_str_digits() являются параметрами получения и установки ограничений для всего интерпретатора. У дополнительных интерпретаторов есть свои собственные ограничения.

Информацию о значении по умолчанию и минимальном значении можно найти в разделе sys.int_info:

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

Осторожно

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

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

Вернуться на верх