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

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

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

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

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

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

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

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

  • константы, определенные как false: 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 ложно, то y, иначе x

(1)

x and y

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

(2)

not x

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

(3)

Примечания:

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

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

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

Сравнения

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

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

Операция

Значение

<

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

<=

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

>

строго больше, чем

>=

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

==

равный

!=

неравный

is

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

is not

отрицаемая идентичность объекта

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

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

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

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

Еще две операции с тем же синтаксическим приоритетом, in и not in, поддерживаются типами, которые являются 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 полностью поддерживает смешанную арифметику: когда двоичный арифметический оператор имеет операнды разных числовых типов, операнд с более «узким» типом расширяется до другого, где целое число узкое, чем плавающая точка, которая узкая, чем комплексная. Сравнение между числами разных типов ведет себя так, как будто сравниваются точные значения этих чисел. 2

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

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

Операция

Результат

Примечания

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

x + y

сумма x и y

x - y

разность x и y

x * y

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

x / y

коэффициент x и y

x // y

floated quotient of x and y

(1)

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. Результат всегда округляется в сторону минус бесконечности: 1//2 равно 0, (-1)//2 равно -1, 1//(-2) равно -1, а (-1)//(-2) равно 0.

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

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

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

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

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

    Полный список точек кода со свойством Nd см. на сайте https://www.unicode.org/Public/13.0.0/ucd/extracted/DerivedNumericType.txt.

Все типы 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, byteorder, *, signed=False)

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

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

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

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

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

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

classmethod int.from_bytes(bytes, byteorder, *, 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 определяет порядок байтов, используемый для представления целого числа. Если byteorder равен "big", старший байт находится в начале массива байтов. Если byteorder равен "little", то старший байт находится в конце массива байтов. Чтобы запросить родной порядок байтов хост-системы, используйте sys.byteorder в качестве значения порядка байтов.

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

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

int.as_integer_ratio()

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

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

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

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

float.as_integer_ratio()

Возвращает пару целых чисел, отношение которых точно равно исходному float и с положительным знаменателем. Вызывает 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)

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

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

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

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

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

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

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

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

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

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

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

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

Вот правила в деталях:

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

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

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

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

  • Для числа complex z хеш-значения действительной и мнимой частей объединяются путем вычисления hash(z.real) + sys.hash_info.imag * hash(z.imag), уменьшенного по модулю 2**sys.hash_info.width так, чтобы он лежал в range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1)). Опять же, если результат равен -1, он заменяется на -2.

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

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

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

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

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

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

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

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

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

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

Операция

Результат

Примечания

x in s

True если элемент из s равен x, иначе False.

(1)

x not in s

False если элемент из s равен x, иначе True.

(1)

s + t

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

(6)(7)

s * n или n * s

эквивалентно прибавлению s к самому себе n раз

(2)(7)

s[i]

i-й элемент из s, начало 0

(3)

s[i:j]

отрезок s от i до j

(3)(4)

s[i:j:k]

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

(3)(5)

len(s)

длина s

min(s)

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

max(s)

наибольшее количество s

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

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

(8)

s.count(x)

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

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

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

Примечания:

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

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

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

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

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

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

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

  4. Срез s от i до j определяется как последовательность элементов с индексом k таких, что i <= k < j. Если i или j больше, чем len(s), используйте len(s). Если i опущено или None, используйте 0. Если j опущено или None, используйте len(s). Если i больше или равно j, то срез пуст.

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

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

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

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

    • если конкатенировать объекты tuple, вместо этого расширять list

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

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

  8. index выдает ValueError, если x не найден в s. Не все реализации поддерживают передачу дополнительных аргументов i и j. Эти аргументы позволяют эффективно искать в подсекциях последовательности. Передача дополнительных аргументов примерно эквивалентна использованию s[i:j].index(x), только без копирования данных и с возвращаемым индексом относительно начала последовательности, а не начала фрагмента.

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

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

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

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

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

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

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

Операция

Результат

Примечания

s[i] = x

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

s[i:j] = t

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

del s[i:j]

то же самое, что и s[i:j] = []

s[i:j:k] = t

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

(1)

del s[i:j:k]

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

s.append(x)

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

s.clear()

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

(5)

s.copy()

создает неглубокую копию s (так же, как s[:])

(5)

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

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

s *= n

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

(6)

s.insert(i, x)

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

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

извлекает элемент в i, а также удаляет его из s

(2)

s.remove(x)

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

(3)

s.reverse()

меняет местами предметы s

(4)

Примечания:

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

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

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

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

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

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

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

Кортежи

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

class tuple([iterable])

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

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

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

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

  • Использование встроенного tuple(): tuple() или tuple(iterable).

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

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

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

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

Диапазоны

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

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

Аргументы конструктора диапазона должны быть целыми числами (либо встроенными 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.

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

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

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

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

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

start

Значение параметра start (или 0, если параметр не был предоставлен)

stop

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

step

Значение параметра step (или 1, если параметр не был предоставлен)

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

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

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

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

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

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

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

См.также

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

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

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

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

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

  • Тройное цитирование: '''Three single quotes''', """Three double quotes"""

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Строки реализуют все операции последовательности 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.

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

Возвращает кодированную версию строки в виде объекта bytes. По умолчанию кодировка 'utf-8'. Для установки другой схемы обработки ошибок можно указать errors. Значение по умолчанию для errors равно 'strict', что означает, что ошибки кодирования вызывают ошибку UnicodeError. Другие возможные значения: 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' и любое другое имя, зарегистрированное через codecs.register_error(), см. раздел Обработчики ошибок. Список возможных кодировок см. в разделе Стандартные кодировки.

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

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

Изменено в версии 3.9: Теперь ошибки проверяются в режиме разработки и в debug mode.

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

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

str.expandtabs(tabsize=8)

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

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

Возвращает наименьший индекс в строке, где подстрока sub находится в пределах фрагмента s[start:end]. Необязательные аргументы start и end интерпретируются как в нотации среза. Возвращается -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 из : c:func: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 как «Letter», т.е. те, у которых свойство общей категории является одним из «Lm», «Lt», «Lu», «Ll» или «Lo». Обратите внимание, что это отличается от свойства «Alphabetic», определенного в стандарте Unicode.

str.isascii()

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

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

str.isdecimal()

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

str.isdigit()

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

str.isidentifier()

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

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

Пример:

>>> from keyword import iskeyword

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

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

str.isnumeric()

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

str.isprintable()

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

str.isspace()

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

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

str.istitle()

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

str.isupper()

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

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

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

str.ljust(width[, fillchar])

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

str.lower()

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

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

str.lstrip([chars])

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

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

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

>>> 'Arthur: three!'.lstrip('Arthur: ')
'ee!'
>>> 'Arthur: three!'.removeprefix('Arthur: ')
'three!'
static str.maketrans(x[, y[, z]])

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

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

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

str.partition(sep)

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

str.removeprefix(prefix, /)

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

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

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

str.removesuffix(suffix, /)

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

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

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

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

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

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

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

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

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

str.rjust(width[, fillchar])

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

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

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

>>> 'Monty Python'.rstrip(' Python')
'M'
>>> 'Monty Python'.removesuffix(' Python')
'Monty'
str.split(sep=None, maxsplit=- 1)

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

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

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

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

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

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

str.title()

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

Например:

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

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

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

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

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

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

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

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

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

str.upper()

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

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

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

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

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

  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'

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

(5)

's'

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

(5)

'a'

String (преобразует любой объект 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-битные целые числа и плавающие значения двойной точности IEEE754.

Байты Объекты

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

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

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

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

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

  • Из итерации целых чисел: bytes(range(20))

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

Также см. встроенный bytes.

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

classmethod fromhex(string)

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

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

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

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

hex([sep[, bytes_per_sep]])

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

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

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

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

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

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

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

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

Объекты байтовых массивов

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

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

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

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

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

  • Из итерации целых чисел: bytearray(range(20))

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

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

Также см. встроенный bytearray.

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

classmethod fromhex(string)

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

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

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

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

hex([sep[, bytes_per_sep]])

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

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

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

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

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

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

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

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

Примечание

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

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

и:

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

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

Примечание

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

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

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

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

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

Изменено в версии 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')

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

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

Примечание

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

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

Изменено в версии 3.9: Теперь ошибки проверяются в режиме разработки и в debug mode.

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

Возвращает True, если двоичные данные заканчиваются указанным суффиксом, в противном случае возвращает False. suffix также может быть кортежем суффиксов для поиска. С необязательным 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. Если в iterable есть значения, не являющиеся TypeError, в том числе объекты 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-кортеж, содержащий часть перед разделителем, сам разделитель или его копию в байтовом массиве, и часть после разделителя. Если разделитель не найден, возвращается 3 кортеж, содержащий копию исходной последовательности, за которой следуют два пустых байта или объекта байтового массива.

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

Разделителем для поиска может быть любой 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])

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

Примечание

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

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

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

Примечание

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

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

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

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

Двоичная последовательность значений байтов для удаления может быть любой bytes-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])

Возвращает копию объекта, выровненную по правому краю в последовательности длиной width. Вставка выполняется с помощью указанного fillbyte (по умолчанию это ASCII пробел). Для объектов bytes возвращается исходная последовательность, если width меньше или равна 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, то по умолчанию удаляются пробельные символы 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, то по умолчанию удаляются пробельные символы ASCII. Аргумент chars не является префиксом или суффиксом; скорее, удаляются все комбинации его значений:

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

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

Примечание

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

Следующие методы для байтов и объектов 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 titlecase и последовательность не пуста, 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/bytearray) имеют одну уникальную встроенную операцию: оператор % (modulo). Он также известен как оператор форматирования или интерполяции байтов. Учитывая format % values (где формат - объект байтов), % спецификации преобразования в формате заменяются на ноль или более элементов значений. Эффект аналогичен использованию оператора sprintf() в языке C.

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

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

  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 - Добавление форматирования % к байтам и байтовым массивам

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

Виды памяти

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

class memoryview(object)

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

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

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

memoryview поддерживает нарезку и индексирование для раскрытия своих данных. Одномерная нарезка приведет к появлению вложенного вида:

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'

Если format является одним из собственных спецификаторов формата из модуля struct, индексация целым числом или кортежем целых чисел также поддерживается и возвращает единственный элемент с правильным типом. Одномерные представления памяти могут индексироваться целым числом или кортежем целых чисел. Многомерные представления памяти могут быть проиндексированы кортежами, состоящими ровно из ndim целых чисел, где ndim - количество измерений. Нульмерные представления памяти могут быть проиндексированы пустым кортежем.

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

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

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

>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')

Одномерные представления памяти хэшируемых (только для чтения) типов с форматами „B“, „b“ или „c“ также являются хэшируемыми. Хэш определяется как hash(m) == hash(m.tobytes()):

>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True

Изменено в версии 3.3: Одномерные представления памяти теперь можно нарезать. Одномерные представления памяти с форматами „B“, „b“ или „c“ теперь можно хэшировать.

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

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

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

__eq__(exporter)

Просмотр памяти и экспортер PEP 3118 равны, если их формы эквивалентны и если все соответствующие значения равны, когда соответствующие коды формата операндов интерпретируются с помощью синтаксиса struct.

Для подмножества форматных строк struct, поддерживаемых в настоящее время tolist(), v и w равны, если v.tolist() == w.tolist():

>>> import array
>>> a = array.array('I', [1, 2, 3, 4, 5])
>>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])
>>> c = array.array('b', [5, 3, 1])
>>> x = memoryview(a)
>>> y = memoryview(b)
>>> x == a == y == b
True
>>> x.tolist() == a.tolist() == y.tolist() == b.tolist()
True
>>> z = y[::-2]
>>> z == c
True
>>> z.tolist() == c.tolist()
True

Если одна из строк формата не поддерживается модулем struct, то объекты всегда будут сравниваться как неравные (даже если строки формата и содержимое буфера идентичны):

>>> from ctypes import BigEndianStructure, c_long
>>> class BEPoint(BigEndianStructure):
...     _fields_ = [("x", c_long), ("y", c_long)]
...
>>> point = BEPoint(100, 200)
>>> a = memoryview(point)
>>> b = memoryview(point)
>>> a == point
False
>>> a == b
False

Обратите внимание, что, как и в случае с числами с плавающей точкой, v is w не подразумевает v == w для объектов просмотра памяти.

Изменено в версии 3.3: Предыдущие версии сравнивали необработанную память без учета формата элемента и структуры логического массива.

tobytes(order=None)

Возвращает данные в буфере в виде байтовой строки. Это эквивалентно вызову конструктора 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()
[89, 98, 99]
>>> mm[0] = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> m[0] = 43
>>> mm.tolist()
[43, 98, 99]

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

release()

Освободить базовый буфер, открываемый объектом memoryview. Многие объекты предпринимают специальные действия, когда на них удерживается представление (например, bytearray временно запрещает изменение размера); поэтому вызов release() удобен для снятия этих ограничений (и освобождения висящих ресурсов) как можно скорее.

После вызова этого метода любая дальнейшая операция над представлением вызывает ошибку ValueError (кроме самой release(), которая может быть вызвана несколько раз):

>>> m = memoryview(b'abc')
>>> m.release()
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object

Для аналогичного эффекта можно использовать протокол управления контекстом, используя оператор with:

>>> with memoryview(b'abc') as m:
...     m[0]
...
97
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operation forbidden on released memoryview object

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

cast(format[, shape])

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

Формат назначения ограничен одноэлементным собственным форматом в синтаксисе struct. Один из форматов должен быть байтовым форматом („B“, „b“ или „c“). Длина байта результата должна быть равна исходной длине.

Приведение 1D/long к 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/char:

>>> b = bytearray(b'zyz')
>>> x = memoryview(b)
>>> x[0] = b'a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview: invalid value for format "B"
>>> y = x.cast('c')
>>> y[0] = b'a'
>>> b
bytearray(b'ayz')

Приведение 1D/байтов к 3D/интов к 1D/signed char:

>>> import struct
>>> buf = struct.pack("i"*12, *list(range(12)))
>>> x = memoryview(buf)
>>> y = x.cast('i', shape=[2,2,3])
>>> y.tolist()
[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
>>> y.format
'i'
>>> y.itemsize
4
>>> len(y)
2
>>> y.nbytes
48
>>> z = y.cast('b')
>>> z.format
'b'
>>> z.itemsize
1
>>> len(z)
48
>>> z.nbytes
48

Приведение 1D/unsigned long к 2D/unsigned long:

>>> buf = struct.pack("L"*6, *list(range(6)))
>>> x = memoryview(buf)
>>> y = x.cast('L', shape=[2,3])
>>> len(y)
2
>>> y.nbytes
48
>>> y.tolist()
[[0, 1, 2], [3, 4, 5]]

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

Изменено в версии 3.5: Формат источника больше не ограничивается при приведении к байтовому представлению.

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

obj

Объект, лежащий в основе представления памяти:

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

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

nbytes

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

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

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

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

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

readonly

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

format

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

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

itemsize

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

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

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

shape

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

Изменено в версии 3.3: Пустой кортеж вместо 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])

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

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

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

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

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

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

>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy({'eggs': 2, 'sausage': 1, '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.

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

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

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

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

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

Типы аннотаций — 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:

  • Если 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() на generic показывает параметризованный тип:

>>> repr(list[int])
'list[int]'

>>> str(list[int])
'list[int]'

Метод __getitem__() в общих контейнерах будет вызывать исключение, чтобы предотвратить ошибки типа dict[str][str]:

>>> dict[str][str]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: There are no type variables left in dict[str]

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

См.также

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

Знакомство с основой Python для аннотаций типов.

PEP 585 - Generics с подсказкой типа в стандартных коллекциях

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

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

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

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

Тип союза

Объект объединения хранит значение операции | (побитовое или) над несколькими type objects. Эти типы предназначены в первую очередь для type annotations. Выражение типа union позволяет использовать более чистый синтаксис подсказки типов по сравнению с 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
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])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() argument 2 cannot contain a parameterized generic

Открытый пользователем тип для объекта объединения может быть доступен из types.UnionType и использоваться для проверок isinstance(). Объект не может быть инстанцирован из типа:

>>> import types
>>> isinstance(int | str, types.UnionType)
True
>>> types.UnionType()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'types.UnionType' instances

Примечание

Метод __or__() для объектов типа был добавлен для поддержки синтаксиса X | Y. Если метакласс реализует __or__(), союз может переопределить его:

>>> class M(type):
...     def __or__(self, other):
...         return "Hello"
...
>>> class C(metaclass=M):
...     pass
...
>>> C | int
'Hello'
>>> int | C
int | __main__.C

См.также

PEP 604 – PEP, предлагающий синтаксис X | Y и тип Union.

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

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

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

Модули

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

Особым атрибутом каждого модуля является __dict__. Это словарь, содержащий таблицу символов модуля. Изменение этого словаря фактически изменит таблицу символов модуля, но прямое присвоение атрибуту __dict__ невозможно (вы можете написать m.__dict__['a'] = 1, который определяет m.a как 1, но вы не можете написать m.__dict__ = {}). Модифицировать __dict__ напрямую не рекомендуется.

Модули, встроенные в интерпретатор, записываются следующим образом: <module 'sys' (built-in)>. Если они загружены из файла, то записываются как <module 'os' from '/usr/local/lib/pythonX.Y/os.pyc'>.

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

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

Функции

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

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

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

Методы

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

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

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

>>> class C:
...     def method(self):
...         pass
...
>>> c = C()
>>> c.method.whoami = 'my name is method'  # can't set on the method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'method' object has no attribute 'whoami'
>>> c.method.__func__.whoami = 'my name is method'
>>> c.method.whoami
'my name is method'

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

Кодовые объекты

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

Доступ к __code__ вызывает auditing event object.__getattr__ с аргументами obj и "__code__".

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

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

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

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

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

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

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

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

Объект Ellipsis

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

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

Объект NotImplemented

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

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

Булевы значения

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

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

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

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

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

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

Сноски

1

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

2

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

3

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

4(1,2,3,4)

Символы в регистре - это символы, общая категория которых состоит из «Lu» (буква, верхний регистр), «Ll» (буква, нижний регистр) или «Lt» (буква, заглавный регистр).

5(1,2)

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

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