Встроенные типы
В следующих разделах описаны стандартные типы, встроенные в интерпретатор.
Основные встроенные типы — это числовые, последовательности, отображения, классы, экземпляры и исключения.
Некоторые коллекции изменяемы. Методы, которые добавляют, вычитают или переупорядочивают свои члены на месте и не возвращают конкретный элемент, никогда не возвращают сам экземпляр коллекции, а None.
Некоторые операции поддерживаются несколькими типами объектов; в частности, практически все объекты могут быть сравнены на равенство, проверены на истинность и преобразованы в строку (с помощью функции repr() или немного отличающейся функции str()). Последняя функция используется неявно, когда объект записывается функцией print().
Проверка истинности
Любой объект может быть проверен на истинность для использования в if или while условии или в качестве операнда нижеприведённых булевых операций.
По умолчанию объект считается истинным, если его класс не определяет метод __bool__(), возвращающий False, или метод __len__(), возвращающий ноль, при вызове с объектом. [1] Вот большинство встроенных объектов, считающихся ложными:
- константы, определённые как ложные:
NoneиFalse - ноль любого числового типа:
0,0.0,0j,Decimal(0),Fraction(0, 1) - пустые последовательности и коллекции:
'',(),[],{},set(),range(0)
Операции и встроенные функции, имеющие булевый результат, всегда возвращают 0 или False для ложного и 1 или True для истинного, если не указано иное. (Важное исключение: булевые операции or и and всегда возвращают один из своих операндов.)
Булевы операции — and, or, not
Это булевы операции, упорядоченные по возрастанию приоритета:
Операция | Результат | Примечания |
|---|---|---|
| если x истинно, то x, иначе y | (1) |
| если x ложно, то x, иначе y | (2) |
| если x ложно, то | (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. Операторы <, <=, > и >= определены только там, где это имеет смысл; например, они генерируют исключение TypeError, когда один из аргументов — комплексное число.
Нетождественные экземпляры класса обычно сравниваются как неравные, если класс не определяет метод __eq__().
Экземпляры класса нельзя упорядочить относительно других экземпляров того же класса или других типов объектов, если класс не определяет достаточно методов __lt__(), __le__(), __gt__() и __ge__() (в общем случае, __lt__() и __eq__() достаточно, если вы хотите получить обычные значения операторов сравнения).
Поведение операторов is и is not нельзя настроить; кроме того, они могут быть применены к любым двум объектам и никогда не генерируют исключение.
Ещё две операции с тем же синтаксическим приоритетом, in и not in, поддерживаются типами, которые являются итерируемыми или реализуют метод __contains__().
Числовые типы — int, float, complex
Существуют три различных числовых типа: целые числа, числа с плавающей точкой и комплексные числа. Кроме того, булевы значения являются подтипом целых чисел. Целые числа имеют неограниченную точность. Числа с плавающей точкой обычно реализуются с использованием double в C; информация о точности и внутренней форме представления чисел с плавающей точкой для машины, на которой выполняется ваша программа, доступна в sys.float_info. Комплексные числа имеют вещественную и мнимую части, каждая из которых является числом с плавающей точкой. Чтобы извлечь эти части из комплексного числа z, используйте z.real и z.imag. (В стандартной библиотеке есть дополнительные числовые типы fractions.Fraction для рациональных чисел и decimal.Decimal для чисел с плавающей точкой с определяемой пользователем точностью.)
Числа создаются с помощью числовых литералов или в результате работы встроенных функций и операторов. Числовые литералы без каких-либо дополнительных обозначений (включая шестнадцатеричные, восьмеричные и двоичные числа) дают целые числа. Числовые литералы, содержащие десятичную точку или знак экспоненты, дают числа с плавающей точкой. При добавлении 'j' или 'J' к числовому литералу получается мнимое число (комплексное число с нулевой вещественной частью), которое можно добавить к целому числу или числу с плавающей точкой, чтобы получить комплексное число с вещественной и мнимой частями.
Python полностью поддерживает смешанную арифметику: когда бинарный арифметический оператор имеет операнды различных числовых типов, операнд с «более узким» типом расширяется до типа другого операнда, где целое число является более узким типом, чем число с плавающей точкой, которое, в свою очередь, более узкое, чем комплексное число. Сравнение чисел разных типов происходит так, как будто сравниваются точные значения этих чисел. [2]
Конструкторы int(), float() и complex() могут использоваться для получения чисел определенного типа.
Все числовые типы (кроме комплексных) поддерживают следующие операции (для приоритетов операций см. Приоритет операторов):
Операция | Результат | Примечания | Полное описание |
|---|---|---|---|
| сумма x и y | ||
| разность x и y | ||
| произведение x и y | ||
| частное от деления x на y | ||
| целая часть частного от деления x на y | (1)(2) | |
| остаток от деления | (2) | |
| отрицание x | ||
| x без изменений | ||
| модуль или величина x | ||
| x, преобразованное в целое число | (3)(6) | |
| x, преобразованное в число с плавающей точкой | (4)(6) | |
| комплексное число с вещественной частью re, мнимой частью im. im по умолчанию равно нулю. | (6) | |
| сопряженное комплексное число c | ||
| пара | (2) | |
| x в степени y | (5) | |
| x в степени y | (5) |
Примечания:
- Также называется целочисленным делением. Для операндов типа
int, результат имеет типint. Для операндов типаfloat, результат имеет типfloat. В общем случае, результат — целое число, хотя тип результата необязательноint. Результат всегда округляется к минус бесконечности:1//2равно0,(-1)//2равно-1,1//(-2)равно-1, и(-1)//(-2)равно0. - Не для комплексных чисел. Вместо этого преобразуйте в числа с плавающей точкой, используя
abs(), если это необходимо. - Преобразование из
floatвintусекает, отбрасывая дробную часть. Смотрите функцииmath.floor()иmath.ceil()для альтернативных преобразований. - float также принимает строки «nan» и «inf» с необязательным префиксом «+» или «-» для неопределенных значений (NaN) и положительной или отрицательной бесконечности.
- Python определяет
pow(0, 0)и0 ** 0как1, как это обычно бывает в языках программирования. -
Принимаемые числовые литералы включают цифры от
0до9или любой эквивалент Unicode (кодовые точки сNdсвойством).См. стандарт Unicode для полного списка кодовых точек с
Ndсвойством.
Все типы numbers.Real (int и float) также включают следующие операции:
Операция | Результат |
|---|---|
x, усеченное до | |
x, округленное до n знаков, при округлении половин до ближайшего чётного. Если n опущено, по умолчанию оно равно 0. | |
наибольшее | |
наименьшее |
Дополнительные числовые операции см. в модулях math и cmath.
Битовые операции над целочисленными типами
Битовые операции имеют смысл только для целых чисел. Результат битовых операций вычисляется так, как будто они выполняются в дополнении до двух с бесконечным числом знаковых битов.
Приоритеты битовых операций над целыми числами ниже, чем у арифметических операций и выше, чем у сравнений; унарная операция ~ имеет тот же приоритет, что и другие унарные арифметические операции (+ и -).
В этой таблице битовые операции упорядочены по возрастанию приоритета:
Операция | Результат | Примечания |
|---|---|---|
| битовое или от x и y | (4) |
| битовое исключающее или от x и y | (4) |
| битовое и от x и y | (4) |
| x сдвинут влево на n бит | (1)(2) |
| x сдвинут вправо на n бит | (1)(3) |
| биты x инвертированы |
Примечания:
- Отрицательные сдвиги недопустимы и приводят к исключению
ValueError. - Сдвиг влево на n бит эквивалентен умножению на
pow(2, n). - Сдвиг вправо на n бит эквивалентен целочисленному делению на
pow(2, n). - Выполнение этих вычислений с по крайней мере одним дополнительным знаковым битом расширения в конечном представлении дополнения до двух (разрядность
1 + max(x.bit_length(), y.bit_length())или более) достаточно для получения того же результата, что и при бесконечном числе знаковых битов.
Дополнительные методы для целочисленных типов
Тип int реализует numbers.Integral абстрактный базовый класс. Кроме того, он предоставляет несколько дополнительных методов:
-
int.bit_length() -
Возвращает количество бит, необходимых для представления целого числа в двоичном формате, исключая знак и ведущие нули:
>>> n = -37 >>> bin(n) '-0b100101' >>> n.bit_length() 6
Точнее, если
xотлично от нуля, тоx.bit_length()— единственное положительное целое числоkтакое, что2**(k-1) <= abs(x) < 2**k. Эквивалентно, когдаabs(x)достаточно мало, чтобы иметь правильно округленный логарифм, тоk = 1 + int(log(abs(x), 2)). Еслиxравно нулю, тоx.bit_length()возвращает0.Эквивалентно:
def bit_length(self): s = bin(self) # binary representation: bin(-37) --> '-0b100101' s = s.lstrip('-0b') # remove leading zeros and minus sign return len(s) # len('100101') --> 6Добавлен в версии 3.1.
-
int.bit_count() -
Возвращает количество единиц в двоичном представлении абсолютного значения целого числа. Это также известно как количество единиц. Пример:
>>> n = 19 >>> bin(n) '0b10011' >>> n.bit_count() 3 >>> (-n).bit_count() 3
Эквивалентно:
def bit_count(self): return bin(self).count("1")Добавлен в версии 3.10.
-
int.to_bytes(length=1, byteorder='big', *, signed=False) -
Возвращает массив байтов, представляющий целое число.
>>> (1024).to_bytes(2, byteorder='big') b'\x04\x00' >>> (1024).to_bytes(10, byteorder='big') b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' >>> (-1024).to_bytes(10, byteorder='big', signed=True) b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' >>> x = 1000 >>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little') b'\xe8\x03'
Целое число представляется с помощью length байтов, по умолчанию 1. Если целое число не может быть представлено заданным числом байтов, то генерируется исключение
OverflowError.Аргумент byteorder определяет порядок байтов, используемый для представления целого числа, по умолчанию
"big". Если byteorder равен"big", то наиболее значимый байт находится в начале массива байтов. Если byteorder равен"little", то наиболее значимый байт находится в конце массива байтов.Аргумент signed определяет, используется ли дополнительное представление до двух для представления целого числа. Если signed равно
Falseи задано отрицательное целое число, то генерируется исключениеOverflowError. Значение по умолчанию для signed равноFalse.Значения по умолчанию можно использовать для удобного преобразования целого числа в объект одного байта:
>>> (65).to_bytes() b'A'
Однако, при использовании аргументов по умолчанию не пытайтесь преобразовать значение больше 255, иначе получите исключение
OverflowError.Эквивалентно:
def to_bytes(n, length=1, byteorder='big', signed=False): if byteorder == 'little': order = range(length) elif byteorder == 'big': order = reversed(range(length)) else: raise ValueError("byteorder must be either 'little' or 'big'") return bytes((n >> i*8) & 0xff for i in order)Добавлен в версии 3.2.
Изменено в версии 3.11: Добавлены значения аргументов по умолчанию для
lengthиbyteorder.
-
classmethod int.from_bytes(bytes, byteorder='big', *, signed=False) -
Возвращает целое число, представленное данным массивом байтов.
>>> int.from_bytes(b'\x00\x10', byteorder='big') 16 >>> int.from_bytes(b'\x00\x10', byteorder='little') 4096 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) -1024 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False) 64512 >>> int.from_bytes([255, 0, 0], byteorder='big') 16711680
Аргумент bytes должен быть объектом-подобием байтов или итерируемым объектом, производящим байты.
Аргумент byteorder определяет порядок байтов, используемый для представления целого числа, по умолчанию
"big". Если byteorder равен"big", то наиболее значимый байт находится в начале массива байтов. Если byteorder равен"little", то наиболее значимый байт находится в конце массива байтов. Для запроса родного порядка байтов целевой системы используйте значениеsys.byteorder.Аргумент signed указывает, используется ли дополнительное представление до двух для представления целого числа.
Эквивалентно:
def from_bytes(bytes, byteorder='big', signed=False): if byteorder == 'little': little_ordered = list(bytes) elif byteorder == 'big': little_ordered = list(reversed(bytes)) else: raise ValueError("byteorder must be either 'little' or 'big'") n = sum(b << i*8 for i, b in enumerate(little_ordered)) if signed and little_ordered and (little_ordered[-1] & 0x80): n -= 1 << 8*len(little_ordered) return nДобавлен в версии 3.2.
Изменено в версии 3.11: Добавлено значение аргумента по умолчанию для
byteorder.
-
int.as_integer_ratio() -
Возвращает пару целых чисел, отношение которых равно исходному целому числу и имеет положительный знаменатель. Целое отношение целых чисел всегда имеет целое число в качестве числителя и
1в качестве знаменателя.Добавлен в версии 3.8.
-
int.is_integer() -
Возвращает
True. Существует для совместимости сfloat.is_integer().Добавлен в версии 3.12.
Дополнительные методы для типа Float
Тип float реализует абстрактный базовый класс numbers.Real. float также имеет следующие дополнительные методы.
-
float.as_integer_ratio() -
Возвращает пару целых чисел, отношение которых точно равно исходному числу с плавающей запятой. Отношение приведено к наименьшим членам, и знаменатель является положительным. Вызывает исключение
OverflowErrorдля бесконечных значений иValueErrorдля NaN.
-
float.is_integer() -
Возвращает
Trueесли экземпляр float является конечным с целым значением, иFalseв противном случае:>>> (-2.0).is_integer() True >>> (3.2).is_integer() False
Два метода поддерживают преобразование в и из шестнадцатеричных строк. Поскольку числа с плавающей запятой в Python хранятся внутри как двоичные числа, преобразование числа с плавающей запятой в или из десятичной строки обычно приводит к небольшой ошибке округления. В отличие от этого, шестнадцатеричные строки позволяют точное представление и указание чисел с плавающей запятой. Это может быть полезно при отладке и при работе с числами.
-
float.hex() -
Возвращает представление числа с плавающей запятой в виде шестнадцатеричной строки. Для конечных чисел с плавающей запятой это представление всегда включает ведущий
0xи заключительныйpи показатель степени.
-
classmethod float.fromhex(s) -
Метод класса, возвращающий число с плавающей запятой, представленное шестнадцатеричной строкой s. Строка s может содержать начальные и конечные пробелы.
Обратите внимание, что float.hex() — метод экземпляра, а float.fromhex() — метод класса.
Шестнадцатеричная строка имеет вид:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
где необязательный sign может быть либо + или -, integer и fraction — строки шестнадцатеричных цифр, а exponent — десятичное целое число с необязательным ведущим знаком. Регистр не имеет значения, и в целой или дробной части должно быть как минимум одна шестнадцатеричная цифра. Этот синтаксис похож на синтаксис, указанный в разделе 6.4.4.2 стандарта C99, а также на синтаксис, используемый в Java 1.5 и выше. В частности, вывод float.hex() может использоваться в качестве шестнадцатеричной десятичной константы в коде C или Java, а шестнадцатеричные строки, полученные с помощью символа формата %a C или Double.toHexString Java, принимаются float.fromhex().
Обратите внимание, что показатель степени записывается в десятичной, а не в шестнадцатеричной системе счисления, и он задает степень 2, на которую необходимо умножить коэффициент. Например, шестнадцатеричная строка 0x3.a7p10 представляет число с плавающей запятой (3 + 10./16 + 7./16**2) * 2.0**10, или 3740.0.
>>> float.fromhex('0x3.a7p10')
3740.0
Применение обратного преобразования к 3740.0 даёт другую шестнадцатеричную строку, представляющую то же самое число:
>>> float.hex(3740.0) '0x1.d380000000000p+11'
Хэширование числовых типов
Для чисел x и y, возможно, разных типов, требуется, чтобы hash(x) == hash(y) всякий раз, когда x == y (см. документацию метода __hash__() для получения дополнительной информации). Для удобства реализации и повышения эффективности для различных числовых типов (включая int, float, decimal.Decimal и fractions.Fraction) хэш Python для числовых типов основан на одной математической функции, которая определена для любого рационального числа и, следовательно, применима ко всем экземплярам int и fractions.Fraction, и ко всем конечным экземплярам float и decimal.Decimal. По существу, эта функция задаётся приведением по модулю P для фиксированного простого числа P. Значение P доступно в Python как атрибут modulus объекта sys.hash_info.
Подробность реализации CPython: В настоящее время используемое простое число равно P = 2**31 - 1 на машинах с 32-битными C-целыми числами и P = 2**61 - 1 на машинах с 64-битными C-целыми числами.
Ниже приведены правила в деталях:
- Если
x = m / n— неотрицательное рациональное число иnне делится наP, определитеhash(x)какm * invmod(n, P) % P, гдеinvmod(n, P)задаёт обратное значениеnпо модулюP. - Если
x = m / n— неотрицательное рациональное число иnделится наP(ноmне делится), тогда уnнет обратного по модулюP, и приведённое выше правило не применяется; в этом случае определитеhash(x)как постоянное значениеsys.hash_info.inf. - Если
x = m / n— отрицательное рациональное число, определитеhash(x)как-hash(-x). Если полученный хэш равен-1, замените его на-2. - Конкретные значения
sys.hash_info.infи-sys.hash_info.infиспользуются как значения хэшей для положительной или отрицательной бесконечности (соответственно). - Для числа с комплексными значениями
complexz, значения хэшей действительной и мнимой части объединяются путём вычисления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
Тип Булевых значений - bool
Булевы значения представляют логические значения истинности. Тип bool имеет ровно два константных значения: True и False.
Встроенная функция bool() преобразует любое значение в булево, если значение может быть интерпретировано как логическое значение (см. раздел Проверка логической истинности выше).
Для логических операций используйте логические операторы булевы операторы and, or и not . При применении побитовых операторов &, |, ^ к двум булевым значениям, они возвращают булево значение, эквивалентное логическим операциям «и», «или», «исключающее или». Однако, логические операторы and, or и != следует предпочитать &, | и ^.
Устарело начиная с версии 3.12: Использование побитового оператора инверсии ~ устарело и будет вызывать ошибку в Python 3.14.
bool является подклассом int (см. Числовые типы — int, float, complex). Во многих числовых контекстах False и True ведут себя как целые числа 0 и 1 соответственно. Однако, полагаться на это не рекомендуется; используйте явное преобразование с помощью int() вместо этого.
Типы итераторов
Python поддерживает концепцию итерации по контейнерам. Это реализуется с помощью двух различных методов; они используются для поддержки итерации пользовательских классов. Последовательности, описанные ниже подробнее, всегда поддерживают методы итерации.
Для обеспечения поддержки итерируемых объектов необходимо определить один метод:
-
container.__iter__() -
Возвращает объект итератора. Объект должен поддерживать протокол итератора, описанный ниже. Если контейнер поддерживает разные типы итерации, можно предоставить дополнительные методы для конкретного запроса итераторов для этих типов итерации. (Пример объекта, поддерживающего несколько форм итерации, — это структура дерева, которая поддерживает как обход в ширину, так и обход в глубину.) Этот метод соответствует слоту
tp_iterструктуры типа для объектов Python в Python/C API.
Сами объекты итераторов должны поддерживать следующие два метода, которые вместе образуют протокол итератора:
-
iterator.__iter__() -
Возвращает сам объект итератора. Это необходимо, чтобы контейнеры и итераторы можно было использовать со операторами
forиin. Этот метод соответствует слотуtp_iterструктуры типа для объектов Python в Python/C API.
-
iterator.__next__() -
Возвращает следующий элемент из итератора. Если больше элементов нет, поднимается исключение
StopIteration. Этот метод соответствует слотуtp_iternextструктуры типа для объектов Python в Python/C API.
Python определяет несколько объектов итераторов для поддержки итерации по общим и специфичным типам последовательностей, словарям и другим более специализированным формам. Конкретные типы не важны, кроме их реализации протокола итератора.
После того, как метод __next__() итератора вызывает исключение StopIteration, он должен продолжать делать это при последующих вызовах. Реализации, которые не подчиняются этому свойству, считаются неработоспособными.
Типы генераторов
Генераторы Python предоставляют удобный способ реализации протокола итератора. Если метод __iter__() объекта контейнера реализован как генератор, он автоматически возвращает объект итератора (технически, объект генератора), предоставляющий методы __iter__() и __next__(). Более подробную информацию о генераторах можно найти в документации по выражению yield.
Типы последовательностей — список, кортеж, диапазон
Существует три основных типа последовательностей: списки, кортежи и объекты диапазона. Дополнительные типы последовательностей, предназначенные для обработки бинарных данных и строк текста, описаны в отдельных разделах.
Общие операции с последовательностями
Операции в следующей таблице поддерживаются большинством типов последовательностей, как изменяемых, так и неизменяемых. ABC collections.abc.Sequence обеспечивает более лёгкую реализацию этих операций на пользовательских типах последовательностей.
В этой таблице операции упорядочены по возрастанию приоритета. В таблице, s и t — последовательности одного типа, n, i, j и k — целые числа, а x — произвольный объект, который соответствует любым ограничениям типа и значения, накладываемым на s.
Операции in и not in имеют тот же приоритет, что и операции сравнения. Операции + (конкатенация) и * (повторение) имеют тот же приоритет, что и соответствующие числовые операции. [3]
Операция | Результат | Примечания |
|---|---|---|
|
| (1) |
|
| (1) |
| конкатенация s и t | (6)(7) |
| эквивалентно добавлению s к самому себе n раз | (2)(7) |
| i-й элемент s, начало с 0 | (3) |
| срез s с i по j | (3)(4) |
| срез s с i по j с шагом k | (3)(5) |
| длина s | |
| наименьший элемент s | |
| наибольший элемент s | |
| индекс первого вхождения x в s (в или после индекса i и перед индексом j) | (8) |
| общее количество вхождений x в s |
Последовательности одного типа также поддерживают сравнения. В частности, кортежи и списки сравниваются лексикографически путем сравнения соответствующих элементов. Это означает, что для равенства каждый элемент должен быть равным, а две последовательности должны быть одного типа и иметь одинаковую длину. (Полные детали см. в Сравнениях в справочнике языка.)
Прямые и обратные итераторы над изменяемыми последовательностями обращаются к значениям с помощью индекса. Этот индекс будет продолжать движение вперед (или назад) даже если основная последовательность изменяется. Итератор завершается только при появлении IndexError или StopIteration (или когда индекс опускается ниже нуля).
Примечания:
-
Хотя операции
inиnot inиспользуются только для простого тестирования наличия в общем случае, некоторые специализированные последовательности (например,str,bytesиbytearray) также используют их для тестирования подпоследовательностей:>>> "gg" in "eggs" True
-
Значения 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 Как создать многомерный список?.
- Если i или j отрицательные, индекс относится к концу последовательности s:
len(s) + iилиlen(s) + jзаменяется. Но обратите внимание, что-0всё равно0. - Срез s с i по j определяется как последовательность элементов с индексом k, таким что
i <= k < j. Если i или j большеlen(s), используйтеlen(s). Если i пропущено илиNone, используйте0. Если j пропущено илиNone, используйтеlen(s). Если i больше или равно j, срез пустой. - Срез 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 не может быть нулём. Если kNone, он обрабатывается как1. -
Конкатенация неизменяемых последовательностей всегда приводит к новому объекту. Это означает, что создание последовательности путем многократного конкатенирования имеет квадратическую временную сложность по общей длине последовательности. Чтобы получить линейную временную сложность, необходимо перейти к одному из следующих вариантов:
- если конкатенируются объекты
str, можно создать список и использоватьstr.join()в конце или же записывать в экземплярio.StringIOи извлекать его значение по завершении - если конкатенируются объекты
bytes, аналогично можно использоватьbytes.join()илиio.BytesIO, или можно выполнить конкатенацию на месте с объектомbytearray. Объектыbytearrayизменяемые и имеют эффективный механизм перераспределения памяти - если конкатенируются объекты
tuple, расширитьlistвместо этого - для других типов, обратитесь к документации соответствующего класса
- если конкатенируются объекты
- Некоторые типы последовательностей (например,
range) поддерживают только последовательности элементов, которые следуют определенным шаблонам, и поэтому не поддерживают конкатенацию или повторение последовательностей. -
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).
Операция | Результат | Примечания |
|---|---|---|
| Элемент i последовательности s заменяется на x | |
| Срез последовательности s с i по j заменяется содержимым итерируемого объекта t | |
| То же, что и | |
| Элементы | (1) |
| Удаляет элементы | |
| Добавляет x в конец последовательности (то же, что и | |
| Удаляет все элементы из s (то же, что и | (5) |
| Создает поверхностную копию s (то же, что и | (5) |
| Расширяет s содержимым t (в основном то же, что и | |
| Обновляет s с его содержимым, повторённым n раз | (6) |
| Вставляет x в s по индексу i (то же, что и | |
| Возвращает элемент по индексу i и удаляет его из s | (2) |
| Удаляет первый элемент из s, где | (3) |
| Изменяет порядок элементов в s | (4) |
Примечания:
- Если k не равно
1, t должен иметь такую же длину, как срез, который он заменяет. - Необязательный аргумент i по умолчанию равен
-1, поэтому по умолчанию удаляется и возвращается последний элемент. -
remove()вызываетValueError, если x не найден в s. - Метод
reverse()изменяет последовательность на месте для экономии памяти при переворачивании большой последовательности. Для напоминания пользователям о том, что он работает со побочным эффектом, он не возвращает перевернутую последовательность. -
clear()иcopy()включены для согласованности с интерфейсами изменяемых контейнеров, которые не поддерживают операции срезов (например,dictиset).copy()не является частью ABCcollections.abc.MutableSequence, но большинство конкретных изменяемых классов последовательностей его предоставляют.Добавлена в версии 3.3:
clear()иcopy()методы. - Значение n — целое число или объект, реализующий
__index__(). Нулевые и отрицательные значения n очищают последовательность. Элементы последовательности не копируются; они ссылаются несколько раз, как описано дляs * nв разделе Общие операции с последовательностями.
Списки
Списки — это изменяемые последовательности, обычно используемые для хранения коллекций однородных элементов (где точная степень сходства будет меняться в зависимости от приложения).
-
class list([iterable]) -
Списки можно создать несколькими способами:
- Используя пару квадратных скобок для обозначения пустого списка:
[] - Используя квадратные скобки, разделяя элементы запятыми:
[a],[a, b, c] - Используя генератор списков:
[x for x in iterable] - Используя конструктор типа:
list()илиlist(iterable)
Конструктор создаёт список, элементы которого такие же и в том же порядке, что и элементы iterable. iterable может быть последовательностью, контейнером, поддерживающим итерацию, или объектом-итератором. Если iterable уже является списком, создаётся копия и возвращается, аналогично
iterable[:]. Например,list('abc')возвращает['a', 'b', 'c']иlist( (1, 2, 3) )возвращает[1, 2, 3]. Если аргумент не указан, конструктор создаёт новый пустой список[].Многие другие операции также создают списки, включая встроенную
sorted().Списки реализуют все общие и изменяемые операции с последовательностями. Списки также предоставляют следующий дополнительный метод:
-
sort(*, key=None, reverse=False) -
Этот метод сортирует список на месте, используя только сравнения между элементами. Исключение не подавляется — если какая-либо операция сравнения завершится ошибкой, вся операция сортировки завершится ошибкой (и список, вероятно, останется в частично изменённом состоянии).
sort()принимает два аргумента, которые могут быть переданы только по ключевому слову (аргументы только по ключевому слову):key задаёт функцию одного аргумента, используемую для извлечения ключа сравнения из каждого элемента списка (например,
key=str.lower). Ключ, соответствующий каждому элементу в списке, вычисляется один раз и затем используется для всего процесса сортировки. Значение по умолчаниюNoneозначает, что элементы списка сортируются непосредственно без вычисления отдельного значения ключа.Утилита
functools.cmp_to_key()доступна для преобразования функции сравнения стиля 2.x в функцию key.reverse — логическое значение. Если установлено в
True, то элементы списка сортируются так, как будто каждое сравнение было обращено.Этот метод изменяет последовательность на месте для экономии памяти при сортировке большой последовательности. Для напоминания пользователям о том, что он работает со побочным эффектом, он не возвращает отсортированную последовательность (используйте
sorted()для явного запроса нового экземпляра отсортированного списка).Метод
sort()гарантированно стабилен. Сортировка стабильна, если она гарантирует, что не будет изменять относительный порядок элементов, которые сравниваются как равные — это полезно для сортировки в несколько проходов (например, сортировка по отделу, затем по уровню зарплаты).Примеры сортировки и краткий учебник по сортировке см. в разделе Методы сортировки.
Подробность реализации CPython: Пока список сортируется, влияние попытки изменить или даже проверить список неопределённо. Реализация 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))— это вызов функции с 3-кортежем в качестве единственного аргумента.Кортежи реализуют все операции над общими последовательностями.
- Используя пару круглых скобок для обозначения пустого кортежа:
Для гетерогенных коллекций данных, где доступ по имени понятнее, чем доступ по индексу, collections.namedtuple() может быть более подходящим выбором, чем обычный кортеж.
Диапазоны
Тип range представляет неизменяемую последовательность чисел и часто используется для циклов определённого количества раз в циклах for.
-
class range(stop) - class range(start, stop[, step])
-
Аргументы конструктора range должны быть целыми числами (встроенные
intили любые объекты, реализующие специальный метод__index__()). Если аргумент step опущен, он по умолчанию равен1. Если аргумент start опущен, он по умолчанию равен0. Если step равен нулю, генерируется исключениеValueError.Для положительного step, содержимое диапазона
rопределяется формулойr[i] = start + step*iгдеi >= 0иr[i] < stop.Для отрицательного step, содержимое диапазона все еще определяется формулой
r[i] = start + step*i, но ограничения —i >= 0иr[i] > stop.Объект диапазона будет пустым, если
r[0]не удовлетворяет ограничению. Диапазоны поддерживают отрицательные индексы, но они интерпретируются как индексация с конца последовательности, определенной положительными индексами.Диапазоны, содержащие абсолютные значения, большие, чем
sys.maxsize, допустимы, но некоторые функции (например,len()) могут генерироватьOverflowError.Примеры диапазонов:
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []
Диапазоны реализуют все общие операции над последовательностями, за исключением конкатенации и повторения (поскольку объекты диапазона могут представлять только последовательности, следующие строгому шаблону, а повторение и конкатенация обычно нарушают этот шаблон).
-
start -
Значение параметра start (или
0если параметр не указан)
-
stop -
Значение параметра stop
-
step -
Значение параметра step (или
1если параметр не указан)
-
Преимущества использования типа range по сравнению с обычным списком list или кортежем tuple заключаются в том, что объект range всегда занимает одинаковое (малое) количество памяти, независимо от размера представляемого им диапазона (так как он хранит только значения start, stop и step, рассчитывая отдельные элементы и поддиапазоны по мере необходимости).
Объекты диапазона реализуют ABC collections.abc.Sequence и предоставляют такие функции, как проверка наличия элементов, поиск индекса элементов, использование срезов и поддержка отрицательных индексов (см. Типы последовательностей — list, tuple, range):
>>> r = range(0, 20, 2) >>> r range(0, 20, 2) >>> 11 in r False >>> 10 in r True >>> r.index(10) 5 >>> r[5] 10 >>> r[:5] range(0, 10, 2) >>> r[-1] 18
Проверка равенства объектов диапазона с == и != сравнивает их как последовательности. То есть два объекта диапазона считаются равными, если они представляют одну и ту же последовательность значений. (Обратите внимание, что два объекта диапазона, которые сравниваются как равные, могут иметь разные атрибуты start, stop и step, например range(0) == range(2, 1, 3) или range(0, 3, 2) == range(0, 4, 2).)
Изменено в версии 3.2: Реализует ABC Sequence. Поддержка срезов и отрицательных индексов. Проверка на членство объектов int в постоянное время вместо итерации по всем элементам.
Изменено в версии 3.3: Определяет операторы ‘==’ и ‘!=’ для сравнения объектов диапазона на основе последовательности значений, которые они определяют (а не на основе идентичности объекта).
См. также
- Рецепт linspace демонстрирует, как реализовать ленивую версию range, подходящую для приложений с плавающей точкой.
Тип последовательности текста — str
Текстовые данные в Python обрабатываются с помощью объектов str, или строками. Строки являются неизменяемыми последовательностями кодовых точек Юникода. Литералы строк записываются различными способами:
- Одинарные кавычки:
'allows embedded "double" quotes' - Двойные кавычки:
"allows embedded 'single' quotes" - Тройные кавычки:
'''Three single quotes''',"""Three double quotes"""
Строки в тройных кавычках могут занимать несколько строк — все связанные пробелы будут включены в литерал строки.
Литералы строк, которые являются частью одного выражения и имеют только пробелы между ними, будут неявно преобразованы в один литерал строки. То есть, ("spam " "eggs") == "spam eggs".
См. Литералы строк и байтов для получения дополнительной информации о различных формах литералов строк, включая поддерживаемые последовательности escape, и префикс r («сырой»), который отключает обработку большинства последовательностей escape.
Строки также могут быть созданы из других объектов, используя конструктор str.
Поскольку нет отдельного типа «символ», индексирование строки возвращает строки длины 1. То есть, для непустой строки s, s[0] == s[0:1].
Также нет изменяемого типа строки, но str.join() или io.StringIO можно использовать для эффективного построения строк из нескольких фрагментов.
Изменено в версии 3.3: Для обратной совместимости с Python 2, префикс u снова разрешен в литералах строк. Он не влияет на значение литералов строк и не может быть объединён с префиксом r.
-
class str(object='') - class str(object=b'', encoding='utf-8', errors='strict')
-
Возвращает строковую версию object. Если object не задан, возвращает пустую строку. В противном случае поведение
str()зависит от того, заданы ли encoding или errors, как показано ниже.Если ни encoding, ни errors не заданы,
str(object)возвращаетtype(object).__str__(object), что представляет собой «неофициальное» или красиво напечатанное строковое представление object. Для строковых объектов это сама строка. Если у object нет метода__str__(), тоstr()возвращаетrepr(object).Если хотя бы один из encoding или errors задан, object должен быть объектом типа bytes-подобный объект (например,
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 и раздел Методы строк ниже. Для вывода форматированных строк см. разделы f-строки и Синтаксис форматирования строк. Кроме того, см. раздел Услуги обработки текста.
Методы строк
Строки реализуют все общие операции со последовательностями, а также дополнительные методы, описанные ниже.
Строки также поддерживают два стиля форматирования строк: один обеспечивает большой объем гибкости и настройки (см. str.format(), Синтаксис форматирования строк и Настраиваемое форматирование строк) а другой основан на форматировании в стиле C printf обрабатывает более узкий диапазон типов и немного сложнее использовать правильно, но часто быстрее для тех случаев, когда он применим (Форматирование строк в стиле printf).
Раздел Службы обработки текста стандартной библиотеки охватывает ряд других модулей, которые предоставляют различные утилиты для работы с текстом (включая поддержку регулярных выражений в модуле re).
-
str.capitalize() -
Возвращает копию строки с заглавной первой буквой и остальными строчными.
Изменено в версии 3.8: Первая буква теперь приводится к стилю заглавной буквы, а не к верхнему регистру. Это означает, что такие символы, как диграфы, будут иметь только первую букву заглавной, а не весь символ.
-
str.casefold() -
Возвращает копию строки с приведенным к нижнему регистру регистром. Строки с приведенным к нижнему регистру регистром могут использоваться для сопоставления без учета регистра.
Приведение к нижнему регистру аналогично приведению к строчным буквам, но более агрессивно, поскольку оно предназначено для удаления всех различий в регистре в строке. Например, немецкая строчная буква
'ß'эквивалентна"ss". Поскольку она уже строчная,lower()ничего не изменит для'ß';casefold()преобразует ее в"ss".Алгоритм приведения к нижнему регистру описан в разделе 3.13 «По умолчанию Приведение к нижнему регистру» стандарта Юникод.
Добавлен в версии 3.3.
-
str.center(width[, fillchar]) -
Возвращает строку, центрированную в строке длиной width. Выравнивание выполняется с помощью указанного fillchar (по умолчанию ASCII пробел). Исходная строка возвращается, если width меньше или равно
len(s).
-
str.count(sub[, start[, end]]) -
Возвращает количество неперекрывающихся вхождений подстроки sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются так же, как в нотации срезов.
Если sub пуста, возвращает количество пустых строк между символами, что равно длине строки плюс один.
-
str.encode(encoding='utf-8', errors='strict') -
Возвращает строку, закодированную в
bytes.encoding по умолчанию
'utf-8'; см. Стандартные кодировки для возможных значений.errors управляет обработкой ошибок кодирования. Если
'strict'(по умолчанию), генерируется исключениеUnicodeError. Другие возможные значения -'ignore','replace','xmlcharrefreplace','backslashreplace'и любое другое имя, зарегистрированное черезcodecs.register_error(). Смотрите Обработчики ошибок для получения подробностей.Для повышения производительности значение errors не проверяется на корректность, если не происходит ошибка кодирования, включен режим разработки Python Режим разработки Python или используется отладочная сборка.
Изменено в версии 3.1: Добавлена поддержка ключевых аргументов.
Изменено в версии 3.9: Значение аргумента errors теперь проверяется в режиме разработки Python Режим разработки Python и в отладочном режиме.
-
str.endswith(suffix[, start[, end]]) -
Возвращает
True, если строка заканчивается указанным suffix, в противном случае возвращаетFalse. suffix также может быть кортежем искомых суффиксов. С необязательным start, проверка начинается с этой позиции. С необязательным end, сравнение прекращается в этой позиции.
-
str.expandtabs(tabsize=8) -
Возвращает копию строки, где все символы табуляции заменены одним или несколькими пробелами, в зависимости от текущей колонки и заданного размера табуляции. Позиции табуляции появляются через каждые tabsize символов (по умолчанию 8, что задает позиции табуляции в колонках 0, 8, 16 и так далее). Для расширения строки текущая колонка устанавливается в ноль, и строка проверяется символ за символом. Если символ — табуляция (
\t), в результате вставляется один или несколько пробелов, пока текущая колонка не станет равной следующей позиции табуляции. (Сам символ табуляции не копируется.) Если символ — перевод строки (\n) или возврат (\r), он копируется, и текущая колонка сбрасывается до нуля. Любой другой символ копируется без изменений, и текущая колонка увеличивается на единицу, независимо от того, как символ отображается при печати.>>> '01\t012\t0123\t01234'.expandtabs() '01 012 0123 01234' >>> '01\t012\t0123\t01234'.expandtabs(4) '01 012 0123 01234'
-
str.find(sub[, start[, end]]) -
Возвращает наименьший индекс в строке, где подстрока sub найдена в срезе
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в нотации срезов. Возвращает-1если sub не найдена.
-
str.format(*args, **kwargs) -
Выполняет операцию форматирования строк. Строка, к которой применяется этот метод, может содержать литеральный текст или поля замены, ограниченные фигурными скобками
{}. Каждое поле замены содержит либо числовой индекс позиционного аргумента, либо имя ключевого аргумента. Возвращает копию строки, где каждое поле замены заменяется строковым значением соответствующего аргумента.>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3'См. Синтаксис форматирования строк для описания различных параметров форматирования, которые могут быть указаны в строках форматирования.
Примечание
При форматировании числа (
int,float,complex,decimal.Decimalи подклассы) с типомn(например:'{:n}'.format(1234)), функция временно устанавливаетLC_CTYPEлокаль вLC_NUMERICлокаль, чтобы декодироватьdecimal_pointиthousands_sepполяlocaleconv(), если они не являются ASCII или длиннее 1 байта, иLC_NUMERICлокаль отличается отLC_CTYPEлокаль. Это временное изменение влияет на другие потоки.Изменено в версии 3.7: При форматировании числа с типом
n, функция временно устанавливаетLC_CTYPEлокаль вLC_NUMERICлокаль в некоторых случаях.
-
str.format_map(mapping) -
Аналогично
str.format(**mapping), за исключением того, чтоmappingиспользуется напрямую, а не копируется вdict. Это полезно, например, еслиmappingявляется подклассом словаря:>>> 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в противном случае. Буквенные символы — это те символы, определённые в базе данных символов Юникода как «Буква», т. е. те, у которых свойство общей категории равно одному из «Lm», «Lt», «Lu», «Ll» или «Lo». Обратите внимание, что это отличается от свойства «Буквенного» символа, определённого в разделе 4.10 «Буквы, буквенные и идеографические» стандарта Юникода.
-
str.isascii() -
Возвращает
True, если строка пустая или все символы в строке являются ASCII,Falseв противном случае. ASCII-символы имеют код в диапазоне U+0000-U+007F.Добавлен в версии 3.7.
-
str.isdecimal() -
Возвращает
True, если все символы в строке являются десятичными символами, и в строке есть хотя бы один символ,Falseв противном случае. Десятичные символы — это те, которые могут использоваться для образования чисел в системе счисления по основанию 10, например, U+0660, АРАБСКАЯ ЦИФРА НОЛЬ. Строго говоря, десятичный символ — это символ в Unicode-категории «Nd».
-
str.isdigit() -
Возвращает
True, если все символы в строке являются цифрами, и в строке есть хотя бы один символ,Falseв противном случае. Цифры включают в себя десятичные символы и цифры, требующие специальной обработки, например, совместимые цифровые надстрочные знаки. Это охватывает цифры, которые нельзя использовать для образования чисел в системе счисления по основанию 10, например, цифры системы Кхароштхи. Строго говоря, цифра — это символ, у которого значение свойства «Числовой тип» равно «Цифра» или «Десятичный».
-
str.isidentifier() -
Возвращает
True, если строка является допустимым идентификатором в соответствии с определением языка, раздел Идентификаторы и ключевые слова.keyword.iskeyword()может использоваться для проверки, является ли строкаsзарезервированным идентификатором, например,defиclass.Пример:
>>> from keyword import iskeyword >>> 'hello'.isidentifier(), iskeyword('hello') (True, False) >>> 'def'.isidentifier(), iskeyword('def') (True, True)
-
str.islower() -
Возвращает
True, если все символы с учётом регистра [4] в строке являются строчными, и в строке есть хотя бы один символ с учётом регистра,Falseв противном случае.
-
str.isnumeric() -
Возвращает
True, если все символы в строке являются числовыми символами, и в строке есть хотя бы один символ,Falseв противном случае. Числовые символы включают в себя цифровые символы и все символы, имеющие свойство числового значения Юникода, например, U+2155, ОБЫЧНАЯ ДРОБЬ ОДНА ПЯТАЯ. Строго говоря, числовые символы — это те, у которых значение свойства «Числовой тип» равно «Цифра», «Десятичный» или «Числовой».
-
str.isprintable() -
Возвращает
True, если все символы в строке являются печатаемыми или строка пуста,Falseв противном случае. Непечатаемые символы — это те символы, определённые в базе данных символов Юникода как «Прочие» или «Разделители», за исключением ASCII-пробела (0x20), который считается печатаемым. (Обратите внимание, что печатаемые символы в данном контексте — это те, которые не должны быть экранированы, когда вызываетсяrepr()для строки. Это не влияет на обработку строк, выводимых вsys.stdoutилиsys.stderr.)
-
str.isspace() -
Возвращает
True, если в строке есть только пробельные символы, и в строке есть хотя бы один символ,Falseв противном случае.Символ считается пробелом, если в базе данных символов Юникода (см.
unicodedata), либо его общая категория равнаZs(«Разделитель, пробел»), либо его бинаро-направленный класс — один изWS,B, илиS.
-
str.istitle() -
Возвращает
True, если строка является строкой с заглавными буквами в начале каждого слова, и в строке есть хотя бы один символ, например, прописные буквы могут следовать только за строчными символами, а строчные — только за прописными. ВозвращаетFalseв противном случае.
-
str.isupper() -
Возвращает
True, если все символы с учётом регистра [4] в строке являются заглавными, и в строке есть хотя бы один символ с учётом регистра,Falseв противном случае.>>> 'BANANA'.isupper() True >>> 'banana'.isupper() False >>> 'baNana'.isupper() False >>> ' '.isupper() False
-
str.join(iterable) -
Возвращает строку, которая является конкатенацией строк в iterable. Будет возбуждено исключение
TypeError, если в iterable есть какие-либо значения, не являющиеся строками, включая объектыbytes.
-
str.ljust(width[, fillchar]) -
Возвращает строку, выровненную по левому краю в строке длиной width. Заполнение выполняется с помощью указанного fillchar (по умолчанию — ASCII-пробел). Исходная строка возвращается, если width меньше или равна
len(s).
-
str.lower() -
Возвращает копию строки со всеми символами с учётом регистра [4] преобразованными в строчные.
Используемый алгоритм приведения к нижнему регистру описан в разделе 3.13 «Сведение к нижнему регистру по умолчанию» стандарта Юникода.
-
str.lstrip([chars]) -
Возвращает копию строки с удалёнными начальными символами. Аргумент chars — это строка, определяющая набор символов, которые нужно удалить. Если опущен или
None, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является префиксом; удаляются все комбинации его значений:>>> ' spacious '.lstrip() 'spacious ' >>> 'www.example.com'.lstrip('cmowz.') 'example.com'См.
str.removeprefix()для метода, который удаляет одну строку-префикс, а не весь набор символов. Например:>>> 'Arthur: three!'.lstrip('Arthur: ') 'ee!' >>> 'Arthur: three!'.removeprefix('Arthur: ') 'three!'
-
static str.maketrans(x[, y[, z]]) -
Этот статический метод возвращает таблицу преобразований, пригодную для
str.translate().Если аргументов один, он должен быть словарем, сопоставляющим коды Юникода (целые числа) или символы (строки длиной 1) с кодами Юникода, строками (любой длины) или
None. Символьные ключи затем будут преобразованы в коды.Если аргументов два, они должны быть строками одинаковой длины, и в результирующем словаре каждый символ в x будет сопоставлен символу на той же позиции в y. Если есть третий аргумент, он должен быть строкой, символы которой будут сопоставлены с
Noneв результате.
-
str.partition(sep) -
Разделяет строку по первому вхождению sep и возвращает тройку, содержащую часть перед разделителем, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает тройку, содержащую саму строку, за которой следуют две пустые строки.
-
str.removeprefix(prefix, /) -
Если строка начинается с строки prefix, возвращает
string[len(prefix):]. В противном случае возвращает копию исходной строки:>>> 'TestHook'.removeprefix('Test') 'Hook' >>> 'BaseTestCase'.removeprefix('Test') 'BaseTestCase'Добавлен в версии 3.9.
-
str.removesuffix(suffix, /) -
Если строка заканчивается строкой suffix, и suffix не пустая, возвращает
string[:-len(suffix)]. В противном случае возвращает копию исходной строки:>>> 'MiscTests'.removesuffix('Tests') 'Misc' >>> 'TmpDirMixin'.removesuffix('Tests') 'TmpDirMixin'Добавлен в версии 3.9.
-
str.replace(old, new[, count]) -
Возвращает копию строки, в которой все вхождения подстроки old заменены на new. Если необязательный аргумент count задан, заменяются только первые count вхождений.
-
str.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс в строке, где подстрока sub найдена, при условии, что sub содержится в
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в обозначении срезов. В случае неудачи возвращает-1.
-
str.rindex(sub[, start[, end]]) -
Подобно
rfind(), но генерирует исключениеValueError, когда подстрока sub не найдена.
-
str.rjust(width[, fillchar]) -
Возвращает строку, выровненную по правому краю в строке длиной width. Заполнение выполняется с помощью указанного fillchar (по умолчанию это ASCII пробел). Исходная строка возвращается, если width меньше или равно
len(s).
-
str.rpartition(sep) -
Разделяет строку по последнему вхождению sep и возвращает кортеж из 3 элементов, содержащий часть перед разделителем, сам разделитель и часть после разделителя. Если разделитель не найден, возвращается кортеж из двух пустых строк и самой строки.
-
str.rsplit(sep=None, maxsplit=-1) -
Возвращает список слов в строке, используя sep в качестве разделителя. Если задан maxsplit, выполняется не более maxsplit разделений, начиная с правого конца. Если sep не указан или
None, любая строка пробелов используется как разделитель. За исключением разделения справа налево,rsplit()ведет себя какsplit(), подробное описание которой приведено ниже.
-
str.rstrip([chars]) -
Возвращает копию строки с удаленными символами справа. Аргумент chars — это строка, определяющая множество символов, которые нужно удалить. Если он опущен или
None, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является суффиксом; вместо этого удаляются все сочетания его значений:>>> ' spacious '.rstrip() ' spacious' >>> 'mississippi'.rstrip('ipz') 'mississ'См.
str.removesuffix()для метода, который удаляет отдельную строку-суффикс, а не все символы из набора.>>> 'Monty Python'.rstrip(' Python') 'M' >>> 'Monty Python'.removesuffix(' Python') 'Monty'
-
str.split(sep=None, maxsplit=-1) -
Возвращает список слов в строке, используя sep в качестве разделителя. Если задан maxsplit, выполняется не более maxsplit разделений (следовательно, список будет содержать не более
maxsplit+1элементов). Если maxsplit не указан или-1, ограничений на количество разделений нет (выполняются все возможные разделения).Если sep задан, последовательные разделители не группируются вместе и считаются разделяющими пустые строки (например,
'1,,2'.split(',')возвращает['1', '', '2']). Аргумент sep может состоять из нескольких символов как одного разделителя (чтобы разделить по нескольким разделителям, используйтеre.split()). Разделение пустой строки указанным разделителем возвращает[''].>>> '1,2,3'.split(',') ['1', '2', '3'] >>> '1,2,3'.split(',', maxsplit=1) ['1', '2,3'] >>> '1,2,,3,'.split(',') ['1', '2', '', '3', ''] >>> '1<>2<>3<4'.split('<>') ['1', '2', '3<4']Если sep не указан или
None, применяется другой алгоритм разделения: последовательности пробелов рассматриваются как один разделитель, и результат не будет содержать пустых строк в начале или конце, если строка имеет ведущие или хвостовые пробелы. Следовательно, разделение пустой строки или строки, состоящей только из пробелов, с разделителемNoneвозвращает[].>>> '1 2 3'.split() ['1', '2', '3'] >>> '1 2 3'.split(maxsplit=1) ['1', '2 3'] >>> ' 1 2 3 '.split() ['1', '2', '3']
-
str.splitlines(keepends=False) -
Возвращает список строк в строке, разбивая по границам строк. Разделители строк не включаются в результирующий список, если только keepends не задан и не имеет значение true.
Этот метод разделяет по следующим границам строк. В частности, границы являются супермножеством универсальных символов новой строки.
Представление
Описание
\nСимвол новой строки
\rВозврат каретки
\r\nВозврат каретки + новая строка
\vили\x0bГоризонтальная табуляция
\fили\x0cФорматный символ
\x1cРазделитель файлов
\x1dРазделитель групп
\x1eРазделитель записей
\x85Следующая строка (управляющий код C1)
\u2028Разделитель строк
\u2029Разделитель абзацев
Изменено в версии 3.2:
\vи\fдобавлены в список границ строк.>>> 'ab c\n\nde fg\rkl\r\n'.splitlines() ['ab c', '', 'de fg', 'kl'] >>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) ['ab c\n', '\n', 'de fg\r', 'kl\r\n']
В отличие от
split(), когда задана строка-разделитель sep, этот метод возвращает пустой список для пустой строки и разделитель в конце строки не приводит к добавлению дополнительной строки:>>> "".splitlines() [] >>> "One line\n".splitlines() ['One line']
Для сравнения,
split('\n')дает:>>> ''.split('\n') [''] >>> 'Two lines\n'.split('\n') ['Two lines', '']
-
str.startswith(prefix[, start[, end]]) -
Возвращает
Trueесли строка начинается с prefix, в противном случае возвращаетFalse. prefix также может быть кортежем префиксов для поиска. С необязательным start проверка начинается с этой позиции. С необязательным end сравнение останавливается на этой позиции.
-
str.strip([chars]) -
Возвращает копию строки с удаленными ведущими и хвостовыми символами. Аргумент chars — это строка, определяющая множество символов, которые нужно удалить. Если он опущен или
None, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является префиксом или суффиксом; вместо этого удаляются все сочетания его значений:>>> ' spacious '.strip() 'spacious' >>> 'www.example.com'.strip('cmowz.') 'example'Удаляются самые внешние ведущие и хвостовые значения аргумента chars из строки. Символы удаляются с начала до тех пор, пока не будет достигнут символ строки, который не содержится в наборе символов в chars. Аналогичное действие выполняется с хвостовой частью. Например:
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......' >>> comment_string.strip('.#! ') 'Section 3.2.1 Issue #32'
-
str.swapcase() -
Возвращает копию строки, в которой заглавные буквы заменены на строчные, а строчные на заглавные. Обратите внимание, что
s.swapcase().swapcase() == sне всегда выполняется.
-
str.title() -
Возвращает строку в стиле заголовка, где слова начинаются с заглавной буквы, а остальные — строчные.
Например:
>>> 'Hello world'.title() 'Hello World'
Алгоритм использует простое независимое от языка определение слова как последовательности букв. Определение работает во многих контекстах, но это означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может не быть желаемым результатом:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
Функция
string.capwords()не имеет этой проблемы, поскольку она разделяет слова только по пробелам.В качестве обходного решения для апострофов можно использовать регулярные выражения:
>>> import re >>> def titlecase(s): ... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0).capitalize(), ... s) ... >>> titlecase("they're bill's friends.") "They're Bill's Friends."
-
str.translate(table) -
Возвращает копию строки, в которой каждый символ был отображён в соответствии с заданной таблицей преобразования. Таблица должна быть объектом, реализующим индексацию через
__getitem__(), обычно это отображение или последовательность. При индексации по числовому значению кода Юникода (целое число) объект таблицы может выполнять следующие действия: возвращать числовое значение кода Юникода или строку, чтобы отобразить символ на один или несколько других символов; возвращатьNone, чтобы удалить символ из возвращаемой строки; или генерировать исключениеLookupError, чтобы отобразить символ на себя.Вы можете использовать
str.maketrans()для создания таблицы преобразования из сопоставлений символ-символ в разных форматах.См. также модуль
codecsдля более гибкого подхода к пользовательским отображениям символов.
-
str.upper() -
Возвращает копию строки, в которой все символы с регистром [4] преобразуются в верхний регистр. Обратите внимание, что
s.upper().isupper()может бытьFalseеслиsсодержит символы без регистра или если категория Юникода результирующего символа(ов) не «Lu» (буква, заглавная), а, например, «Lt» (буква, строчная).Используемый алгоритм преобразования в верхний регистр описан в разделе 3.13 «Сворачивание в нижний регистр по умолчанию» стандарта Юникод.
-
str.zfill(width) -
Возвращает копию строки, дополненную слева ASCII-цифрами
'0'до длины width. Префикс знака ('+'/'-') обрабатывается вставкой заполнения после символа знака, а не перед ним. Исходная строка возвращается, если width меньше или равнаlen(s).Например:
>>> "42".zfill(5) '00042' >>> "-42".zfill(5) '-0042'
printf-форматирование строк
Примечание
Операции форматирования, описанные здесь, демонстрируют ряд особенностей, которые приводят к ряду распространённых ошибок (например, некорректный вывод кортежей и словарей). Использование более новых форматируемых строковых литералов, интерфейса str.format() или строковых шаблонов может помочь избежать этих ошибок. Каждая из этих альтернатив имеет свои преимущества и недостатки в плане простоты, гибкости и/или расширяемости.
Объекты строк имеют одну уникальную встроенную операцию: оператор % (modulo). Это также известно как оператор форматирования или интерполяции строк. Учитывая format % values (где format — строка), спецификации преобразования % в format заменяются нулём или более элементами из values. Эффект аналогичен использованию оператора sprintf() в языке C.
Если format требует единственного аргумента, values может быть единственным объектом, не являющимся кортежем. [5] В противном случае values должен быть кортежем с ровно таким количеством элементов, которое указано в строке формата, или одним объектом сопоставления (например, словарем).
Спецификатор преобразования содержит два или более символов и имеет следующие компоненты, которые должны следовать в указанном порядке:
- Символ
'%', который отмечает начало спецификатора. - Ключ сопоставления (необязательный), представляющий собой заключённую в скобки последовательность символов (например,
(somename)). - Флаги преобразования (необязательные), которые влияют на результат некоторых типов преобразования.
- Минимальная ширина поля (необязательная). Если она указана как
'*'(звёздочка), фактическая ширина считывается из следующего элемента кортежа в values, а объект для преобразования идёт после минимальной ширины поля и необязательной точности. - Точность (необязательная), задаваемая символом
'.'(точка) и значением точности. Если она указана как'*'(звёздочка), фактическая точность считывается из следующего элемента кортежа в values, а значение для преобразования следует за точностью. - Модификатор длины (необязательный).
- Тип преобразования.
Когда правым аргументом является словарь (или другой тип сопоставления), форматы в строке должны включать ключ сопоставления в скобках, вставленный непосредственно после символа '%'. Ключ сопоставления выбирает значение для форматирования из сопоставления. Например:
>>> print('%(language)s has %(number)03d quote types.' %
... {'language': "Python", "number": 2})
Python has 002 quote types.
В этом случае в формате не должно быть спецификаторов *, так как они требуют последовательного списка параметров.
Символы флагов преобразования:
Флаг | Значение |
|---|---|
| Преобразование значения будет использовать «альтернативную форму» (если она определена). |
| Преобразование будет дополняться нулями для числовых значений. |
| Преобразованное значение выравнивается влево (переопределяет |
| (пробел) Перед положительным числом (или пустой строкой), полученным при знаковом преобразовании, должен быть пробел. |
| Символ знака ( |
Модификатор длины (h, l, или L ) может присутствовать, но игнорируется, так как он не нужен для Python — например, %ld идентично %d.
Типы преобразования:
Преобразование | Значение | Примечания |
|---|---|---|
| Целое число со знаком в десятичной системе. | |
| Целое число со знаком в десятичной системе. | |
| Целое число со знаком в восьмеричной системе. | (1) |
| Устаревший тип — он идентичен | (6) |
| Шестнадцатеричное число со знаком (строчные буквы). | (2) |
| Шестнадцатеричное число со знаком (заглавные буквы). | (2) |
| Вещественное число в экспоненциальном формате (строчные буквы). | (3) |
| Вещественное число в экспоненциальном формате (заглавные буквы). | (3) |
| Вещественное число в десятичном формате. | (3) |
| Вещественное число в десятичном формате. | (3) |
| Вещественное число в формате. Использует экспоненциальный формат с маленькими буквами, если показатель степени меньше -4 или не меньше точности, десятичный формат в противном случае. | (4) |
| Вещественное число в формате. Использует экспоненциальный формат с заглавными буквами, если показатель степени меньше -4 или не меньше точности, десятичный формат в противном случае. | (4) |
| Один символ (принимает целое число или строку с одним символом). | |
| Строка (преобразует любой объект Python с помощью | (5) |
| Строка (преобразует любой объект Python с помощью | (5) |
| Строка (преобразует любой объект Python с помощью | (5) |
| Аргумент не преобразуется, в результате получается символ |
Примечания:
- Альтернативная форма вставляет префикс восьмеричного числа (
'0o') перед первой цифрой. - Альтернативная форма вставляет префикс
'0x'или'0X'(в зависимости от того, использовался ли формат'x'или'X') перед первой цифрой. -
Альтернативная форма всегда включает десятичную точку, даже если за ней нет цифр.
Точность определяет количество цифр после десятичной точки и по умолчанию равна 6.
-
Альтернативная форма всегда включает десятичную точку, и хвостовые нули не удаляются, как это было бы иначе.
Точность определяет количество значащих цифр до и после десятичной точки и по умолчанию равна 6.
- Если точность
N, вывод усекается доNсимволов. - См. PEP 237.
Поскольку у строк Python есть явная длина, преобразования %s не предполагают, что '\0' является концом строки.
Изменено в версии 3.1: Преобразования %f для чисел, модуль абсолютного значения которых превышает 1e50, больше не заменяются на %g преобразования.
Типы последовательностей двоичных данных — bytes, bytearray, memoryview
Основными встроенными типами для работы с двоичными данными являются bytes и bytearray. Они поддерживаются memoryview, который использует протокол буфера для доступа к памяти других двоичных объектов без необходимости копирования.
Модуль array поддерживает эффективное хранение основных типов данных, таких как 32-битные целые числа и значения с двойной точностью IEEE754.
Объекты типа bytes
Объекты типа bytes представляют собой неизменяемые последовательности отдельных байтов. Поскольку многие основные двоичные протоколы основаны на кодировке ASCII, объекты типа bytes предлагают несколько методов, которые справедливы только при работе с совместимыми с ASCII данными и тесно связаны с объектами типа string во многих других отношениях.
-
class bytes([source[, encoding[, errors]]]) -
Во-первых, синтаксис для литералов bytes в значительной степени аналогичен синтаксису для литералов string, за исключением того, что добавляется префикс
b:- Одинарные кавычки:
b'still allows embedded "double" quotes' - Двойные кавычки:
b"still allows embedded 'single' quotes" - Тройные кавычки:
b'''3 single quotes''',b"""3 double quotes"""
В литералах bytes допускаются только символы ASCII (независимо от объявленной кодировки исходного кода). Любые двоичные значения больше 127 должны быть введены в литералы bytes с использованием соответствующей последовательности экранирования.
Как и в случае с литералами string, в литералах bytes также можно использовать префикс
rдля отключения обработки последовательностей экранирования. Подробнее о различных формах литералов bytes, включая поддерживаемые последовательности экранирования, см. в разделе Литералы строк и байтов.Хотя литералы и представления объектов bytes основаны на тексте ASCII, сами объекты bytes фактически ведут себя как неизменяемые последовательности целых чисел, причем каждое значение в последовательности ограничено таким образом, что
0 <= x < 256(попытки нарушения этого ограничения приведут к исключениюValueError). Это делается намеренно, чтобы подчеркнуть, что, хотя многие двоичные форматы включают элементы, основанные на ASCII, и могут быть полезно обработаны с помощью некоторых алгоритмов, ориентированных на текст, это обычно не относится к произвольным двоичным данным (слепое применение алгоритмов обработки текста к двоичным форматам, которые не совместимы с ASCII, обычно приводит к повреждению данных).Помимо литеральных форм, объекты bytes можно создавать различными способами:
- Объект bytes с нулевыми значениями заданной длины:
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-пробелы в строке, а не только пробелы.
Существует обратная функция преобразования для преобразования объекта bytes в его шестнадцатеричное представление.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.
>>> b'\xf0\xf1\xf2'.hex() 'f0f1f2'
Если вы хотите сделать строку в шестнадцатеричном формате более читаемой, можно указать параметр sep с символом-разделителем, который будет включен в выходные данные. По умолчанию этот разделитель будет включен между каждым байтом. Второй необязательный параметр bytes_per_sep управляет расположением пробела. Положительные значения рассчитывают позицию разделителя справа, отрицательные — слева.
>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') 'f0-f1-f2' >>> value.hex('_', 2) 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) '55554444 4c524c52 4142'Добавлен в версии 3.5.
Изменено в версии 3.8:
bytes.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
- Одинарные кавычки:
Поскольку объекты bytes являются последовательностями целых чисел (аналогично кортежу), для объекта bytes b, b[0] будет целым числом, а b[0:1] будет объектом bytes длиной 1. (Это отличается от текстовых строк, где и индексирование, и срезы дадут строку длиной 1)
Представление объектов bytes использует литеральную форму (b'...') поскольку она часто более полезна, чем, например, bytes([46, 46, 46]). Вы всегда можете преобразовать объект bytes в список целых чисел с помощью list(b).
Объекты типа bytearray
bytearray объекты являются изменяемыми аналогами объектов bytes.
-
class bytearray([source[, encoding[, errors]]]) -
Для объектов bytearray нет специального синтаксиса литералов, вместо этого они всегда создаются вызовом конструктора:
- Создание пустого экземпляра:
bytearray() - Создание экземпляра с нулевыми значениями заданной длины:
bytearray(10) - Из итерируемого объекта целых чисел:
bytearray(range(20)) - Копирование существующих двоичных данных с помощью протокола буфера:
bytearray(b'Hi!')
Поскольку объекты bytearray являются изменяемыми, они поддерживают изменяемые операции последовательностей, помимо обычных операций с bytes и bytearray, описанных в Операции с Bytes и Bytearray.
Также см. встроенную функцию bytearray.
Поскольку 2 шестнадцатеричные цифры точно соответствуют одному байту, шестнадцатеричные числа являются часто используемым форматом для описания двоичных данных. Соответственно, тип bytearray имеет дополнительный метод класса для чтения данных в этом формате:
-
classmethod fromhex(string) -
Этот метод класса
bytearrayвозвращает объект bytearray, декодируя данный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом ASCII-пробелы игнорируются.>>> bytearray.fromhex('2Ef0 F1f2 ') bytearray(b'.\xf0\xf1\xf2')Изменено в версии 3.7:
bytearray.fromhex()теперь пропускает все ASCII-пробелы в строке, а не только пробелы.
Существует обратная функция преобразования для преобразования объекта bytearray в его шестнадцатеричное представление.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.
>>> bytearray(b'\xf0\xf1\xf2').hex() 'f0f1f2'
Добавлен в версии 3.5.
Изменено в версии 3.8: Аналогично
bytes.hex(),bytearray.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
- Создание пустого экземпляра:
Поскольку объекты bytearray являются последовательностями целых чисел (аналогично списку), для объекта bytearray b, b[0] будет целым числом, а b[0:1] будет объектом bytearray длиной 1. (Это отличается от текстовых строк, где и индексирование, и срезы дадут строку длиной 1)
Представление объектов bytearray использует формат литералов bytes (bytearray(b'...')) поскольку он часто более удобен, чем, например, bytearray([46, 46, 46]). Вы всегда можете преобразовать объект bytearray в список целых чисел с помощью list(b).
Операции с объектами bytes и bytearray
Объекты bytes и bytearray поддерживают общие операции над последовательностями. Они взаимодействуют не только с операндами того же типа, но и с любым объектом типа bytes-like. Благодаря этой гибкости они могут свободно использоваться в операциях без ошибок. Однако тип возвращаемого результата может зависеть от порядка операндов.
Примечание
Методы объектов bytes и bytearray не принимают строки в качестве аргументов, так же как методы строк не принимают байты в качестве аргументов. Например, вы должны написать:
a = "abc"
b = a.replace("a", "f")
и:
a = b"abc" b = a.replace(b"a", b"f")
Некоторые операции с объектами bytes и bytearray предполагают использование совместимых с ASCII двоичных форматов, и поэтому их следует избегать при работе с произвольными двоичными данными. Эти ограничения описаны ниже.
Примечание
Использование этих операций, основанных на ASCII, для манипулирования двоичными данными, которые не хранятся в формате, основанном на ASCII, может привести к повреждению данных.
Следующие методы объектов bytes и bytearray могут использоваться с произвольными двоичными данными.
-
bytes.count(sub[, start[, end]]) -
bytearray.count(sub[, start[, end]]) -
Возвращает количество неперекрывающихся вхождений подпоследовательности sub в диапазоне [start, end]. Дополнительные аргументы start и end интерпретируются так же, как в записи срезов.
Подпоследовательность, которую нужно найти, может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Если sub пустая, возвращает количество пустых срезов между символами, что равно длине объекта bytes плюс один.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.removeprefix(prefix, /) -
bytearray.removeprefix(prefix, /) -
Если двоичные данные начинаются с строки prefix, возвращает
bytes[len(prefix):]. В противном случае возвращает копию исходных двоичных данных:>>> b'TestHook'.removeprefix(b'Test') b'Hook' >>> b'BaseTestCase'.removeprefix(b'Test') b'BaseTestCase'
prefix может быть любым объектом типа bytes-like.
Примечание
Версия этого метода для bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
Добавлен в версии 3.9.
-
bytes.removesuffix(suffix, /) -
bytearray.removesuffix(suffix, /) -
Если двоичные данные заканчиваются строкой suffix и эта suffix не пуста, возвращает
bytes[:-len(suffix)]. В противном случае возвращает копию исходных двоичных данных:>>> b'MiscTests'.removesuffix(b'Tests') b'Misc' >>> b'TmpDirMixin'.removesuffix(b'Tests') b'TmpDirMixin'
suffix может быть любым объектом типа bytes-like.
Примечание
Версия этого метода для bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
Добавлен в версии 3.9.
-
bytes.decode(encoding='utf-8', errors='strict') -
bytearray.decode(encoding='utf-8', errors='strict') -
Возвращает байты, декодированные в
str.encoding по умолчанию
'utf-8'; см. Стандартные кодировки для возможных значений.errors управляет обработкой ошибок декодирования. Если
'strict'(по умолчанию), возникает исключениеUnicodeError. Другие возможные значения —'ignore','replace', и любые другие имена, зарегистрированные черезcodecs.register_error(). См. Обработчики ошибок для получения подробностей.Для повышения производительности значение errors не проверяется на корректность, пока не произойдет ошибка декодирования, включен Режим разработки Python или используется отладочная сборка.
Примечание
Передача аргумента encoding к
strпозволяет декодировать любой объект типа bytes-like непосредственно без необходимости создания временногоbytesилиbytearrayобъекта.Изменено в версии 3.1: Добавлена поддержка ключевых аргументов.
Изменено в версии 3.9: Значение аргумента errors теперь проверяется в режиме разработки Python и в отладочном режиме.
-
bytes.endswith(suffix[, start[, end]]) -
bytearray.endswith(suffix[, start[, end]]) -
Возвращает
Trueесли двоичные данные заканчиваются указанным suffix, в противном случае возвращаетFalse. suffix также может быть кортежем суффиксов для поиска. С необязательным start, поиск начинается с этой позиции. С необязательным end, сравнение останавливается на этой позиции.Суффикс(ы) для поиска могут быть любым объектом типа bytes-like.
-
bytes.find(sub[, start[, end]]) -
bytearray.find(sub[, start[, end]]) -
Возвращает наименьший индекс в данных, где найдена подпоследовательность sub, такая что sub содержится в срезе
s[start:end]. Дополнительные аргументы start и end интерпретируются так же, как в записи срезов. Возвращает-1если sub не найдена.Подпоследовательность, которую нужно найти, может быть любым объектом типа bytes-like или целым числом в диапазоне от 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 или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.join(iterable) -
bytearray.join(iterable) -
Возвращает объект bytes или bytearray, являющийся конкатенацией двоичных последовательностей в iterable.
TypeErrorбудет сгенерирован, если в iterable есть какие-либо значения, которые не являются объектами типа bytes-like, включаяstrобъекты. Разделитель между элементами — содержимое объекта bytes или bytearray, предоставляющего этот метод.
-
static bytes.maketrans(from, to) -
static bytearray.maketrans(from, to) -
Этот статический метод возвращает таблицу преобразования, пригодную для
bytes.translate(), которая будет отображать каждый символ в from на символ в той же позиции в to; from и to должны быть объектами типа bytes-like и иметь одинаковую длину.Добавлен в версии 3.1.
-
bytes.partition(sep) -
bytearray.partition(sep) -
Разделить последовательность на первой встреченной подпоследовательности sep и вернуть кортеж из 3 элементов: часть перед разделителем, сам разделитель (или его копию в виде bytearray), и часть после разделителя. Если разделитель не найден, вернуть кортеж из 3 элементов: копия исходной последовательности, и две пустые последовательности типа bytes или bytearray.
Разделитель может быть любым объектом типа bytes-like.
-
bytes.replace(old, new[, count]) -
bytearray.replace(old, new[, count]) -
Возвращает копию последовательности, в которой все вхождения подпоследовательности old заменены на new. Если необязательный аргумент count задан, заменятся только первые count вхождений.
Подпоследовательность для поиска и её замена могут быть любыми объектами типа bytes-like.
Примечание
В версии bytearray этого метода замена не выполняется на месте – всегда создаётся новый объект, даже если изменений не потребовалось.
-
bytes.rfind(sub[, start[, end]]) -
bytearray.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс в последовательности, где встречается подпоследовательность sub, такая что sub содержится в
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в обозначениях срезов. При неудачном поиске возвращает-1.Подпоследовательность для поиска может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.rindex(sub[, start[, end]]) -
bytearray.rindex(sub[, start[, end]]) -
Аналогично
rfind(), но вызывает исключениеValueError, если подпоследовательность sub не найдена.Подпоследовательность для поиска может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.rpartition(sep) -
bytearray.rpartition(sep) -
Разделить последовательность на последнем вхождении sep и вернуть кортеж из 3 элементов: часть перед разделителем, сам разделитель (или его копию в виде bytearray), и часть после разделителя. Если разделитель не найден, вернуть кортеж из 3 элементов: две пустые последовательности типа bytes или bytearray, и копия исходной последовательности.
Разделитель может быть любым объектом типа bytes-like.
-
bytes.startswith(prefix[, start[, end]]) -
bytearray.startswith(prefix[, start[, end]]) -
Возвращает
True, если бинарные данные начинаются с указанного префикса prefix, в противном случае возвращаетFalse. prefix также может быть кортежем префиксов для проверки. С необязательным аргументом start проверка начинается с этой позиции. С необязательным аргументом end сравнение останавливается на этой позиции.Префикс(ы) для поиска может быть любым объектом типа bytes-like.
-
bytes.translate(table, /, delete=b'') -
bytearray.translate(table, /, delete=b'') -
Возвращает копию объекта bytes или bytearray, в котором все байты, присутствующие в необязательном аргументе delete, удалены, а оставшиеся байты отображены через заданную таблицу преобразования, которая должна быть объектом bytes длиной 256.
Вы можете использовать метод
bytes.maketrans()для создания таблицы преобразования.Установите аргумент table в
Noneдля преобразований, которые только удаляют символы:>>> b'read this short text'.translate(None, b'aeiou') b'rd ths shrt txt'
Изменено в версии 3.6: delete теперь поддерживается как ключевой аргумент.
Следующие методы объектов bytes и bytearray имеют по умолчанию поведение, предполагающее использование бинарных форматов, совместимых с ASCII, но могут быть использованы с произвольными бинарными данными, передавая соответствующие аргументы. Обратите внимание, что все методы bytearray в этом разделе не работают на месте, а вместо этого создают новые объекты.
-
bytes.center(width[, fillbyte]) -
bytearray.center(width[, fillbyte]) -
Возвращает копию объекта, центрированного в последовательности длиной width. Заполнение выполняется с использованием заданного fillbyte (по умолчанию - ASCII-пробел). Для объектов
bytesисходная последовательность возвращается, если width меньше или равноlen(s).Примечание
В версии bytearray этого метода замена не выполняется на месте – всегда создаётся новый объект, даже если изменений не потребовалось.
-
bytes.ljust(width[, fillbyte]) -
bytearray.ljust(width[, fillbyte]) -
Возвращает копию объекта, выровненного влево в последовательности длиной width. Заполнение выполняется с использованием заданного fillbyte (по умолчанию - ASCII-пробел). Для объектов
bytesисходная последовательность возвращается, если width меньше или равноlen(s).Примечание
В версии bytearray этого метода замена не выполняется на месте – всегда создаётся новый объект, даже если изменений не потребовалось.
-
bytes.lstrip([chars]) -
bytearray.lstrip([chars]) -
Возвращает копию последовательности с удалёнными указанными ведущими байтами. Аргумент chars – бинарная последовательность, задающая множество значений байтов для удаления – имя отражает тот факт, что этот метод обычно используется с ASCII-символами. Если опущен или
None, аргумент chars по умолчанию удаляет ASCII-пробелы. Аргумент chars не является префиксом; скорее, удаляются все сочетания его значений:>>> b' spacious '.lstrip() b'spacious ' >>> b'www.example.com'.lstrip(b'cmowz.') b'example.com'
Бинарная последовательность значений байтов для удаления может быть любым объектом типа bytes-like. См.
removeprefix()для метода, который удалит одну строку-префикс, а не всё множество символов. Например:>>> b'Arthur: three!'.lstrip(b'Arthur: ') b'ee!' >>> b'Arthur: three!'.removeprefix(b'Arthur: ') b'three!'
Примечание
В версии bytearray этого метода замена не выполняется на месте – всегда создаётся новый объект, даже если изменений не потребовалось.
-
bytes.rjust(width[, fillbyte]) -
bytearray.rjust(width[, fillbyte]) -
Возвращает копию объекта, выровненного вправо в последовательности длиной width. Заполнение выполняется с использованием заданного fillbyte (по умолчанию - ASCII-пробел). Для объектов
bytesисходная последовательность возвращается, если width меньше или равноlen(s).Примечание
В версии bytearray этого метода замена не выполняется на месте – всегда создаётся новый объект, даже если изменений не потребовалось.
-
bytes.rsplit(sep=None, maxsplit=-1) -
bytearray.rsplit(sep=None, maxsplit=-1) -
Разделяет бинарную последовательность на подпоследовательности того же типа, используя sep в качестве разделителя. Если задан maxsplit, выполняется не более maxsplit разделений, самые правые. Если sep не задан или
None, любая подпоследовательность, состоящая только из ASCII-пробелов, является разделителем. За исключением разделения справа,rsplit()ведет себя какsplit(), которое описано более подробно ниже.
-
bytes.rstrip([chars]) -
bytearray.rstrip([chars]) -
Возвращает копию последовательности с удаленными указанными завершающими байтами. Аргумент chars — это бинарная последовательность, указывающая множество значений байтов, которые должны быть удалены; название метода связано с тем, что он обычно используется с символами ASCII. Если он опущен или
None, аргумент chars по умолчанию удаляет пробельные символы ASCII. Аргумент chars не является суффиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.rstrip() b' spacious' >>> b'mississippi'.rstrip(b'ipz') b'mississ'
Бинарная последовательность значений байтов для удаления может быть любым объектом, подобным байтам bytes-like object. См.
removesuffix()для метода, который удалит одну строку суффикса, а не все символы из множества. Например:>>> b'Monty Python'.rstrip(b' Python') b'M' >>> b'Monty Python'.removesuffix(b' Python') b'Monty'
Note
Версия этого метода для bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.split(sep=None, maxsplit=-1) -
bytearray.split(sep=None, maxsplit=-1) -
Разделяет бинарную последовательность на подпоследовательности того же типа, используя sep в качестве разделительной строки. Если maxsplit задан и неотрицателен, выполняется не более maxsplit разбиений (следовательно, список будет содержать не более
maxsplit+1элементов). Если maxsplit не указан или равен-1, то количество разбиений не ограничено (выполняются все возможные разбиения).Если задан sep, последовательные разделители не группируются вместе и считаются разделителями пустых подпоследовательностей (например,
b'1,,2'.split(b',')возвращает[b'1', b'', b'2']). Аргумент sep может состоять из многобайтовой последовательности в качестве одного разделителя. Разбиение пустой последовательности с указанным разделителем возвращает[b'']или[bytearray(b'')]в зависимости от типа разделяемого объекта. Аргумент sep может быть любым объектом, подобным байтам bytes-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''] >>> b'1<>2<>3<4'.split(b'<>') [b'1', b'2', b'3<4']
Если sep не указан или равен
None, применяется другой алгоритм разбиения: последовательности последовательных пробельных символов ASCII считаются одним разделителем, и результат не будет содержать пустых строк в начале или конце, если последовательность имеет ведущие или завершающие пробелы. Следовательно, разбиение пустой последовательности или последовательности, состоящей только из пробельных символов ASCII без указанного разделителя, возвращает[].Например:
>>> b'1 2 3'.split() [b'1', b'2', b'3'] >>> b'1 2 3'.split(maxsplit=1) [b'1', b'2 3'] >>> b' 1 2 3 '.split() [b'1', b'2', b'3']
-
bytes.strip([chars]) -
bytearray.strip([chars]) -
Возвращает копию последовательности с удаленными указанными ведущими и завершающими байтами. Аргумент chars — это бинарная последовательность, указывающая множество значений байтов, которые должны быть удалены; название метода связано с тем, что он обычно используется с символами ASCII. Если он опущен или
None, аргумент chars по умолчанию удаляет пробельные символы ASCII. Аргумент chars не является префиксом или суффиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.strip() b'spacious' >>> b'www.example.com'.strip(b'cmowz.') b'example'
Бинарная последовательность значений байтов для удаления может быть любым объектом, подобным байтам bytes-like object.
Note
Версия этого метода для bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
Следующие методы для объектов bytes и bytearray предполагают использование совместимых с ASCII бинарных форматов и не должны применяться к произвольным бинарным данным. Обратите внимание, что все методы bytearray в этом разделе не работают на месте и вместо этого создают новые объекты.
-
bytes.capitalize() -
bytearray.capitalize() -
Возвращает копию последовательности, где каждый байт интерпретируется как символ ASCII, а первый байт — в верхнем регистре, а остальные — в нижнем. Не-ASCII значения байтов передаются без изменений.
Note
Версия этого метода для bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.expandtabs(tabsize=8) -
bytearray.expandtabs(tabsize=8) -
Возвращает копию последовательности, где все символы табуляции ASCII заменяются одним или несколькими пробелами ASCII в зависимости от текущего столбца и заданного размера табуляции. Позиции табуляции встречаются каждые tabsize байтов (по умолчанию 8, что дает позиции табуляции в столбцах 0, 8, 16 и так далее). Для расширения последовательности текущий столбец устанавливается в ноль, и последовательность проверяется байт за байтом. Если байт является символом табуляции ASCII (
b'\t'), в результат вставляется один или несколько пробелов, пока текущий столбец не станет равен следующей позиции табуляции. (Сам символ табуляции не копируется.) Если текущий байт является символом перевода строки ASCII (b'\n') или возврата каретки (b'\r'), он копируется, и текущий столбец сбрасывается в ноль. Любое другое значение байта копируется без изменений, и текущий столбец увеличивается на один независимо от того, как значение байта отображается при выводе:>>> b'01\t012\t0123\t01234'.expandtabs() b'01 012 0123 01234' >>> b'01\t012\t0123\t01234'.expandtabs(4) b'01 012 0123 01234'
Note
Версия этого метода для bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.isalnum() -
bytearray.isalnum() -
Возвращает
True, если все байты в последовательности являются алфавитными символами ASCII или десятичными цифрами ASCII, и последовательность не пуста,Falseв противном случае. Алфавитные символы ASCII — это значения байтов в последовательностиb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. Десятичные цифры ASCII — это значения байтов в последовательностиb'0123456789'.Например:
>>> b'ABCabc1'.isalnum() True >>> b'ABC abc1'.isalnum() False
-
bytes.isalpha() -
bytearray.isalpha() -
Возвращает
True, если все байты в последовательности являются алфавитными символами ASCII, и последовательность не пуста,Falseв противном случае. Алфавитные символы ASCII — это значения байтов в последовательностиb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.Например:
>>> b'ABCabc'.isalpha() True >>> b'ABCabc1'.isalpha() False
-
bytes.isascii() -
bytearray.isascii() -
Возвращает
True, если последовательность пуста или все байты в последовательности являются ASCII,Falseв противном случае. Байты ASCII находятся в диапазоне 0-0x7F.Added in version 3.7.
-
bytes.isdigit() -
bytearray.isdigit() -
Возвращает
True, если все байты в последовательности являются десятичными цифрами ASCII, и последовательность не пуста,Falseв противном случае. Десятичные цифры ASCII — это значения байтов в последовательностиb'0123456789'.Например:
>>> b'1234'.isdigit() True >>> b'1.23'.isdigit() False
-
bytes.islower() -
bytearray.islower() -
Возвращает
True, если в последовательности есть хотя бы один строчный символ ASCII и нет прописных символов ASCII,Falseв противном случае.Например:
>>> b'hello world'.islower() True >>> b'Hello world'.islower() False
Строчные символы ASCII — это значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Прописные символы ASCII — это значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
-
bytes.isspace() -
bytearray.isspace() -
Возвращает
True, если все байты в последовательности являются пробелами ASCII, и последовательность не пуста,Falseв противном случае. Пробельные символы ASCII — это значения байтов в последовательностиb' \t\n\r\x0b\f'(пробел, табуляция, перевод строки, возврат каретки, вертикальная табуляция, перевод страницы).
-
bytes.istitle() -
bytearray.istitle() -
Возвращает
True, если последовательность является заголовком ASCII, и последовательность не пуста,Falseв противном случае. См.bytes.title()для получения более подробной информации об определении «заголовка».Например:
>>> b'Hello World'.istitle() True >>> b'Hello world'.istitle() False
-
bytes.isupper() -
bytearray.isupper() -
Возвращает
True, если в последовательности есть хотя бы один прописной алфавитный символ ASCII и нет строчных символов ASCII,Falseв противном случае.Например:
>>> b'HELLO WORLD'.isupper() True >>> b'Hello world'.isupper() False
Строчные символы ASCII — это значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Прописные символы ASCII — это значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
-
bytes.lower() -
bytearray.lower() -
Возвращает копию последовательности, в которой все заглавные ASCII-символы преобразованы в соответствующие строчные.
Например:
>>> b'Hello World'.lower() b'hello world'
Строчные ASCII-символы — это значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы — это значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Примечание
Версия метода для типа
bytearrayне работает на месте — она всегда создаёт новый объект, даже если никаких изменений не было.
-
bytes.splitlines(keepends=False) -
bytearray.splitlines(keepends=False) -
Возвращает список строк в двоичной последовательности, разбивая их по границам ASCII-строк. Этот метод использует подход «универсальные переводы строк» для разделения строк. Разделители строк не включаются в результирующий список, если не указано keepends и оно не равно true.
Например:
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines() [b'ab c', b'', b'de fg', b'kl'] >>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) [b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
В отличие от
split(), когда задан разделитель sep, этот метод возвращает пустой список для пустой строки, и конечный разделитель строки не приводит к добавлению дополнительной строки:>>> b"".split(b'\n'), b"Two lines\n".split(b'\n') ([b''], [b'Two lines', b'']) >>> b"".splitlines(), b"One line\n".splitlines() ([], [b'One line'])
-
bytes.swapcase() -
bytearray.swapcase() -
Возвращает копию последовательности, в которой все строчные ASCII-символы преобразованы в соответствующие заглавные, а заглавные — в строчные.
Например:
>>> b'Hello World'.swapcase() b'hELLO wORLD'
Строчные ASCII-символы — это значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы — это значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.В отличие от
str.swapcase(), всегда верно, чтоbin.swapcase().swapcase() == binдля двоичных версий. Преобразование регистров симметрично в ASCII, хотя это не всегда верно для произвольных кодовых точек Юникода.Примечание
Версия метода для типа
bytearrayне работает на месте — она всегда создаёт новый объект, даже если никаких изменений не было.
-
bytes.title() -
bytearray.title() -
Возвращает версию последовательности в стиле заголовка, где слова начинаются с заглавной ASCII-буквы, а остальные символы — строчные. Незаглавленные байты остаются неизменными.
Например:
>>> b'Hello world'.title() b'Hello World'
Строчные ASCII-символы — это значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы — это значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. Все другие значения байтов не изменяются.Алгоритм использует простое независимое от языка определение слова как группы последовательных букв. Это определение работает во многих контекстах, но означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может не соответствовать желаемому результату:
>>> b"they're bill's friends from the UK".title() b"They'Re Bill'S Friends From The Uk"
Решение для апострофов можно сконструировать, используя регулярные выражения:
>>> import re >>> def titlecase(s): ... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0)[0:1].upper() + ... mo.group(0)[1:].lower(), ... s) ... >>> titlecase(b"they're bill's friends.") b"They're Bill's Friends."Примечание
Версия метода для типа
bytearrayне работает на месте — она всегда создаёт новый объект, даже если никаких изменений не было.
-
bytes.upper() -
bytearray.upper() -
Возвращает копию последовательности, в которой все строчные ASCII-символы преобразованы в соответствующие заглавные.
Например:
>>> b'Hello World'.upper() b'HELLO WORLD'
Строчные ASCII-символы — это значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы — это значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Примечание
Версия метода для типа
bytearrayне работает на месте — она всегда создаёт новый объект, даже если никаких изменений не было.
-
bytes.zfill(width) -
bytearray.zfill(width) -
Возвращает копию последовательности, заполненную ASCII-цифрами до длины width. Префикс знака (
b'+'/b'-') обрабатывается вставкой заполнения после символа знака, а не перед ним. Для объектовbytesисходная последовательность возвращается, если width меньше или равноlen(seq).Например:
>>> b"42".zfill(5) b'00042' >>> b"-42".zfill(5) b'-0042'
Примечание
Версия метода для типа
bytearrayне работает на месте — она всегда создаёт новый объект, даже если никаких изменений не было.
printf-стиль форматирования байтовых объектов
Примечание
Операции форматирования, описанные здесь, имеют ряд особенностей, которые приводят к нескольким распространённым ошибкам (например, к неправильному отображению кортежей и словарей). Если значение, которое нужно вывести, может быть кортежем или словарем, заключите его в кортеж.
Объекты типа bytes (bytes/bytearray) имеют одну уникальную встроенную операцию: оператор % (modulo). Он также известен как оператор форматирования или интерполяции байтовых объектов. Данный оператор, применяемый к format % values (где format — это байтовый объект), заменяет спецификации преобразования в format нулём или более элементов из values. Эффект аналогичен использованию оператора sprintf() в языке C.
Если format требует одного аргумента, values может быть одним объектом, не являющимся кортежем. [5] В противном случае, values должен быть кортежем с ровно таким количеством элементов, которое указано в байтовом объекте форматирования, или одним объектом типа отображения (например, словарем).
Спецификатор преобразования состоит из двух или более символов и имеет следующие компоненты, которые должны следовать в указанном порядке:
- Символ
'%', отмечающий начало спецификатора. - Ключ отображения (необязательный), представляющий собой скобочную последовательность символов (например,
(somename)). - Флаги преобразования (необязательные), которые влияют на результат некоторых типов преобразования.
- Минимальная ширина поля (необязательная). Если она задаётся как
'*'(звёздочка), фактическая ширина считывается из следующего элемента кортежа в values, а объект для преобразования следует за минимальной шириной поля и необязательной точностью. - Точность (необязательная), заданная как
'.'(точка) и значение точности. Если она задаётся как'*'(звёздочка), фактическая точность считывается из следующего элемента кортежа в values, а значение для преобразования следует за точностью. - Модификатор длины (необязательный).
- Тип преобразования.
Когда правым аргументом является словарь (или другой тип отображения), форматирование в байтовом объекте обязательно должно включать скобочный ключ отображения в этот словарь, вставленный сразу после символа '%'. Ключ отображения выбирает значение для форматирования из отображения. Например:
>>> print(b'%(language)s has %(number)03d quote types.' %
... {b'language': b"Python", b"number": 2})
b'Python has 002 quote types.'
В этом случае в формате не может быть спецификаторов *, поскольку они требуют последовательный список параметров.
Символы флагов преобразования:
Флаг | Значение |
|---|---|
| Преобразование значения будет использовать «альтернативную форму» (если она определена). |
| Преобразование будет дополняться нулями слева для числовых значений. |
| Преобразованное значение выравнивается слева (переопределяет |
| (пробел) Перед положительным числом (или пустой строкой), полученными в результате знакового преобразования, должен быть пробел. |
| Символ знака ( |
Модификатор длины (h, l, или L), возможно, присутствует, но игнорируется, так как он не нужен в Python – например, %ld идентичен %d.
Типы преобразования:
Преобразование | Значение | Примечания |
|---|---|---|
| Целое число со знаком в десятичной форме. | |
| Целое число со знаком в десятичной форме. | |
| Целое число со знаком в восьмеричной форме. | (1) |
| Устаревший тип – он идентичен | (8) |
| Целое число со знаком в шестнадцатеричной форме (маленькие буквы). | (2) |
| Целое число со знаком в шестнадцатеричной форме (заглавные буквы). | (2) |
| Число с плавающей точкой в экспоненциальном формате (маленькие буквы). | (3) |
| Число с плавающей точкой в экспоненциальном формате (заглавные буквы). | (3) |
| Число с плавающей точкой в десятичной форме. | (3) |
| Число с плавающей точкой в десятичной форме. | (3) |
| Число с плавающей точкой. Использует экспоненциальный формат (маленькие буквы), если показатель степени меньше -4 или не меньше точности, в противном случае — десятичный формат. | (4) |
| Число с плавающей точкой. Использует экспоненциальный формат (заглавные буквы), если показатель степени меньше -4 или не меньше точности, в противном случае — десятичный формат. | (4) |
| Один байт (принимает целое число или объект типа один байт). | |
| Байты (любой объект, который следует протоколу буфера буферизации или имеет метод | (5) |
|
| (6) |
| Байты (преобразует любой объект Python с помощью | (5) |
|
| (7) |
| Аргумент не преобразуется, в результате получается символ |
Примечания:
- Альтернативная форма вставляет префикс «0o» перед первой цифрой в восьмеричном представлении.
- Альтернативная форма вставляет префиксы «0x» или «0X» перед первой цифрой в шестнадцатеричном представлении (в зависимости от используемого формата
'x'или'X'). -
Альтернативная форма всегда включает десятичную точку, даже если за ней нет цифр.
Точность определяет количество цифр после десятичной точки и по умолчанию равна 6.
-
Альтернативная форма всегда включает десятичную точку, и хвостовые нули не удаляются, в отличие от стандартного поведения.
Точность определяет количество значащих цифр до и после десятичной точки и по умолчанию равна 6.
- Если точность равна
N, вывод усекается доNсимволов. -
b'%s'устарело, но не будет удалено в серии 3.x. -
b'%r'устарело, но не будет удалено в серии 3.x. - См. PEP 237.
Примечание
Версия метода bytearray этого метода не работает на месте — она всегда возвращает новый объект, даже если никаких изменений не было сделано.
См. также
PEP 461 - Добавление форматирования % к bytes и bytearray
Добавлена в версии 3.5.
Представления памяти
memoryview объекты позволяют коду Python получать доступ к внутренним данным объекта, поддерживающего протокол буфера протокол буфера, без копирования.
-
class memoryview(object) -
Создаёт
memoryview, который ссылается на object. object должен поддерживать протокол буфера. Встроенные объекты, поддерживающие протокол буфера, включаютbytesиbytearray.У
memoryviewесть понятие элемента, которое является атомной единицей памяти, обрабатываемой исходным объектом. Для многих простых типов, таких какbytesиbytearray, элемент — это один байт, но другие типы, такие какarray.array, могут иметь элементы большего размера.len(view)равно длинеtolist, которая является вложенным списком представления представления. Еслиview.ndim = 1, это равно количеству элементов в представлении.Изменено в версии 3.12: Если
view.ndim == 0,len(view)теперь вызываетTypeErrorвместо возвращения 1.Атрибут
itemsizeдаст вам количество байтов в одном элементе.memoryviewподдерживает срезы и индексирование для доступа к данным. Одномерный срез приведёт к созданию подпредставления:>>> v = memoryview(b'abcefg') >>> v[1] 98 >>> v[-1] 103 >>> v[1:4] <memory at 0x7f3ddc9f4350> >>> bytes(v[1:4]) b'bce'
Если
formatявляется одним из встроенных форматов спецификаторов из модуляstruct, индексирование целым числом или кортежем целых чисел также поддерживается и возвращает один элемент с правильным типом. Одномерные представления памяти могут быть индексированы целым числом или кортежем из одного целого числа. Многомерные представления памяти могут быть индексированы кортежами ровно из ndim целых чисел, где ndim — число измерений. Нульмерные представления памяти могут быть индексированы пустым кортежем.Вот пример с не байтовым форматом:
>>> import array >>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]Если базовый объект изменяемый, представление памяти поддерживает присваивание срезу в одном измерении. Изменение размера запрещено:
>>> data = bytearray(b'abcefg') >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b'z') >>> data bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data bytearray(b'z123fg') >>> v[2:3] = b'spam' Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b'spam' >>> data bytearray(b'z1spam')
Одномерные представления памяти типов хешируемых (только для чтения) с форматами ‘B’, ‘b’ или ‘c’ также хешируемы. Хеш определяется как
hash(m) == hash(m.tobytes()):>>> v = memoryview(b'abcefg') >>> hash(v) == hash(b'abcefg') True >>> hash(v[2:4]) == hash(b'ce') True >>> hash(v[::-2]) == hash(b'abcefg'[::-2]) True
Изменено в версии 3.3: Одномерные представления памяти теперь можно срезать. Одномерные представления памяти с форматами ‘B’, ‘b’ или ‘c’ теперь являются хешируемыми.
Изменено в версии 3.4: Представление памяти теперь автоматически регистрируется с
collections.abc.SequenceИзменено в версии 3.5: Теперь представления памяти могут быть индексированы кортежем целых чисел.
memoryviewимеет несколько методов:-
__eq__(exporter) -
Представление памяти и экспортер PEP 3118 равны, если их формы эквивалентны, и если все соответствующие значения равны при интерпретации кодов форматов соответствующих операндов с использованием синтаксиса
struct.Для подмножества строк форматов
struct, которые в настоящее время поддерживаютсяtolist(),vиwравны, еслиv.tolist() == w.tolist():>>> import array >>> a = array.array('I', [1, 2, 3, 4, 5]) >>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array('b', [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() TrueЕсли ни одна из строк формата не поддерживается модулем
struct, то объекты всегда сравниваются как неравные (даже если строки формата и содержимое буфера идентичны):>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b FalseОбратите внимание, что, как и в случае с числами с плавающей запятой,
v is wне подразумеваетv == wдля объектов memoryview.Изменено в версии 3.3: Предыдущие версии сравнивали сырую память, игнорируя формат элементов и логическую структуру массива.
-
tobytes(order='C') -
Возвращает данные в буфере в виде строки байтов. Это эквивалентно вызову конструктора
bytesна представлении памяти.>>> m = memoryview(b"abc") >>> m.tobytes() b'abc' >>> bytes(m) b'abc'
Для несмежных массивов результат равен уплощенному представлению списка, где все элементы преобразуются в байты.
tobytes()поддерживает все строки форматов, включая те, что не находятся в синтаксисе модуляstruct.Добавлена в версии 3.8: order может быть {‘C’, ‘F’, ‘A’}. Когда order — ‘C’ или ‘F’, данные исходного массива преобразуются в порядок C или Fortran. Для смежных представлений ‘A’ возвращает точную копию физической памяти. В частности, сохраняется порядок памяти Fortran в памяти. Для несмежных представлений данные сначала преобразуются в порядок C. order=None эквивалентно order=’C’.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строку, содержащую две шестнадцатеричные цифры для каждого байта в буфере.
>>> m = memoryview(b"abc") >>> m.hex() '616263'
Добавлена в версии 3.5.
Изменено в версии 3.8: Аналогично
bytes.hex(),memoryview.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
-
tolist() -
Возвращает данные в буфере в виде списка элементов.
>>> memoryview(b'abc').tolist() [97, 98, 99] >>> import array >>> a = array.array('d', [1.1, 2.2, 3.3]) >>> m = memoryview(a) >>> m.tolist() [1.1, 2.2, 3.3]
-
toreadonly() -
Возвращает представление памяти только для чтения. Исходный объект представления памяти не изменяется.
>>> m = memoryview(bytearray(b'abc')) >>> mm = m.toreadonly() >>> mm.tolist() [97, 98, 99] >>> mm[0] = 42 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot modify read-only memory >>> m[0] = 43 >>> mm.tolist() [43, 98, 99]
Добавлена в версии 3.8.
-
release() -
Освобождает базовый буфер, экспонированный объектом представления памяти. Многие объекты выполняют специальные действия, когда на них удерживается представление (например,
bytearrayвременно запрещает изменение размера); поэтому вызов release() полезен для снятия этих ограничений (и освобождения любых висячих ресурсов) как можно скорее.После вызова этого метода любая дальнейшая операция с представлением вызывает
ValueError(кромеrelease()самого себя, который можно вызывать несколько раз):>>> m = memoryview(b'abc') >>> m.release() >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
Для аналогичного эффекта можно использовать протокол управления контекстом, используя оператор
with:>>> with memoryview(b'abc') as m: ... m[0] ... 97 >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
Добавлена в версии 3.2.
-
-
cast(format[, shape]) -
Преобразование memoryview в новый формат или форму. shape по умолчанию равно
[byte_length//new_itemsize], что означает, что результирующее представление будет одномерным. Возвращаемое значение — новое memoryview, но сам буфер не копируется. Поддерживаемые преобразования: 1D -> C-contiguous и C-contiguous -> 1D.Формат назначения ограничен одним нативным форматом элемента в синтаксисе
struct. Один из форматов должен быть форматом байта (‘B’, ‘b’ или ‘c’). Длина байтов результата должна совпадать с исходной длиной. Обратите внимание, что все длины байтов могут зависеть от операционной системы.Преобразование 1D/long в 1D/unsigned bytes:
>>> import array >>> a = array.array('l', [1,2,3]) >>> x = memoryview(a) >>> x.format 'l' >>> x.itemsize 8 >>> len(x) 3 >>> x.nbytes 24 >>> y = x.cast('B') >>> y.format 'B' >>> y.itemsize 1 >>> len(y) 24 >>> y.nbytes 24Преобразование 1D/unsigned bytes в 1D/char:
>>> b = bytearray(b'zyz') >>> x = memoryview(b) >>> x[0] = b'a' Traceback (most recent call last): ... TypeError: memoryview: invalid type for format 'B' >>> y = x.cast('c') >>> y[0] = b'a' >>> b bytearray(b'ayz')Преобразование 1D/bytes в 3D/ints в 1D/signed char:
>>> import struct >>> buf = struct.pack("i"*12, *list(range(12))) >>> x = memoryview(buf) >>> y = x.cast('i', shape=[2,2,3]) >>> y.tolist() [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] >>> y.format 'i' >>> y.itemsize 4 >>> len(y) 2 >>> y.nbytes 48 >>> z = y.cast('b') >>> z.format 'b' >>> z.itemsize 1 >>> len(z) 48 >>> z.nbytes 48Преобразование 1D/unsigned long в 2D/unsigned long:
>>> buf = struct.pack("L"*6, *list(range(6))) >>> x = memoryview(buf) >>> y = x.cast('L', shape=[2,3]) >>> len(y) 2 >>> y.nbytes 48 >>> y.tolist() [[0, 1, 2], [3, 4, 5]]Добавлен в версии 3.3.
Изменено в версии 3.5: Исходный формат больше не ограничен при преобразовании в представление байтов.
Также доступны несколько только для чтения атрибутов:
-
obj -
Базовый объект memoryview:
>>> b = bytearray(b'xyz') >>> m = memoryview(b) >>> m.obj is b True
Добавлен в версии 3.3.
-
nbytes -
nbytes == product(shape) * itemsize == len(m.tobytes()). Это количество места в байтах, которое массив будет использовать в непрерывном представлении. Оно не обязательно равноlen(m):>>> import array >>> a = array.array('i', [1,2,3,4,5]) >>> m = memoryview(a) >>> len(m) 5 >>> m.nbytes 20 >>> y = m[::2] >>> len(y) 3 >>> y.nbytes 12 >>> len(y.tobytes()) 12Многомерные массивы:
>>> import struct >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)]) >>> x = memoryview(buf) >>> y = x.cast('d', shape=[3,4]) >>> y.tolist() [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]] >>> len(y) 3 >>> y.nbytes 96Добавлен в версии 3.3.
-
readonly -
Булево значение, указывающее, является ли память только для чтения.
-
format -
Строка, содержащая формат (в стиле модуля
struct) для каждого элемента в представлении. Memoryview может быть создан из экспортеров с произвольными строками формата, но некоторые методы (например,tolist()) ограничены нативными форматами одного элемента.Изменено в версии 3.3: Формат
'B'теперь обрабатывается в соответствии с синтаксисом модуля struct. Это означает, чтоmemoryview(b'abc')[0] == b'abc'[0] == 97.
-
itemsize -
Размер в байтах каждого элемента memoryview:
>>> import array, struct >>> m = memoryview(array.array('H', [32000, 32001, 32002])) >>> m.itemsize 2 >>> m[0] 32000 >>> struct.calcsize('H') == m.itemsize True
-
ndim -
Целое число, указывающее количество измерений многомерного массива, которое представляет память.
-
shape -
Кортеж целых чисел длиной
ndim, задающий форму памяти как N-мерного массива.Изменено в версии 3.3: Пустой кортеж вместо
Noneпри ndim = 0.
-
strides -
Кортеж целых чисел длиной
ndim, задающий размер в байтах для доступа к каждому элементу для каждого измерения массива.Изменено в версии 3.3: Пустой кортеж вместо
Noneпри ndim = 0.
-
suboffsets -
Используется внутри для массивов типа PIL. Значение является только информативным.
-
c_contiguous -
Булево значение, указывающее, является ли память C-contiguous.
Добавлен в версии 3.3.
-
f_contiguous -
Булево значение, указывающее, является ли память Fortran contiguous.
Добавлен в версии 3.3.
-
contiguous -
Булево значение, указывающее, является ли память contiguous.
Добавлен в версии 3.3.
-
Типы множеств — set, frozenset
Объект set — это неупорядоченное множество различных хешируемых объектов. Типичные применения включают проверку принадлежности, удаление дубликатов из последовательности и вычисление математических операций, таких как пересечение, объединение, разность и симметрическая разность. (Для других контейнеров см. встроенные классы dict, list и tuple, и модуль collections.)
Как и другие коллекции, множества поддерживают x in set, len(set), и for x in
set. Будучи неупорядоченным множеством, множества не записывают позицию элемента или порядок вставки. Соответственно, множества не поддерживают индексирование, срезы или другие виды последовательностей.
В настоящее время существует два встроенных типа множеств, set и frozenset. Тип set является изменяемым — содержимое можно изменить с помощью методов, таких как add() и remove(). Поскольку он изменяемый, у него нет значения хэша и он не может быть использован ни в качестве ключа словаря, ни в качестве элемента другого множества. Тип frozenset является неизменяемым и хешируемым — его содержимое нельзя изменить после создания; поэтому он может использоваться в качестве ключа словаря или элемента другого множества.
Непустые множества (не frozensets) могут быть созданы путем размещения списка элементов через запятую в фигурных скобках, например: {'jack', 'sjoerd'}, кроме конструктора set.
Конструкторы обоих классов работают одинаково:
-
class set([iterable]) -
class frozenset([iterable]) -
Возвращает новый объект set или frozenset, элементы которого взяты из iterable. Элементы множества должны быть хешируемыми. Для представления множеств множеств внутренние множества должны быть объектами
frozenset. Если iterable не указано, возвращается новое пустое множество.Множества могут быть созданы несколькими способами:
- Используйте список элементов, разделенных запятыми, в фигурных скобках:
{'jack', 'sjoerd'} - Используйте генератор множеств:
{c for c in 'abracadabra' if c not in 'abc'} - Используйте конструктор типа:
set(),set('foobar'),set(['a', 'b', 'foo'])
Экземпляры
setиfrozensetпредоставляют следующие операции:- len(s)
-
Возвращает количество элементов в множестве s (мощность s).
- x in s
-
Проверяет принадлежность x к s.
- x not in s
-
Проверяет отсутствие принадлежности x к s.
-
isdisjoint(other) -
Возвращает
Trueесли множество не имеет общих элементов с other. Множества не пересекаются тогда и только тогда, когда их пересечение — пустое множество.
-
issubset(other) - set <= other
-
Проверяет, являются ли все элементы множества элементами other.
- set < other
-
Проверяет, является ли множество надмножеством other, то есть,
set <= other and set != other.
-
issuperset(other) - set >= other
-
Проверяет, являются ли все элементы other элементами множества.
- set > other
-
Проверяет, является ли множество собственным надмножеством other, то есть,
set >= other and set != other.
-
union(*others) - set | other | ...
-
Возвращает новое множество с элементами из множества и всех других.
-
intersection(*others) - set & other & ...
-
Возвращает новое множество с элементами, общими для множества и всех других.
-
difference(*others) - set - other - ...
-
Возвращает новое множество с элементами из множества, которых нет в других.
-
symmetric_difference(other) - set ^ other
-
Возвращает новое множество с элементами, которые присутствуют либо в множестве, либо в other, но не в обоих.
-
copy() -
Возвращает поверхностную копию множества.
Обратите внимание, что не-операционные версии
union(),intersection(),difference(),symmetric_difference(),issubset()иissuperset()методов принимают в качестве аргумента любой итерируемый объект. В отличие от них, их операторные аналоги требуют, чтобы их аргументы были множествами. Это исключает такие подверженные ошибкам конструкции, какset('abc') & 'cbs'в пользу более удобочитаемыхset('abc').intersection('cbs').И
set, иfrozensetподдерживают сравнения множеств с множествами. Два множества равны тогда и только тогда, когда каждый элемент каждого множества содержится в другом (каждое является подмножеством другого). Одно множество меньше другого множества тогда и только тогда, когда первое множество является собственным подмножеством второго множества (является подмножеством, но не равно). Одно множество больше другого множества тогда и только тогда, когда первое множество является собственным надмножеством второго множества (является надмножеством, но не равно).Экземпляры
setсравниваются с экземплярамиfrozensetна основе их элементов. Например,set('abc') == frozenset('abc')возвращаетTrue, и так жеset('abc') in set([frozenset('abc')]).Сравнения подмножеств и равенства не обобщаются на функцию полного упорядочения. Например, любые два непустых непересекающихся множества не равны и не являются подмножествами друг друга, поэтому все из следующего возвращают
False:a<b,a==b, илиa>b.Так как множества определяют только частичное упорядочение (отношения подмножеств), вывод метода
list.sort()для списков множеств не определён.Элементы множества, как и ключи словарей, должны быть хешируемыми.
Бинарные операции, которые смешивают экземпляры
setсfrozenset, возвращают тип первого операнда. Например:frozenset('ab') | set('bc')возвращает экземплярfrozenset.В следующей таблице перечислены операции, доступные для
set, которые не применяются к неизменяемым экземплярамfrozenset:-
update(*others) - set |= other | ...
-
Обновляет множество, добавляя элементы из всех других.
-
intersection_update(*others) - set &= other & ...
-
Обновляет множество, оставляя только элементы, которые есть в нем и во всех остальных.
-
difference_update(*others) - set -= other | ...
-
Обновляет множество, удаляя элементы, которые есть в других.
-
symmetric_difference_update(other) - set ^= other
-
Обновляет множество, оставляя только элементы, присутствующие в любом из множеств, но не в обоих.
-
add(elem) -
Добавляет элемент elem в множество.
-
remove(elem) -
Удаляет элемент elem из множества. Вызывает
KeyError, если elem не содержится в множестве.
-
discard(elem) -
Удаляет элемент elem из множества, если он присутствует.
-
pop() -
Удаляет и возвращает произвольный элемент из множества. Вызывает
KeyError, если множество пустое.
-
clear() -
Удаляет все элементы из множества.
Обратите внимание, что не-операционные версии
update(),intersection_update(),difference_update()иsymmetric_difference_update()методов принимают любой итерируемый объект в качестве аргумента.Обратите внимание, что аргумент elem к методам
__contains__(),remove()иdiscard()может быть множеством. Для поддержки поиска эквивалентного frozenset создается временный frozenset из elem. - Используйте список элементов, разделенных запятыми, в фигурных скобках:
Типы отображений — dict
Объект отображения сопоставляет хешируемые значения произвольным объектам. Отображения — это изменяемые объекты. В настоящее время существует только один стандартный тип отображения — словарь. (Для других контейнеров см. встроенные классы list, set и tuple, а также модуль collections.)
Ключи словаря — это почти произвольные значения. Значения, которые не являются хешируемыми, то есть значения, содержащие списки, словари или другие изменяемые типы (которые сравниваются по значению, а не по идентичности объекта), не могут использоваться в качестве ключей. Значения, которые сравниваются как равные (например, 1, 1.0, и True), могут быть использованы взаимозаменяемо для индексации одной и той же записи словаря.
-
class dict(**kwargs) - класс dict(mapping, **kwargs)
- класс 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)
Если позиционный аргумент не задан, создаётся пустой словарь. Если позиционный аргумент задан и это объект отображения, создаётся словарь с теми же парами ключ-значение, что и у объекта отображения. В противном случае, позиционный аргумент должен быть объектом итерируемого объекта. Каждый элемент в итерируемом объекте должен быть итерируемым объектом ровно с двумя объектами. Первый объект каждого элемента становится ключом в новом словаре, а второй — соответствующим значением. Если ключ встречается более одного раза, последнее значение для этого ключа становится соответствующим значением в новом словаре.
Если заданы ключевые аргументы, ключевые аргументы и их значения добавляются в словарь, созданный из позиционного аргумента. Если добавляемый ключ уже присутствует, значение от ключевого аргумента заменяет значение от позиционного аргумента.
Для иллюстрации, следующие примеры все возвращают словарь, равный
{"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]в value.
- del d[key]
-
Удаляет
d[key]из d. Возбуждает исключениеKeyError, если key отсутствует в отображении.
- key in d
-
Возвращает
Trueесли d имеет ключ key, иначеFalse.
- key not in d
-
Эквивалентно
not key in d.
- iter(d)
-
Возвращает итератор по ключам словаря. Это сокращение для
iter(d.keys()).
-
clear() -
Удаляет все элементы из словаря.
-
copy() -
Возвращает поверхностную копию словаря.
-
classmethod fromkeys(iterable, value=None, /) -
Создаёт новый словарь с ключами из iterable и значениями, установленными в value.
fromkeys()— это метод класса, который возвращает новый словарь. value по умолчаниюNone. Все значения ссылаются только на один экземпляр, поэтому для value обычно не имеет смысла использовать изменяемый объект, такой как пустой список. Чтобы получить отдельные значения, используйте генератор словаря вместо этого.
-
get(key, default=None) -
Возвращает значение для key, если key находится в словаре, иначе default. Если default не задан, он по умолчанию
None, так что этот метод никогда не возбуждаетKeyError.
-
items() -
Возвращает новый вид элементов словаря (пары
(key, value)). См. документацию по объектам представления.
-
keys() -
Возвращает новый вид ключей словаря. См. документацию по объектам представления.
-
pop(key[, default]) -
Если key находится в словаре, удаляет его и возвращает его значение, иначе возвращает default. Если default не задан и key не находится в словаре, возбуждается
KeyError.
-
popitem() -
Удаляет и возвращает пару
(key, value)из словаря. Пары возвращаются в порядке LIFO.popitem()полезно для деструктивной итерации по словарю, как часто используется в алгоритмах множеств. Если словарь пуст, вызовpopitem()возбуждаетKeyError.Изменено в версии 3.7: Порядок LIFO теперь гарантирован. В предыдущих версиях
popitem()возвращал произвольную пару ключ/значение.
- reversed(d)
-
Возвращает обратный итератор по ключам словаря. Это сокращение для
reversed(d.keys()).Добавлена в версии 3.8.
-
setdefault(key, default=None) -
Если key находится в словаре, возвращает его значение. Если нет, вставляет key со значением default и возвращает default. default по умолчанию
None.
-
update([other]) -
Обновляет словарь парами ключ/значение из other, перезаписывая существующие ключи. Возвращает
None.update()принимает либо другой объект словаря, либо итерируемый объект пар ключ/значение (как кортежи или другие итерируемые объекты длиной два). Если заданы ключевые аргументы, словарь затем обновляется этими парами ключ/значение:d.update(red=1, blue=2).
-
values() -
Возвращает новый вид значений словаря. См. документацию по объектам представления.
Сравнение на равенство между одним
dict.values()представлением и другим всегда возвращаетFalse. Это также относится к сравнениямdict.values()с самим собой:>>> d = {'a': 1} >>> d.values() == d.values() False
- d | other
-
Создаёт новый словарь со слитыми ключами и значениями из d и other, которые оба должны быть словарями. Значения other имеют приоритет, когда d и other имеют общие ключи.
Добавлена в версии 3.9.
- d |= other
-
Обновляет словарь d ключами и значениями из other, который может быть либо отображением, либо итерируемым объектом пар ключ/значение. Значения other имеют приоритет, когда d и other имеют общие ключи.
Добавлена в версии 3.9.
Словари сравниваются на равенство тогда и только тогда, когда они имеют те же пары
(key, value)(независимо от порядка). Сравнения порядка (‘<’, ‘<=’, ‘>=’, ‘>’) возбуждаютTypeError.Словари сохраняют порядок вставки. Обратите внимание, что обновление ключа не влияет на порядок. Ключи, добавленные после удаления, вставляются в конец.
- Используйте список пар
-
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(d) ['one', 'two', 'three', 'four'] >>> list(d.values()) [1, 2, 3, 4] >>> d["one"] = 42 >>> d {'one': 42, 'two': 2, 'three': 3, 'four': 4} >>> del d["two"] >>> d["two"] = None >>> d {'one': 42, 'three': 3, 'four': 4, 'two': None}Изменено в версии 3.7: Порядок словарей гарантированно соответствует порядку вставки. Это поведение было деталью реализации CPython с 3.6.
Словари и представления словарей обратимы.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(reversed(d)) ['four', 'three', 'two', 'one'] >>> list(reversed(d.values())) [4, 3, 2, 1] >>> list(reversed(d.items())) [('four', 4), ('three', 3), ('two', 2), ('one', 1)]Изменено в версии 3.8: Словари теперь обратимы.
См. также
types.MappingProxyType можно использовать для создания только для чтения представления dict.
Представления словарей
Объекты, возвращаемые dict.keys(), dict.values() и dict.items(), являются представлениями. Они предоставляют динамическое представление записей словаря, что означает, что при изменении словаря представление отражает эти изменения.
Представления словарей можно перебирать, чтобы получить соответствующие данные, и они поддерживают проверки на вхождение:
- len(dictview)
-
Возвращает количество записей в словаре.
- iter(dictview)
-
Возвращает итератор по ключам, значениям или парам (представленным как кортежи из
(key, value)) в словаре.Ключи и значения перебираются в порядке вставки. Это позволяет создавать пары
(value, key)с помощьюzip():pairs = zip(d.values(), d.keys()). Другой способ создать тот же список -pairs = [(v, k) for (k, v) in d.items()].Итерация по представлениям во время добавления или удаления записей в словаре может вызвать
RuntimeErrorили не перебрать все записи.Изменено в версии 3.7: Порядок словарей гарантированно соответствует порядку вставки.
- x in dictview
-
Возвращает
True, если x находится в ключах, значениях или парах (в последнем случае x должен быть кортежем(key, value)).
- reversed(dictview)
-
Возвращает обратный итератор по ключам, значениям или парам словаря. Представление будет перебираться в обратном порядке вставки.
Изменено в версии 3.8: Представления словарей теперь обратимы.
- dictview.mapping
-
Возвращает
types.MappingProxyType, который оборачивает исходный словарь, к которому относится представление.Добавлена в версии 3.10.
Представления ключей являются множествами, так как их записи уникальны и хешируемы. Представления пар также имеют операции множеств, так как пары (ключ, значение) уникальны, а ключи хешируемы. Если все значения в представлении пар также хешируемы, то представление пар может взаимодействовать с другими множествами. (Представления значений не рассматриваются как множества, так как записи обычно не уникальны.) Для представлений множеств доступны все операции, определенные для абстрактного базового класса collections.abc.Set (например, ==, <, или ^). При использовании операторов множеств представления множеств принимают любой итерируемый объект в качестве другого операнда, в отличие от множеств, которые принимают только множества в качестве входных данных.
Пример использования представления словаря:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
...
>>> print(n)
504
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']
>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}
True
>>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}
True
>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy({'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500
Типы менеджеров контекста
Оператор with Python поддерживает понятие контекста выполнения, определяемого менеджером контекста. Это реализуется с помощью пары методов, которые позволяют пользовательским классам определять контекст выполнения, который вводится перед выполнением тела оператора и выходит, когда оператор заканчивается:
-
contextmanager.__enter__() -
Входит в контекст выполнения и возвращает либо этот объект, либо другой объект, связанный с контекстом выполнения. Возвращаемое значение этого метода привязано к идентификатору в
as-аузе операторовwithс использованием этого менеджера контекста.Пример менеджера контекста, который возвращает сам себя, является объектом файла. Объекты файлов возвращают себя из __enter__(), чтобы allow
open()быть использованным в качестве выражения контекста в оператореwith.Пример менеджера контекста, который возвращает связанный объект, - это объект, возвращаемый
decimal.localcontext(). Эти менеджеры устанавливают активный контекст десятичных чисел в копию исходного контекста десятичных чисел и затем возвращают копию. Это позволяет вносить изменения в текущий контекст десятичных чисел в теле оператораwithбез влияния на код вне оператораwith.
-
contextmanager.__exit__(exc_type, exc_val, exc_tb) -
Выходит из контекста выполнения и возвращает логическое значение, указывающее, следует ли подавлять исключение, возникшее во время выполнения. Если во время выполнения тела оператора
withвозникло исключение, аргументы содержат тип, значение и отслеживание стека исключения. В противном случае все три аргумента равныNone.Возврат истинного значения из этого метода заставит оператор
withподавить исключение и продолжить выполнение с оператором, непосредственно следующего заwithоператором. В противном случае исключение продолжает распространяться после завершения выполнения этого метода. Исключение, возникшее во время выполнения этого метода, заменит любое исключение, возникшее в теле оператораwith.Перевыбрасывать исключение явно не следует - вместо этого этот метод должен возвращать ложное значение, чтобы указать, что метод завершился успешно и не хочет подавлять возникшее исключение. Это позволяет коду управления контекстом легко обнаружить, произошел ли сбой в методе
__exit__().
Python определяет несколько менеджеров контекста для поддержки простой синхронизации потоков, своевременного закрытия файлов или других объектов и более простого управления активным контекстом десятичной арифметики. Конкретные типы не обрабатываются специально, кроме их реализации протокола управления контекстом. См. модуль contextlib для некоторых примеров.
Генераторы Python и декоратор contextlib.contextmanager предоставляют удобный способ реализации этих протоколов. Если функция-генератор снабжена декоратором contextlib.contextmanager, она вернёт менеджер контекста, реализующий необходимые методы __enter__() и __exit__(), а не итератор, созданный функцией-генератором без декоратора.
Обратите внимание, что для этих методов нет специальных слотов в структуре типа для объектов Python в API Python/C. Расширенные типы, желающие определить эти методы, должны предоставлять их как обычный доступный метод Python. По сравнению с накладными расходами на установку контекста выполнения, накладные расходы на поиск в словаре класса ничтожны.
Типы аннотаций типов — Обобщённый псевдоним, Объединение
Основные встроенные типы для аннотаций типов — Обобщённый псевдоним и Объединение.
Тип обобщённого псевдонима
GenericAlias объекты обычно создаются путём индексирования класса. Они чаще всего используются с контейнерными классами, такими как list или dict. Например, list[int] — это GenericAlias объект, созданный путём индексирования класса list с аргументом int. GenericAlias объекты предназначены в первую очередь для использования с аннотациями типов.
Примечание
Обычно класс можно индексировать только в том случае, если он реализует специальный метод __class_getitem__().
GenericAlias объект выступает в качестве прокси для обобщённого типа, реализуя параметризованные обобщения.
Для контейнерного класса аргумент(ы), переданный(ые) в индексирование класса, могут указывать тип(ы) элементов, которые содержит объект. Например, set[bytes] может использоваться в аннотациях типов для обозначения set, в котором все элементы имеют тип bytes.
Для класса, который определяет __class_getitem__(), но не является контейнером, аргумент(ы), переданный(ые) в индексирование класса, часто указывают тип(ы) возвращаемых значений одного или нескольких методов, определённых в объекте. Например, regular expressions можно использовать как для типа данных str, так и для типа данных bytes:
- Если
x = re.search('foo', 'foo'),xбудет объектом re.Match, где значения, возвращаемыеx.group(0)иx[0], будут иметь типstr. Мы можем представить этот тип объекта в аннотациях типов с помощьюGenericAliasre.Match[str]. - Если
y = re.search(b'bar', b'bar'), (обратите внимание наbдляbytes),yтакже будет экземпляромre.Match, но значения, возвращаемыеy.group(0)иy[0], будут иметь типbytes. В аннотациях типов мы бы представили этот вид объектов re.Match с помощьюre.Match[bytes].
GenericAlias объекты являются экземплярами класса types.GenericAlias, который также может использоваться для создания GenericAlias объектов напрямую.
- T[X, Y, ...]
-
Создаёт
GenericAliasпредставляющий типTс параметрами типов X, Y и другими в зависимости от используемогоT. Например, функция, ожидающаяlist, содержащую элементы типаfloat:def average(values: list[float]) -> float: return sum(values) / len(values)Ещё один пример для объектов отображения, используя
dict, который является обобщённым типом, ожидающим два параметра типа, представляющих тип ключа и тип значения. В этом примере функция ожидаетdictс ключами типаstrи значениями типаint:def send_post_request(url: str, body: dict[str, int]) -> None: ...
Встроенные функции isinstance() и issubclass() не принимают GenericAlias типы в качестве второго аргумента:
>>> isinstance([1, 2], list[str]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: isinstance() argument 2 cannot be a parameterized generic
Интерпретатор Python не проверяет аннотации типов. Это распространяется на обобщённые типы и их параметры типа. При создании объекта контейнера из GenericAlias, элементы в контейнере не проверяются на соответствие их типу. Например, следующий код не рекомендуется, но выполнится без ошибок:
>>> t = list[str] >>> t([1, 2, 3]) [1, 2, 3]
Кроме того, параметризованные обобщения стирают параметры типа во время создания объекта:
>>> t = list[str] >>> type(t) <class 'types.GenericAlias'> >>> l = t() >>> type(l) <class 'list'>
Вызов repr() или str() на обобщении отображает параметризованный тип:
>>> repr(list[int]) 'list[int]' >>> str(list[int]) 'list[int]'
Метод __getitem__() обобщённых контейнеров будет генерировать исключение, чтобы предотвратить ошибки, подобные dict[str][str]:
>>> dict[str][str] Traceback (most recent call last): ... TypeError: dict[str] is not a generic class
Однако такие выражения допустимы при использовании переменных типа. Индекс должен иметь столько же элементов, сколько и элементов переменных типа в GenericAlias объекте __args__.
>>> from typing import TypeVar
>>> Y = TypeVar('Y')
>>> dict[str, Y][int]
dict[str, int]
Стандартные обобщённые классы
Следующие классы стандартной библиотеки поддерживают параметризованные обобщения. Этот список не является исчерпывающим.
tuplelistdictsetfrozensettypecollections.dequecollections.defaultdictcollections.OrderedDictcollections.Countercollections.ChainMapcollections.abc.Awaitablecollections.abc.Coroutinecollections.abc.AsyncIterablecollections.abc.AsyncIteratorcollections.abc.AsyncGeneratorcollections.abc.Iterablecollections.abc.Iteratorcollections.abc.Generatorcollections.abc.Reversiblecollections.abc.Containercollections.abc.Collectioncollections.abc.Callablecollections.abc.Setcollections.abc.MutableSetcollections.abc.Mappingcollections.abc.MutableMappingcollections.abc.Sequencecollections.abc.MutableSequencecollections.abc.ByteStringcollections.abc.MappingViewcollections.abc.KeysViewcollections.abc.ItemsViewcollections.abc.ValuesViewcontextlib.AbstractContextManagercontextlib.AbstractAsyncContextManagerdataclasses.Fieldfunctools.cached_propertyfunctools.partialmethodos.PathLikequeue.LifoQueuequeue.Queuequeue.PriorityQueuequeue.SimpleQueue- re.Pattern
- re.Match
shelve.BsdDbShelfshelve.DbfilenameShelfshelve.Shelftypes.MappingProxyTypeweakref.WeakKeyDictionaryweakref.WeakMethodweakref.WeakSetweakref.WeakValueDictionary
Особые атрибуты объектов GenericAlias
Все параметризованные обобщения реализуют специальные атрибуты только для чтения.
-
genericalias.__origin__ -
Этот атрибут указывает на непараметризованный обобщённый класс:
>>> list[int].__origin__ <class 'list'>
-
genericalias.__args__ -
Этот атрибут представляет собой
tuple(возможно, длиной 1) типов обобщений, переданных в исходный__class_getitem__()обобщённого класса:>>> dict[str, list[int]].__args__ (<class 'str'>, list[int])
-
genericalias.__parameters__ -
Этот атрибут — вычисляемое по требованию кортеж (возможно, пустой) уникальных переменных типов, найденных в
__args__:>>> from typing import TypeVar >>> T = TypeVar('T') >>> list[T].__parameters__ (~T,)Примечание
Объект
GenericAliasс параметрамиtyping.ParamSpecможет не иметь корректных__parameters__после подстановки, посколькуtyping.ParamSpecпредназначен в первую очередь для статической проверки типов.
-
genericalias.__unpacked__ -
Булево значение, равное True, если алиас был распакован с помощью оператора
*(см.TypeVarTuple).Добавлен в версии 3.11.
См. также
- PEP 484 - Указатели типов
-
Введение в систему Python для указателей типов.
- PEP 585 - Обобщения в стандартных коллекциях с помощью указателей типов
-
Введение возможности параметризации классов стандартной библиотеки, при условии, что они реализуют специальный метод класса
__class_getitem__(). -
Generics, user-defined generics andtyping.Generic -
Документация по реализации обобщённых классов, которые могут быть параметризованы во время выполнения и понятны статическим проверкам типов.
Добавлен в версии 3.9.
Тип объединения
Объект объединения хранит значение операции | (побитовое ИЛИ) над несколькими объектами типов. Эти типы предназначены в первую очередь для аннотаций типов. Выражение типа объединения обеспечивает более чистый синтаксис подсказок типов по сравнению с typing.Union.
- X | Y | ...
-
Определяет объект объединения, который хранит типы X, Y и так далее.
X | Yозначает либо X, либо Y. Это эквивалентноtyping.Union[X, Y]. Например, следующая функция ожидает аргумент типаintилиfloat:def square(number: int | float) -> int | float: return number ** 2Примечание
Оператор
|не может быть использован во время выполнения для определения объединений, где один или несколько членов являются вперёд объявленными ссылками. Например,int | "Foo", где"Foo"является ссылкой на класс, который ещё не определён, завершится ошибкой во время выполнения. Для объединений, которые включают вперёд объявленные ссылки, представьте всё выражение как строку, например"int | Foo".
- union_object == other
-
Объекты объединения могут быть проверены на равенство с другими объектами объединения. Подробности:
-
Объединения объединений сглаживаются:
(int | str) | float == int | str | float
-
Избыточные типы удаляются:
int | str | int == int | str
-
При сравнении объединений порядок игнорируется:
int | str == str | int
-
Он совместим с
typing.Union:int | str == typing.Union[int, str]
-
Типы по умолчанию могут быть записаны как объединение с
None:str | None == typing.Optional[str]
-
- isinstance(obj, union_object)
- issubclass(obj, union_object)
-
Вызовы
isinstance()иissubclass()также поддерживаются с объектом объединения:>>> isinstance("", int | str) TrueОднако, параметризованные обобщения в объектах объединения проверить нельзя:
>>> isinstance(1, int | list[int]) # short-circuit evaluation True >>> isinstance([1], int | list[int]) Traceback (most recent call last): ... TypeError: isinstance() argument 2 cannot be a parameterized generic
Доступ к типу объединения, показанному пользователю, возможен из types.UnionType и используется для проверок isinstance(). Создать объект из типа нельзя:
>>> import types >>> isinstance(int | str, types.UnionType) True >>> types.UnionType() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot create 'types.UnionType' instances
Примечание
Метод __or__() для объектов типов был добавлен для поддержки синтаксиса X | Y. Если метакласс реализует __or__(), объединение может его переопределить:
>>> class M(type): ... def __or__(self, other): ... return "Hello" ... >>> class C(metaclass=M): ... pass ... >>> C | int 'Hello' >>> int | C int | C
См. также
PEP 604 – PEP, предлагающий синтаксис X | Y и тип объединения.
Добавлен в версии 3.10.
Другие встроенные типы
Интерпретатор поддерживает несколько других типов объектов. Большинство из них поддерживают только одну или две операции.
Модули
Единственная специальная операция над модулем — доступ к атрибутам: m.name, где m — модуль, а name — имя, определённое в таблице символов m. Атрибуты модулей можно присваивать. (Обратите внимание, что операция import не является, строго говоря, операцией над объектом модуля; import
foo не требует существования объекта модуля foo, а требует (внешнего) определения модуля foo где-то.)
Специальным атрибутом каждого модуля является __dict__. Это словарь, содержащий таблицу символов модуля. Изменение этого словаря фактически изменит таблицу символов модуля, но прямое присваивание атрибуту __dict__ невозможно (можно записать m.__dict__['a'] = 1, что определяет m.a как 1, но нельзя записать m.__dict__ = {}). Изменение __dict__ напрямую не рекомендуется.
Встроенные в интерпретатор модули записываются так: <module 'sys'
(built-in)>. Если они загружаются из файла, они записываются как <module 'os' from
'/usr/local/lib/pythonX.Y/os.pyc'>.
Классы и экземпляры классов
См. Объекты, значения и типы и Определения классов для получения информации об этом.
Функции
Объекты функций создаются с помощью определений функций. Единственная операция над объектом функции — вызов: func(argument-list).
На самом деле существует два типа объектов функций: встроенные функции и функции, определённые пользователем. Оба типа поддерживают одну и ту же операцию (вызов функции), но реализация отличается, поэтому и типы объектов разные.
См. Определения функций для получения дополнительной информации.
Методы
Методы — это функции, вызываемые с помощью записи в виде атрибутов. Существует два типа: встроенные методы (например, append() для списков) и методы экземпляров класса. Встроенные методы описываются вместе с типами, которые их поддерживают.
Если вы получаете доступ к методу (функции, определённой в пространстве имён класса) через экземпляр, вы получаете специальный объект: связанный метод (также называемый методом экземпляра) объект. При вызове он добавит аргумент self в список аргументов. Связанные методы имеют два специальных атрибута только для чтения: m.__self__ — это объект, над которым работает метод, и m.__func__ — функция, реализующая метод. Вызов m(arg-1, arg-2, ..., arg-n) полностью эквивалентен вызову m.__func__(m.__self__, arg-1, arg-2, ...,
arg-n).
Как и объекты функций, объекты связанных методов поддерживают получение произвольных атрибутов. Однако, поскольку атрибуты методов фактически хранятся в базовом объекте функции (method.__func__), установка атрибутов методов для связанных методов запрещена. Попытка установить атрибут для метода приводит к возбуждению AttributeError. Для установки атрибута метода необходимо явно установить его в базовом объекте функции:
>>> class C: ... def method(self): ... pass ... >>> c = C() >>> c.method.whoami = 'my name is method' # can't set on the method Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'method' object has no attribute 'whoami' >>> c.method.__func__.whoami = 'my name is method' >>> c.method.whoami 'my name is method'
См. Методы экземпляров для получения дополнительной информации.
Объекты кода
Объекты кода используются реализацией для представления «псевдоскомпилированного» исполняемого Python-кода, такого как тело функции. Они отличаются от объектов функций тем, что не содержат ссылки на свою глобальную среду выполнения. Объекты кода возвращаются встроенной функцией compile() и могут быть извлечены из объектов функций через их атрибут __code__. См. также модуль code.
Доступ к __code__ вызывает событие аудита аудита object.__getattr__ с аргументами obj и "__code__".
Объект кода можно выполнить или оценить, передав его (вместо строки исходного кода) встроенным функциям exec() или eval().
См. Стандартную иерархию типов для получения дополнительной информации.
Объекты типов
Объекты типов представляют различные типы объектов. Тип объекта доступен с помощью встроенной функции type(). Нет специальных операций над типами. Стандартный модуль types определяет имена всех стандартных встроенных типов.
Типы записываются следующим образом: <class 'int'>.
Объект None
Этот объект возвращается функциями, которые явно не возвращают значение. Он не поддерживает никаких специальных операций. Существует ровно один объект None, имеющий имя None (встроенное имя). type(None)() создаёт тот же синглтон.
Он записывается как None.
Объект Ellipsis
Этот объект обычно используется для срезов (см. Срезы). Он не поддерживает никаких специальных операций. Существует ровно один объект Ellipsis, имеющий имя Ellipsis (встроенное имя). type(Ellipsis)() создаёт синглтон Ellipsis.
Он записывается как Ellipsis или ....
Объект NotImplemented
Этот объект возвращается из сравнений и бинарных операций, когда они должны обрабатывать типы, которые они не поддерживают. См. Сравнения для получения дополнительной информации. Существует ровно один объект NotImplemented. type(NotImplemented)() создаёт экземпляр синглтона.
Он записывается как NotImplemented.
Внутренние объекты
См. Стандартную иерархию типов для этой информации. В ней описаны объекты стека кадров, объекты отладки стека и объекты срезов.
Особые атрибуты
Реализация добавляет несколько специальных только для чтения атрибутов к нескольким типам объектов, где они уместны. Некоторые из них не сообщаются встроенной функцией dir().
-
object.__dict__ -
Словарь или другой объект отображения, используемый для хранения атрибутов объекта (изменяемых).
-
instance.__class__ -
Класс, к которому принадлежит экземпляр класса.
-
class.__bases__ -
Кортеж базовых классов объекта класса.
-
definition.__name__ -
Имя класса, функции, метода, дескриптора или генератора экземпляра.
-
definition.__qualname__ -
Полное имя класса, функции, метода, дескриптора или генератора экземпляра.
Добавлен в версии 3.3.
-
definition.__type_params__ -
Параметры типа для обобщенных классов, функций и параметров типа.
Добавлен в версии 3.12.
-
class.__mro__ -
Этот атрибут является кортежем классов, которые рассматриваются при поиске базовых классов во время разрешения методов.
-
class.mro() -
Этот метод может быть переопределен метаклассом для настройки порядка разрешения методов для его экземпляров. Вызывается при создании класса и его результат хранится в
__mro__.
-
class.__subclasses__() -
Каждый класс хранит список слабых ссылок на его непосредственные подклассы. Этот метод возвращает список всех таких ссылок, которые все еще активны. Список упорядочен по порядку определения. Пример:
>>> int.__subclasses__() [<class 'bool'>, <enum 'IntEnum'>, <flag 'IntFlag'>, <class 're._constants._NamedIntConstant'>]
Ограничение длины преобразования целых чисел в строки
CPython имеет глобальное ограничение для преобразования между int и str для смягчения атак с отказом в обслуживании. Это ограничение только применяется к десятичным или другим числам, не являющимся степенями двойки. Шестнадцатеричные, восьмеричные и двоичные преобразования не ограничены. Ограничение можно настроить.
Тип int в CPython представляет собой целое число произвольной длины, хранящееся в двоичном формате (обычно известное как «большое число»). Не существует алгоритма, который может преобразовать строку в двоичное целое число или двоичное целое число в строку за линейное время, если основание не является степенью 2. Даже лучшие известные алгоритмы для основания 10 имеют подквадратичную сложность. Преобразование большого значения, такого как int('1' *
500_000) , может занять более секунды на быстром процессоре.
Ограничение размера преобразования предлагает практический способ избежать CVE-2020-10735.
Ограничение применяется к количеству символов цифр в строке ввода или вывода, когда используется нелинейный алгоритм преобразования. Подчеркивания и знак не учитываются при подсчете ограничения.
При превышении ограничения генерируется исключение ValueError:
>>> import sys
>>> sys.set_int_max_str_digits(4300) # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit
>>> i = int('2' * 4300)
>>> len(str(i))
4300
>>> i_squared = i*i
>>> len(str(i_squared))
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
>>> len(hex(i_squared))
7144
>>> assert int(hex(i_squared), base=16) == i*i # Hexadecimal is unlimited.
Значение по умолчанию – 4300 цифр, как указано в sys.int_info.default_max_str_digits. Самое низкое ограничение, которое можно настроить, составляет 640 цифр, как указано в sys.int_info.str_digits_check_threshold.
Проверка:
>>> import sys
>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info
>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info
>>> msg = int('578966293710682886880994035146873798396722250538762761564'
... '9252925514383915483333812743580549779436104706260696366600'
... '571186405732').to_bytes(53, 'big')
...
Добавлен в версии 3.11.
Затронутые API
Ограничение применяется только к потенциально медленным преобразованиям между int и str или bytes:
-
int(string)с основанием по умолчанию 10. -
int(string, base)для всех оснований, которые не являются степенью 2. -
str(integer). -
repr(integer). - любое другое преобразование строки в основание 10, например
f"{integer}","{}".format(integer), илиb"%d" % integer.
Ограничения не применяются к функциям с линейным алгоритмом:
-
int(string, base)с основанием 2, 4, 8, 16 или 32. -
int.from_bytes()иint.to_bytes(). -
hex(),oct(),bin(). - Форматное задание мини-язык для шестнадцатеричных, восьмеричных и двоичных чисел.
-
strвfloat. -
strвdecimal.Decimal.
Настройка ограничения
Перед запуском Python вы можете использовать переменную среды или флаг командной строки интерпретатора для настройки ограничения:
-
PYTHONINTMAXSTRDIGITS, напримерPYTHONINTMAXSTRDIGITS=640 python3для установки ограничения на 640 илиPYTHONINTMAXSTRDIGITS=0 python3для отключения ограничения. -
-X int_max_str_digits, напримерpython3 -X int_max_str_digits=640 -
sys.flags.int_max_str_digitsсодержит значениеPYTHONINTMAXSTRDIGITSили-X int_max_str_digits. Если обе переменная среды и-Xопция установлены,-Xопция имеет приоритет. Значение -1 указывает, что оба параметра не были установлены, поэтому использовалось значениеsys.int_info.default_max_str_digitsво время инициализации.
В коде вы можете проверить текущее ограничение и установить новое с помощью этих API sys:
-
sys.get_int_max_str_digits()иsys.set_int_max_str_digits()— это методы получения и установки интерпретатора глобального ограничения. У подинтерпретаторов есть свои собственные ограничения.
Сведения о значениях по умолчанию и минимуме можно найти в sys.int_info:
-
sys.int_info.default_max_str_digits— это ограничение по умолчанию, скомпилированное в исходный код. -
sys.int_info.str_digits_check_threshold— это самое низкое допустимое значение ограничения (кроме 0, которое отключает его).
Добавлен в версии 3.11.
Внимание
Установка низкого ограничения может привести к проблемам. Хотя это редкое явление, существуют коды, содержащие целочисленные константы в десятичной форме в исходном коде, которые превышают минимальный порог. Следствием настройки ограничения является то, что исходный код Python, содержащий десятичные целочисленные литералы, длиннее, чем ограничение, столкнется с ошибкой во время парсинга, обычно во время запуска, импорта или даже установки — в любой момент, когда актуальный .pyc для кода ещё не существует. Обходным путём для исходного кода, содержащего такие большие константы, является их преобразование в шестнадцатеричную форму, так как для неё нет ограничения.
Тщательно протестируйте приложение, если вы используете низкое ограничение. Убедитесь, что ваши тесты выполняются с ограничением, установленным на раннем этапе через среду или флаг, чтобы это ограничение применялось во время запуска и даже во время любого этапа установки, который может вызвать Python для предварительной компиляции .py исходных кодов в .pyc файлы.
Рекомендуемая конфигурация
Значение по умолчанию sys.int_info.default_max_str_digits ожидается разумным для большинства приложений. Если вашему приложению требуется другое ограничение, установите его с помощью версии Python не зависящего от кода с точки входа, так как эти API были добавлены в исправления с исправлениями безопасности в версиях до 3.12.
Пример:
>>> import sys >>> if hasattr(sys, "set_int_max_str_digits"): ... upper_bound = 68000 ... lower_bound = 4004 ... current_limit = sys.get_int_max_str_digits() ... if current_limit == 0 or current_limit > upper_bound: ... sys.set_int_max_str_digits(upper_bound) ... elif current_limit < lower_bound: ... sys.set_int_max_str_digits(lower_bound)
Если вам нужно полностью отключить его, установите значение 0.
Примечания
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/stdtypes.html