Встроенные типы
В следующих разделах описаны стандартные типы, встроенные в интерпретатор.
Основные встроенные типы — это числовые типы, последовательности, отображения, классы, экземпляры и исключения.
Некоторые классы коллекций являются изменяемыми. Методы, которые добавляют, удаляют или переставляют элементы на месте и не возвращают конкретный элемент, никогда не возвращают сам экземпляр коллекции, а 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
Существует три различных числовых типа: целые числа, числа с плавающей точкой и комплексные числа. Кроме того, логические значения являются подтипом целых чисел. Целые числа имеют неограниченную точность. Числа с плавающей точкой обычно реализуются в C с использованием double; сведения о точности и внутреннем представлении чисел с плавающей точкой для машины, на которой выполняется программа, доступны в sys.float_info. Комплексные числа имеют действительную и мнимую части, каждая из которых является числом с плавающей точкой. Чтобы извлечь эти части из комплексного числа z, используйте z.real и z.imag. (Стандартная библиотека включает дополнительные числовые типы: fractions.Fraction для рациональных чисел и decimal.Decimal для чисел с плавающей точкой с задаваемой пользователем точностью.)
Числа создаются числовыми литералами или в результате вызова встроенных функций и операторов. Целочисленные литералы без дополнительных обозначений (включая шестнадцатеричные, восьмеричные и двоичные числа) дают целые числа. Числовые литералы, содержащие десятичную точку или знак экспоненты, дают числа с плавающей точкой. Добавление 'j' или 'J' к числовому литералу даёт мнимое число (комплексное число с нулевой действительной частью), которое можно сложить с целым числом или числом с плавающей точкой, получив комплексное число с действительной и мнимой частями.
Python полностью поддерживает смешанную арифметику: если двоичный арифметический оператор получает операнды разных числовых типов, операнд с «более узким» типом преобразуется к типу другого операнда, где целое число уже, чем число с плавающей точкой, а число с плавающей точкой уже, чем комплексное число. Сравнение чисел разных типов выполняется так, как если бы сравнивались их точные значения. [2]
Для создания чисел определённого типа можно использовать конструкторы int(), float() и complex().
Все числовые типы (кроме complex) поддерживают следующие операции (приоритеты операций см. в разделе Приоритет операторов):
Операция | Результат | Примечания | Полная документация |
|---|---|---|---|
| сумма x и y | ||
| разность x и y | ||
| произведение x и y | ||
| частное от деления x на y | ||
| частное от деления x на y с округлением вниз | (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или любые их эквиваленты в Юникоде (кодовые точки со свойствомNd).Полный список кодовых точек со свойством
Ndсм. по адресу https://www.unicode.org/Public/14.0.0/ucd/extracted/DerivedNumericType.txt.
Все типы 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 должен быть объектом типа bytes-like или итерируемым объектом, выдающим байты.
Аргумент 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.
Дополнительные методы типа float
Тип float реализует numbers.Real — абстрактный базовый класс. У типа float также есть следующие дополнительные методы.
-
float.as_integer_ratio() -
Возвращает пару целых чисел, отношение которых в точности равно исходному числу с плавающей точкой, причём знаменатель положителен. Для бесконечностей возникает исключение
OverflowError, а для значений NaN — исключениеValueError.
-
float.is_integer() -
Возвращает
True, если экземпляр float является конечным целым значением, иFalseв противном случае:>>> (-2.0).is_integer() True >>> (3.2).is_integer() False
Два метода поддерживают преобразование в шестнадцатеричные строки и обратно. Поскольку числа с плавающей точкой в Python хранятся во внутреннем представлении как двоичные числа, преобразование числа с плавающей точкой в десятичную строку или обратно обычно сопровождается небольшой ошибкой округления. Напротив, шестнадцатеричные строки позволяют точно представлять и задавать числа с плавающей точкой. Это может быть полезно при отладке и в численных вычислениях.
-
float.hex() -
Возвращает представление числа с плавающей точкой в виде шестнадцатеричной строки. Для конечных чисел с плавающей точкой это представление всегда содержит начальный
0x, завершающийpи экспоненту.
-
classmethod float.fromhex(s) -
Метод класса, возвращающий число с плавающей точкой, представленное шестнадцатеричной строкой s. В начале и в конце строки s могут находиться пробельные символы.
Обратите внимание: float.hex() — это метод экземпляра, а float.fromhex() — метод класса.
Шестнадцатеричная строка имеет следующий формат:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
где необязательный sign может быть + или -, integer и fraction — строки из шестнадцатеричных цифр, а exponent — десятичное целое число с необязательным знаком в начале. Регистр не имеет значения, и в целой или дробной части должна присутствовать хотя бы одна шестнадцатеричная цифра. Этот синтаксис похож на синтаксис, заданный в разделе 6.4.4.2 стандарта C99, а также на синтаксис, используемый начиная с Java 1.5. В частности, результат float.hex() можно использовать как шестнадцатеричный литерал числа с плавающей точкой в коде на C или Java, а шестнадцатеричные строки, созданные с помощью спецификатора формата %a в C или Double.toHexString в Java, принимаются функцией float.fromhex().
Обратите внимание, что экспонента записывается в десятичной, а не шестнадцатеричной системе и задаёт степень числа 2, на которую умножается коэффициент. Например, шестнадцатеричная строка 0x3.a7p10 представляет число с плавающей точкой (3 + 10./16 + 7./16**2) * 2.0**10, или 3740.0:
>>> float.fromhex('0x3.a7p10')
3740.0
Обратное преобразование 3740.0 даёт другую шестнадцатеричную строку, представляющую то же число:
>>> float.hex(3740.0) '0x1.d380000000000p+11'
Хеширование числовых типов
Для чисел x и y, которые могут иметь разные типы, требуется, чтобы hash(x) == hash(y) всякий раз, когда x == y (подробности см. в документации метода __hash__()). Для простоты реализации и эффективной работы с различными числовыми типами (включая int, float, decimal.Decimal и fractions.Fraction) хеш числовых типов в Python основан на единой математической функции, определённой для любого рационального числа и, следовательно, применимой ко всем экземплярам int и fractions.Fraction, а также ко всем конечным экземплярам float и decimal.Decimal. По сути, эта функция вычисляется по модулю P для фиксированного простого числа P. Значение P доступно в Python как атрибут modulus объекта sys.hash_info.
Особенность реализации CPython: в настоящее время используется простое число P = 2**31 - 1 на машинах с 32-разрядными целыми типами C long и P = 2**61 - 1 на машинах с 64-разрядными целыми типами C long.
Подробные правила:
- Если
x = m / n— неотрицательное рациональное число, аnне делится наP, определитеhash(x)какm * invmod(n, P) % P, гдеinvmod(n, P)задаёт обратный элемент дляnпо модулюP. - Если
x = m / n— неотрицательное рациональное число иnделится наP(ноmне делится), тоnне имеет обратного элемента по модулюP, и приведённое выше правило неприменимо; в этом случае определитеhash(x)как константуsys.hash_info.inf. - Если
x = m / n— отрицательное рациональное число, определитеhash(x)как-hash(-x). Если полученное значение хеша равно-1, замените его на-2. - Для положительной или отрицательной бесконечности соответственно в качестве значений хеша используются
sys.hash_info.infи-sys.hash_info.inf. - Для числа типа
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, эквивалентный встроенной функции hash, для вычисления хеша рационального числа, float или complex:
import sys, math
def hash_fraction(m, n):
"""Compute the hash of a rational number m / n.
Assumes m and n are integers, with n positive.
Equivalent to hash(fractions.Fraction(m, n)).
"""
P = sys.hash_info.modulus
# Remove common factors of P. (Unnecessary if m and n already coprime.)
while m % P == n % P == 0:
m, n = m // P, n // P
if n % P == 0:
hash_value = sys.hash_info.inf
else:
# Fermat's Little Theorem: pow(n, P-1, P) is 1, so
# pow(n, P-2, P) gives the inverse of n modulo P.
hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
if m < 0:
hash_value = -hash_value
if hash_value == -1:
hash_value = -2
return hash_value
def hash_float(x):
"""Compute the hash of a float x."""
if math.isnan(x):
return object.__hash__(x)
elif math.isinf(x):
return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
else:
return hash_fraction(*x.as_integer_ratio())
def hash_complex(z):
"""Compute the hash of a complex number z."""
hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
# do a signed reduction modulo 2**sys.hash_info.width
M = 2**(sys.hash_info.width - 1)
hash_value = (hash_value & (M - 1)) - (hash_value & M)
if hash_value == -1:
hash_value = -2
return hash_value
Типы итераторов
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.
Типы последовательностей — list, tuple, range
Существует три основных типа последовательностей: списки, кортежи и объекты range. Дополнительные типы последовательностей, предназначенные для обработки двоичных данных и текстовых строк, описаны в отдельных разделах.
Общие операции над последовательностями
Операции из следующей таблицы поддерживаются большинством типов последовательностей — как изменяемых, так и неизменяемых. 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 (не включая его). Если k положительно, значения i и j, превышающиеlen(s), заменяются на него. Если k отрицательно, значения i и j, превышающиеlen(s) - 1, заменяются на него. Если i или j не заданы либо равныNone, они становятся значениями «конца» (конец зависит от знака k). Обратите внимание: k не может быть равно нулю. Если k равноNone, оно рассматривается как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) |
Примечания:
- t должен иметь ту же длину, что и заменяемый срез.
- Необязательный аргумент i по умолчанию равен
-1, поэтому по умолчанию удаляется и возвращается последний элемент. -
remove()вызывает исключениеValueError, если x не найден в s. - Метод
reverse()изменяет последовательность на месте, чтобы экономить память при разворачивании длинной последовательности. Чтобы напомнить пользователям о побочном эффекте метода, он не возвращает развёрнутую последовательность. -
clear()иcopy()включены для совместимости с интерфейсами изменяемых контейнеров, не поддерживающих операции среза (например,dictиset).copy()не входит в ABC-классcollections.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()позволяет преобразовать функцию cmp в стиле 2.x в функцию key.reverse — логическое значение. Если оно равно
True, элементы списка сортируются так, как если бы порядок каждого сравнения был обратным.Этот метод изменяет последовательность на месте, чтобы экономить память при сортировке длинной последовательности. Чтобы напомнить пользователям о побочном эффекте метода, он не возвращает отсортированную последовательность (для явного создания нового экземпляра отсортированного списка используйте
sorted()).Метод
sort()гарантированно является стабильным. Сортировка стабильна, если она гарантирует, что относительный порядок элементов, сравниваемых как равные, не изменится. Это полезно при сортировке в несколько этапов (например, сначала по отделу, затем по уровню зарплаты).Примеры сортировки и краткое руководство см. в разделе Руководство по сортировке.
Особенность реализации CPython: Во время сортировки списка поведение при попытке изменить список или даже просмотреть его содержимое не определено. Реализация Python на C делает список пустым на время сортировки и вызывает исключение
ValueError, если обнаруживает, что список был изменён во время сортировки.
- С помощью пары квадратных скобок, обозначающих пустой список:
Кортежи
Кортежи — это неизменяемые последовательности, обычно используемые для хранения наборов разнородных данных (например, пар элементов, создаваемых встроенной функцией enumerate()). Кортежи также используются, когда требуется неизменяемая последовательность однотипных данных (например, для хранения в экземпляре set или dict).
-
class tuple([iterable]) -
Кортежи можно создать несколькими способами:
- С помощью пары круглых скобок, обозначающих пустой кортеж:
() - С помощью завершающей запятой для кортежа из одного элемента:
a,или(a,) - Разделяя элементы запятыми:
a, b, cили(a, b, c) - С помощью встроенного типа
tuple():tuple()илиtuple(iterable)
Конструктор создаёт кортеж, элементы которого совпадают с элементами iterable и расположены в том же порядке. iterable может быть последовательностью, контейнером, поддерживающим итерацию, или объектом-итератором. Если iterable уже является кортежем, он возвращается без изменений. Например,
tuple('abc')возвращает('a', 'b', 'c'), аtuple( [1, 2, 3] )возвращает(1, 2, 3). Если аргумент не задан, конструктор создаёт новый пустой кортеж,().Обратите внимание: кортеж создаётся именно запятой, а не круглыми скобками. Скобки необязательны, кроме случая пустого кортежа и случаев, когда они необходимы для устранения синтаксической неоднозначности. Например,
f(a, b, c)— это вызов функции с тремя аргументами, аf((a, b, c))— вызов функции с кортежем из трёх элементов в качестве единственного аргумента.Кортежи реализуют все общие операции над последовательностями.
- С помощью пары круглых скобок, обозначающих пустой кортеж:
Для наборов разнородных данных, к которым удобнее обращаться по имени, а не по индексу, collections.namedtuple() может быть предпочтительнее обычного объекта-кортежа.
Диапазоны
Тип range представляет неизменяемую последовательность чисел и обычно используется для выполнения заданного количества итераций в циклах for.
-
class range(stop) - class range(start, stop[, step])
-
Аргументы конструктора range должны быть целыми числами (встроенными
intили любыми объектами, реализующими специальный метод__index__()). Если аргумент step не задан, по умолчанию используется1. Если аргумент start не задан, по умолчанию используется0. Если step равен нулю, возникает исключениеValueError.При положительном значении step содержимое диапазона
rопределяется формулойr[i] = start + step*i, гдеi >= 0иr[i] < stop.При отрицательном значении step содержимое диапазона по-прежнему определяется формулой
r[i] = start + step*i, но ограничения имеют видi >= 0иr[i] > stop.Объект range будет пустым, если
r[0]не удовлетворяет ограничению на значение. Диапазоны поддерживают отрицательные индексы, но они интерпретируются как индексы от конца последовательности, определяемой положительными индексами.Диапазоны, содержащие абсолютные значения больше
sys.maxsize, разрешены, но некоторые операции (например,len()) могут вызывать исключениеOverflowError.Примеры диапазонов:
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []
Диапазоны реализуют все общие операции над последовательностями, кроме конкатенации и повторения (поскольку объекты range могут представлять только последовательности, соответствующие строгому шаблону, а повторение и конкатенация обычно нарушают этот шаблон).
-
start -
Значение параметра start (или
0, если параметр не был задан)
-
stop -
Значение параметра stop
-
step -
Значение параметра step (или
1, если параметр не был задан)
-
Преимущество типа range перед обычным list или tuple заключается в том, что объект range всегда занимает одинаковый (небольшой) объём памяти независимо от размера представляемого диапазона (поскольку он хранит только значения start, stop и step, вычисляя отдельные элементы и срезы по мере необходимости).
Объекты range реализуют ABC-класс collections.abc.Sequence и предоставляют такие возможности, как проверка принадлежности, поиск индекса элемента, срезы и поддержка отрицательных индексов (см. Типы последовательностей — list, tuple, range):
>>> r = range(0, 20, 2) >>> r range(0, 20, 2) >>> 11 in r False >>> 10 in r True >>> r.index(10) 5 >>> r[5] 10 >>> r[:5] range(0, 10, 2) >>> r[-1] 18
При проверке объектов range на равенство с помощью == и != они сравниваются как последовательности. То есть два объекта range считаются равными, если они представляют одну и ту же последовательность значений. (Обратите внимание, что у двух равных объектов range могут различаться атрибуты start, stop и step, например range(0) == range(2, 1, 3) или range(0, 3, 2) == range(0, 4, 2).)
Изменено в версии 3.2: Реализован ABC-класс Sequence. Добавлена поддержка срезов и отрицательных индексов. Проверка вхождения объектов int выполняется за постоянное время вместо перебора всех элементов.
Изменено в версии 3.3: Операторы «==» и «!=» сравнивают объекты range на основе определяемых ими последовательностей значений (вместо сравнения идентичности объектов).
См. также
- Рецепт linspace показывает, как реализовать ленивую версию range для задач с числами с плавающей точкой.
Текстовый тип последовательности — str
Текстовые данные в Python обрабатываются с помощью объектов str, или строк. Строки — это неизменяемые последовательности кодовых точек Unicode. Строковые литералы записываются различными способами:
- В одинарных кавычках:
'allows embedded "double" quotes' - В двойных кавычках:
"allows embedded 'single' quotes" - В тройных кавычках:
'''Three single quotes''',"""Three double quotes"""
Строки в тройных кавычках могут занимать несколько строк — все связанные с ними пробельные символы будут включены в строковый литерал.
Строковые литералы, которые являются частью одного выражения и разделены только пробельными символами, неявно объединяются в один строковый литерал. То есть ("spam " "eggs") == "spam eggs".
Подробнее о различных формах строковых литералов, включая поддерживаемые управляющие последовательности и префикс r («raw»), отключающий обработку большинства управляющих последовательностей, см. в разделе Строковые и байтовые литералы.
Строки также можно создавать из других объектов с помощью конструктора 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 соответствует первому случаю — возврату неформального строкового представления (см. также параметр командной строки Python-b). Например:>>> str(b'Zoot!') "b'Zoot!'"
Дополнительную информацию о классе
strи его методах см. в разделе Текстовый тип последовательности — str и приведённом ниже разделе Методы строк. О форматировании строк см. в разделах f-строки и Синтаксис форматирования строк. Кроме того, см. раздел Службы обработки текста.
Методы строк
Строки реализуют все общие операции последовательностей, а также дополнительные методы, описанные ниже.
Строки также поддерживают два способа форматирования строк: один обеспечивает большую гибкость и возможности настройки (см. str.format(), Синтаксис строк форматирования и Настраиваемое форматирование строк), а другой основан на форматировании в стиле C printf, поддерживает более узкий диапазон типов и несколько сложнее в правильном использовании, но часто работает быстрее в подходящих случаях (Форматирование строк в стиле printf).
В разделе стандартной библиотеки Службы обработки текста описан ряд других модулей, предоставляющих различные средства для работы с текстом (в том числе поддержку регулярных выражений в модуле re).
-
str.capitalize() -
Возвращает копию строки, в которой первый символ преобразован в заглавный, а остальные — в строчные.
Изменено в версии 3.8: Теперь первый символ преобразуется в прописную букву, а не в заглавную. Это означает, что у символов вроде диграфов в прописную преобразуется только первая буква, а не весь символ.
-
str.casefold() -
Возвращает копию строки, преобразованную методом casefold. Такие строки можно использовать для сравнения без учёта регистра.
Преобразование методом casefold похоже на перевод в нижний регистр, но выполняется более тщательно, поскольку предназначено для устранения всех различий в регистре символов строки. Например, строчная немецкая буква
'ß'эквивалентна"ss". Поскольку она уже является строчной,lower()ничего не изменит в'ß';casefold()преобразует её в"ss".Алгоритм преобразования методом casefold описан в разделе 3.13 стандарта Unicode.
Добавлено в версии 3.3.
-
str.center(width[, fillchar]) -
Возвращает строку, выровненную по центру в строке длиной width. Для заполнения используется указанный символ fillchar (по умолчанию — пробел ASCII). Если width меньше или равен
len(s), возвращается исходная строка.
-
str.count(sub[, start[, end]]) -
Возвращает количество неперекрывающихся вхождений подстроки sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются так же, как в записи среза.
Если sub — пустая строка, возвращает количество пустых строк между символами, то есть длину строки плюс один.
-
str.encode(encoding='utf-8', errors='strict') -
Возвращает строку, закодированную в
bytes.По умолчанию значение encoding равно
'utf-8'; возможные значения см. в разделе Стандартные кодировки.Аргумент errors управляет обработкой ошибок кодирования. Если задано значение
'strict'(по умолчанию), возбуждается исключениеUnicodeError. Другие возможные значения:'ignore','replace','xmlcharrefreplace','backslashreplace'и любое другое имя, зарегистрированное с помощьюcodecs.register_error(). Подробности см. в разделе Обработчики ошибок.В целях повышения производительности корректность значения errors проверяется только при возникновении ошибки кодирования, включённом режиме разработки Python или использовании отладочной сборки.
Изменено в версии 3.1: Добавлена поддержка именованных аргументов.
Изменено в версии 3.9: Значение аргумента errors теперь проверяется в режиме разработки Python и в режиме отладки.
-
str.endswith(suffix[, start[, end]]) -
Возвращает
True, если строка заканчивается указанным суффиксом suffix, иFalseв противном случае. Аргумент suffix также может быть кортежем суффиксов для поиска. Если задан необязательный аргумент start, проверка начинается с этой позиции. Если задан необязательный аргумент end, сравнение заканчивается на этой позиции.
-
str.expandtabs(tabsize=8) -
Возвращает копию строки, в которой все символы табуляции заменены одним или несколькими пробелами в зависимости от текущего столбца и заданного размера табуляции. Позиции табуляции повторяются через каждые tabsize символов (по умолчанию — 8, то есть позиции табуляции приходятся на столбцы 0, 8, 16 и так далее). Для преобразования строки текущий столбец устанавливается в ноль, после чего строка просматривается посимвольно. Если символ является табуляцией (
\t), в результат вставляется один или несколько пробелов, пока текущий столбец не достигнет следующей позиции табуляции. (Сам символ табуляции не копируется.) Если символ является переводом строки (\n) или возвратом каретки (\r), он копируется, а текущий столбец сбрасывается в ноль. Любой другой символ копируется без изменений, а текущий столбец увеличивается на единицу независимо от того, сколько места занимает символ при выводе.>>> '01\t012\t0123\t01234'.expandtabs() '01 012 0123 01234' >>> '01\t012\t0123\t01234'.expandtabs(4) '01 012 0123 01234'
-
str.find(sub[, start[, end]]) -
Возвращает наименьший индекс в строке, по которому подстрока sub найдена в срезе
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в записи среза. Если sub не найдена, возвращает-1.
-
str.format(*args, **kwargs) -
Выполняет форматирование строки. Строка, для которой вызывается этот метод, может содержать обычный текст или поля подстановки, ограниченные фигурными скобками
{}. Каждое поле подстановки содержит либо числовой индекс позиционного аргумента, либо имя именованного аргумента. Возвращает копию строки, в которой каждое поле подстановки заменено строковым значением соответствующего аргумента.>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3'Описание различных параметров форматирования, которые можно указывать в строках форматирования, см. в разделе Синтаксис строк форматирования.
Примечание
При форматировании числа (объектов
int,float,complex,decimal.Decimalи их подклассов) с типомn(например,'{:n}'.format(1234)) функция временно устанавливает локальLC_CTYPEв значение локалиLC_NUMERIC, чтобы декодировать поляdecimal_pointиthousands_sepобъектаlocaleconv(), если они содержат символы вне ASCII или имеют длину больше одного байта, а локальLC_NUMERICотличается от локалиLC_CTYPE. Это временное изменение влияет на другие потоки.Изменено в версии 3.7: При форматировании числа с типом
nфункция в некоторых случаях временно устанавливает локальLC_CTYPEв значение локалиLC_NUMERIC.
-
str.format_map(mapping) -
Похож на
str.format(**mapping), ноmappingиспользуется напрямую, а не копируется вdict. Это полезно, например, еслиmappingявляется подклассом dict:>>> class Default(dict): ... def __missing__(self, key): ... return key ... >>> '{name} was born in {country}'.format_map(Default(name='Guido')) 'Guido was born in country'Добавлено в версии 3.2.
-
str.index(sub[, start[, end]]) -
Подобен
find(), но возбуждаетValueError, если подстрока не найдена.
-
str.isalnum() -
Возвращает
True, если все символы строки являются буквенно-цифровыми и строка содержит хотя бы один символ, иFalseв противном случае. Символcявляется буквенно-цифровым, если хотя бы один из следующих методов возвращаетTrue:c.isalpha(),c.isdecimal(),c.isdigit()илиc.isnumeric().
-
str.isalpha() -
Возвращает
True, если все символы строки являются буквенными и строка содержит хотя бы один символ, иFalseв противном случае. К буквенным относятся символы, определённые в базе данных символов Unicode как «Letter», то есть символы, свойство общей категории которых имеет одно из значений «Lm», «Lt», «Lu», «Ll» или «Lo». Обратите внимание, что это отличается от свойства «Alphabetic», определённого в стандарте Unicode.
-
str.isascii() -
Возвращает
True, если строка пуста или все её символы принадлежат ASCII, иFalseв противном случае. Кодовые точки символов ASCII находятся в диапазоне U+0000–U+007F.Добавлено в версии 3.7.
-
str.isdecimal() -
Возвращает
True, если все символы строки являются десятичными и строка содержит хотя бы один символ, иFalseв противном случае. Десятичные символы можно использовать для записи чисел в десятичной системе счисления, например U+0660 — АРАБСКО-ИНДИЙСКАЯ ЦИФРА НОЛЬ. Формально десятичный символ — это символ, относящийся к общей категории Unicode «Nd».
-
str.isdigit() -
Возвращает
True, если все символы строки являются цифрами и строка содержит хотя бы один символ, иFalseв противном случае. К цифрам относятся десятичные символы и цифры, требующие особой обработки, например совместимые надстрочные цифры. Сюда также входят цифры, которые нельзя использовать для записи чисел в десятичной системе счисления, например числа кхароштхи. Формально цифра — это символ, для которого значение свойства равно Numeric_Type=Digit или Numeric_Type=Decimal.
-
str.isidentifier() -
Возвращает
True, если строка является допустимым идентификатором согласно определению языка в разделе Идентификаторы и ключевые слова.Вызовите
keyword.iskeyword(), чтобы проверить, является ли строкаsзарезервированным идентификатором, напримерdefилиclass.Пример:
>>> from keyword import iskeyword >>> 'hello'.isidentifier(), iskeyword('hello') (True, False) >>> 'def'.isidentifier(), iskeyword('def') (True, True)
-
str.islower() -
Возвращает
True, если все символы строки, имеющие регистр [4], являются строчными и в строке есть хотя бы один такой символ, иFalseв противном случае.
-
str.isnumeric() -
Возвращает
True, если все символы строки являются числовыми и строка содержит хотя бы один символ, иFalseв противном случае. К числовым символам относятся цифры и все символы, имеющие числовое значение Unicode, например U+2155 — ОБЫКНОВЕННАЯ ДРОБЬ ОДНА ПЯТАЯ. Формально числовыми являются символы со значением свойства Numeric_Type=Digit, Numeric_Type=Decimal или Numeric_Type=Numeric.
-
str.isprintable() -
Возвращает
True, если все символы строки являются печатными или строка пуста, иFalseв противном случае. Непечатными считаются символы, определённые в базе данных символов Unicode как «Other» или «Separator», за исключением пробела ASCII (0x20), который считается печатным. (Обратите внимание, что в данном контексте печатными считаются символы, которые не нужно экранировать при вызовеrepr()для строки. Это никак не влияет на обработку строк, записываемых вsys.stdoutилиsys.stderr.)
-
str.isspace() -
Возвращает
True, если строка содержит только пробельные символы и в ней есть хотя бы один символ, иFalseв противном случае.Символ считается пробельным, если в базе данных символов Unicode (см.
unicodedata) его общей категорией являетсяZs(«Separator, space») или его классом двунаправленности является одно из значенийWS,BилиS.
-
str.istitle() -
Возвращает
True, если строка оформлена в заглавном регистре и содержит хотя бы один символ. Например, прописные символы могут следовать только за символами без регистра, а строчные — только за символами с регистром. В противном случае возвращаетFalse.
-
str.isupper() -
Возвращает
True, если все символы строки, имеющие регистр [4], являются прописными и в строке есть хотя бы один такой символ, иFalseв противном случае.>>> 'BANANA'.isupper() True >>> 'banana'.isupper() False >>> 'baNana'.isupper() False >>> ' '.isupper() False
-
str.join(iterable) -
Возвращает строку, полученную конкатенацией строк из iterable. Если в iterable есть значения, не являющиеся строками, в том числе объекты
bytes, возбуждается исключениеTypeError. Разделителем между элементами служит строка, для которой вызывается этот метод.
-
str.ljust(width[, fillchar]) -
Возвращает строку, выровненную по левому краю в строке длиной width. Для заполнения используется указанный символ fillchar (по умолчанию — пробел ASCII). Если width меньше или равен
len(s), возвращается исходная строка.
-
str.lower() -
Возвращает копию строки, в которой все символы, имеющие регистр [4], преобразованы в строчные.
Используемый алгоритм перевода в нижний регистр описан в разделе 3.13 стандарта Unicode.
-
str.lstrip([chars]) -
Возвращает копию строки без начальных символов. Аргумент chars — это строка, задающая набор удаляемых символов. Если аргумент опущен или равен
None, по умолчанию удаляются пробельные символы. Аргумент chars не является префиксом: удаляются все сочетания символов, входящих в него:>>> ' spacious '.lstrip() 'spacious ' >>> 'www.example.com'.lstrip('cmowz.') 'example.com'Метод для удаления одной строки-префикса, а не всех символов из набора, см. в разделе
str.removeprefix(). Например:>>> 'Arthur: three!'.lstrip('Arthur: ') 'ee!' >>> 'Arthur: three!'.removeprefix('Arthur: ') 'three!'
-
static str.maketrans(x[, y[, z]]) -
Этот статический метод возвращает таблицу преобразования, пригодную для использования с
str.translate().Если задан только один аргумент, это должен быть словарь, сопоставляющий кодовые позиции Unicode (целые числа) или символы (строки длиной 1) с кодовыми позициями Unicode, строками (произвольной длины) или
None. Ключи-символы затем преобразуются в кодовые позиции.Если заданы два аргумента, это должны быть строки одинаковой длины; в результирующем словаре каждому символу в x будет сопоставлен символ из y, находящийся на той же позиции. Если задан третий аргумент, это должна быть строка, символы которой будут сопоставлены с
Noneв результате.
-
str.partition(sep) -
Разбивает строку при первом вхождении sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после него. Если разделитель не найден, возвращает кортеж из трёх элементов: исходная строка и две пустые строки.
-
str.removeprefix(prefix, /) -
Если строка начинается со строки-префикса prefix, возвращает
string[len(prefix):]. В противном случае возвращает копию исходной строки:>>> 'TestHook'.removeprefix('Test') 'Hook' >>> 'BaseTestCase'.removeprefix('Test') 'BaseTestCase'Добавлено в версии 3.9.
-
str.removesuffix(suffix, /) -
Если строка заканчивается строкой-суффиксом suffix и этот suffix не пуст, возвращает
string[:-len(suffix)]. В противном случае возвращает копию исходной строки:>>> 'MiscTests'.removesuffix('Tests') 'Misc' >>> 'TmpDirMixin'.removesuffix('Tests') 'TmpDirMixin'Добавлено в версии 3.9.
-
str.replace(old, new[, count]) -
Возвращает копию строки, в которой все вхождения подстроки old заменены на new. Если задан необязательный аргумент count, заменяются только первые count вхождений.
-
str.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс в строке, по которому найдена подстрока sub, содержащаяся в
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в записи среза. Если подстрока не найдена, возвращает-1.
-
str.rindex(sub[, start[, end]]) -
Подобен
rfind(), но возбуждаетValueError, если подстрока sub не найдена.
-
str.rjust(width[, fillchar]) -
Возвращает строку, выровненную по правому краю в строке длиной width. Для заполнения используется указанный символ fillchar (по умолчанию — пробел ASCII). Если width меньше или равен
len(s), возвращается исходная строка.
-
str.rpartition(sep) -
Разбивает строку при последнем вхождении sep и возвращает кортеж из трёх элементов: часть до разделителя, сам разделитель и часть после него. Если разделитель не найден, возвращает кортеж из трёх элементов: две пустые строки и исходная строка.
-
str.rsplit(sep=None, maxsplit=-1) -
Возвращает список слов строки, используя sep как строку-разделитель. Если задан аргумент maxsplit, выполняется не более maxsplit разбиений — самых правых. Если sep не задан или равен
None, разделителем служит любая строка пробельных символов. За исключением разбиения справа налево,rsplit()работает так же, какsplit(), подробно описанный ниже.
-
str.rstrip([chars]) -
Возвращает копию строки без конечных символов. Аргумент chars — это строка, задающая набор удаляемых символов. Если аргумент опущен или равен
None, по умолчанию удаляются пробельные символы. Аргумент chars не является суффиксом: удаляются все сочетания символов, входящих в него:>>> ' spacious '.rstrip() ' spacious' >>> 'mississippi'.rstrip('ipz') 'mississ'Метод для удаления одной строки-суффикса, а не всех символов из набора, см. в разделе
str.removesuffix(). Например:>>> 'Monty Python'.rstrip(' Python') 'M' >>> 'Monty Python'.removesuffix(' Python') 'Monty'
-
str.split(sep=None, maxsplit=-1) -
Возвращает список слов строки, используя sep как строку-разделитель. Если задан аргумент maxsplit, выполняется не более maxsplit разбиений (таким образом, список будет содержать не более
maxsplit+1элементов). Если maxsplit не задан или равен-1, количество разбиений не ограничено (выполняются все возможные разбиения).Если задан sep, идущие подряд разделители не объединяются и считаются разделителями пустых строк (например,
'1,,2'.split(',')возвращает['1', '', '2']). Аргумент sep может состоять из нескольких символов (например,'1<>2<>3'.split('<>')возвращает['1', '2', '3']). Разбиение пустой строки с заданным разделителем возвращает[''].Например:
>>> '1,2,3'.split(',') ['1', '2', '3'] >>> '1,2,3'.split(',', maxsplit=1) ['1', '2,3'] >>> '1,2,,3,'.split(',') ['1', '2', '', '3', '']Если sep не задан или равен
None, применяется другой алгоритм разбиения: последовательности пробельных символов считаются одним разделителем, а если в начале или конце строки есть пробельные символы, в результат не включаются пустые строки в начале или конце. Поэтому разбиение пустой строки или строки, состоящей только из пробельных символов, с разделителемNoneвозвращает[].Например:
>>> '1 2 3'.split() ['1', '2', '3'] >>> '1 2 3'.split(maxsplit=1) ['1', '2 3'] >>> ' 1 2 3 '.split() ['1', '2', '3']
-
str.splitlines(keepends=False) -
Возвращает список строк, разделяя исходную строку по границам строк. Символы перевода строки не включаются в результирующий список, если только не задан аргумент keepends со значением истина.
Этот метод выполняет разбиение по следующим границам строк. В частности, этот набор шире набора универсальных символов новой строки.
Представление
Описание
\nПеревод строки
\rВозврат каретки
\r\nВозврат каретки + перевод строки
\vили\x0bВертикальная табуляция
\fили\x0cПеревод страницы
\x1cРазделитель файлов
\x1dРазделитель групп
\x1eРазделитель записей
\x85Следующая строка (управляющий код C1)
\u2028Разделитель строк
\u2029Разделитель абзацев
Изменено в версии 3.2:
\vи\fдобавлены в список границ строк.Например:
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines() ['ab c', '', 'de fg', 'kl'] >>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) ['ab c\n', '\n', 'de fg\r', 'kl\r\n']
В отличие от
split(), если задана строка-разделитель sep, этот метод возвращает пустой список для пустой строки, а завершающий перевод строки не добавляет дополнительную строку:>>> "".splitlines() [] >>> "One line\n".splitlines() ['One line']
Для сравнения,
split('\n')возвращает:>>> ''.split('\n') [''] >>> 'Two lines\n'.split('\n') ['Two lines', '']
-
str.startswith(prefix[, start[, end]]) -
Возвращает
True, если строка начинается с prefix, иFalseв противном случае. Аргумент prefix также может быть кортежем префиксов для поиска. Если задан необязательный аргумент start, проверка строки начинается с этой позиции. Если задан необязательный аргумент end, сравнение строки заканчивается на этой позиции.
-
str.strip([chars]) -
Возвращает копию строки без начальных и конечных символов. Аргумент chars — это строка, задающая набор удаляемых символов. Если аргумент опущен или равен
None, по умолчанию удаляются пробельные символы. Аргумент chars не является префиксом или суффиксом: удаляются все сочетания символов, входящих в него:>>> ' spacious '.strip() 'spacious' >>> 'www.example.com'.strip('cmowz.') 'example'Из строки удаляются символы из аргумента chars, расположенные на самом краю в начале и в конце. Символы удаляются с начала строки, пока не встретится символ, не входящий в набор chars. Аналогично выполняется удаление с конца строки. Например:
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......' >>> comment_string.strip('.#! ') 'Section 3.2.1 Issue #32'
-
str.swapcase() -
Возвращает копию строки, в которой прописные символы преобразованы в строчные, и наоборот. Обратите внимание, что равенство
s.swapcase().swapcase() == sвыполняется не всегда.
-
str.title() -
Возвращает строку в заглавном регистре: слова начинаются с заглавной буквы, а остальные символы записываются строчными буквами.
Например:
>>> 'Hello world'.title() 'Hello World'
Алгоритм использует простое, не зависящее от языка определение слова как группы идущих подряд букв. Такое определение подходит для многих случаев, но в результате апострофы в сокращениях и притяжательных формах становятся границами слов, что может быть нежелательно:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
У функции
string.capwords()этой проблемы нет, поскольку она разделяет слова только по пробелам.Другой способ обойти проблему с апострофами — использовать регулярные выражения:
>>> import re >>> def titlecase(s): ... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0).capitalize(), ... s) ... >>> titlecase("they're bill's friends.") "They're Bill's Friends."
-
str.translate(table) -
Возвращает копию строки, в которой каждый символ преобразован с помощью заданной таблицы преобразования. Таблица должна быть объектом, реализующим индексирование через
__getitem__(), обычно это отображение или последовательность. При индексировании по кодовой позиции Unicode (целому числу) объект таблицы может делать одно из следующего: возвращать кодовую позицию Unicode или строку, преобразуя символ в один или несколько других символов; возвращатьNone, удаляя символ из возвращаемой строки; или вызывать исключениеLookupError, оставляя символ без изменений.Для создания таблицы преобразования из соответствий «символ — символ» в различных форматах можно использовать
str.maketrans().Более гибкий способ настройки преобразования символов описан в модуле
codecs.
-
str.upper() -
Возвращает копию строки, в которой все символы, имеющие регистр[4], преобразованы в верхний регистр. Обратите внимание, что
s.upper().isupper()может бытьFalse, еслиsсодержит символы без регистра или если категория Unicode получившегося символа (или символов) не «Lu» (буква в верхнем регистре), а, например, «Lt» (буква в заглавном регистре).Алгоритм преобразования в верхний регистр описан в разделе 3.13 стандарта Unicode.
-
str.zfill(width) -
Возвращает копию строки, дополненную слева цифрами ASCII
'0'до длины width. Начальный знак ('+'/'-') обрабатывается вставкой заполнения после знака, а не перед ним. Если значение width меньше или равноlen(s), возвращается исходная строка.Например:
>>> "42".zfill(5) '00042' >>> "-42".zfill(5) '-0042'
Форматирование строк в стиле printf
Примечание
Описанные здесь операции форматирования имеют ряд особенностей, которые часто приводят к ошибкам (например, к неправильному выводу кортежей и словарей). Избежать этих ошибок помогут более новые форматированные строковые литералы, интерфейс str.format() или шаблонные строки. У каждого из этих вариантов свои преимущества и компромиссы с точки зрения простоты, гибкости и/или расширяемости.
У строковых объектов есть одна уникальная встроенная операция: оператор % (остаток от деления). Он также известен как оператор форматирования или интерполяции строк. Для format % values (где format — строка) спецификации преобразования % в format заменяются нулём или несколькими элементами из values. По действию это похоже на использование sprintf() в языке C.
Если для format требуется один аргумент, values может быть отдельным объектом, не являющимся кортежем.[5] В противном случае values должен быть кортежем, содержащим ровно столько элементов, сколько указано в строке формата, либо одним объектом-отображением (например, словарём).
Спецификатор преобразования состоит из двух или более символов и включает следующие компоненты, расположенные в указанном порядке:
- Символ
'%', обозначающий начало спецификатора. - Ключ отображения (необязательный), представляющий собой последовательность символов в круглых скобках (например,
(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; во многих других отношениях они также тесно связаны со строковыми объектами.
-
class bytes([source[, encoding[, errors]]]) -
Во-первых, синтаксис литералов bytes во многом совпадает с синтаксисом строковых литералов, за исключением добавления префикса
b:- Одинарные кавычки:
b'still allows embedded "double" quotes' - Двойные кавычки:
b"still allows embedded 'single' quotes" - Тройные кавычки:
b'''3 single quotes''',b"""3 double quotes"""
В литералах bytes разрешены только символы ASCII (независимо от объявленной кодировки исходного кода). Любые двоичные значения больше 127 необходимо записывать в литералах bytes с помощью соответствующей управляющей последовательности.
Как и в строковых литералах, в литералах bytes также может использоваться префикс
r, отключающий обработку управляющих последовательностей. Подробнее о различных формах литералов bytes, включая поддерживаемые управляющие последовательности, см. в разделе Строковые и байтовые литералы.Хотя литералы и представления bytes основаны на тексте ASCII, объекты bytes фактически ведут себя как неизменяемые последовательности целых чисел, причём каждое значение в последовательности ограничено условием
0 <= x < 256(попытка нарушить это ограничение вызоветValueError). Это сделано намеренно: многие двоичные форматы содержат элементы на основе ASCII и могут эффективно обрабатываться некоторыми текстовыми алгоритмами, однако для произвольных двоичных данных это обычно неприменимо. Бездумное применение алгоритмов текстовой обработки к двоичным форматам, несовместимым с ASCII, обычно приводит к повреждению данных.Помимо литералов, объекты bytes можно создавать несколькими другими способами:
- Объект bytes заданной длины, заполненный нулями:
bytes(10) - Из итерируемого объекта целых чисел:
bytes(range(20)) - Копированием существующих двоичных данных через протокол буфера:
bytes(obj)
См. также встроенный тип bytes.
Поскольку две шестнадцатеричные цифры точно соответствуют одному байту, шестнадцатеричные числа часто используются для описания двоичных данных. Поэтому тип bytes имеет дополнительный метод класса для чтения данных в этом формате:
-
classmethod fromhex(string) -
Этот метод класса
bytesвозвращает объект bytes, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт; пробельные символы ASCII игнорируются.>>> bytes.fromhex('2Ef0 F1f2 ') b'.\xf0\xf1\xf2'Изменено в версии 3.7:
bytes.fromhex()теперь пропускает все пробельные символы ASCII в строке, а не только пробелы.
Для обратного преобразования объекта 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.
Поскольку две шестнадцатеричные цифры точно соответствуют одному байту, шестнадцатеричные числа часто используются для описания двоичных данных. Поэтому тип bytearray имеет дополнительный метод класса для чтения данных в этом формате:
-
classmethod fromhex(string) -
Этот метод класса
bytearrayвозвращает объект bytearray, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт; пробельные символы ASCII игнорируются.>>> bytearray.fromhex('2Ef0 F1f2 ') bytearray(b'.\xf0\xf1\xf2')Изменено в версии 3.7:
bytearray.fromhex()теперь пропускает все пробельные символы ASCII в строке, а не только пробелы.
Для обратного преобразования объекта bytearray в шестнадцатеричное представление предусмотрена функция.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта экземпляра.
>>> bytearray(b'\xf0\xf1\xf2').hex() 'f0f1f2'
Добавлено в версии 3.5.
Изменено в версии 3.8: Как и
bytes.hex(), методbytearray.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
- Создание пустого экземпляра:
Поскольку объекты bytearray являются последовательностями целых чисел (подобно списку), для объекта bytearray b выражение b[0] вернёт целое число, а b[0:1] — объект bytearray длиной 1. (Это отличается от текстовых строк, при индексировании и срезе которых в обоих случаях получается строка длиной 1.)
В представлении объектов bytearray используется формат байтового литерала (bytearray(b'...')), поскольку он часто полезнее, чем, например, bytearray([46, 46, 46]). Объект bytearray всегда можно преобразовать в список целых чисел с помощью list(b).
Операции с bytes и bytearray
Объекты bytes и bytearray поддерживают общие операции над последовательностями. Они взаимодействуют не только с операндами того же типа, но и с любыми объектами, подобными bytes. Благодаря этой гибкости их можно свободно комбинировать в операциях без ошибок. Однако тип результата может зависеть от порядка операндов.
Примечание
Методы объектов bytes и bytearray не принимают строки в качестве аргументов, так же как методы строк не принимают bytes в качестве аргументов. Например, нужно написать:
a = "abc"
b = a.replace("a", "f")
и:
a = b"abc" b = a.replace(b"a", b"f")
Некоторые операции с bytes и bytearray предполагают использование двоичных форматов, совместимых с ASCII, поэтому их следует избегать при работе с произвольными двоичными данными. Эти ограничения описаны ниже.
Примечание
Использование операций, основанных на ASCII, для обработки двоичных данных, хранящихся не в формате на основе ASCII, может привести к повреждению данных.
Следующие методы объектов bytes и bytearray можно использовать с произвольными двоичными данными.
-
bytes.count(sub[, start[, end]]) -
bytearray.count(sub[, start[, end]]) -
Возвращает количество неперекрывающихся вхождений подпоследовательности sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются так же, как в записи среза.
Искомая подпоследовательность может быть любым объектом, подобным bytes или целым числом в диапазоне от 0 до 255.
Если sub — пустая последовательность, возвращается количество пустых срезов между символами, равное длине объекта bytes плюс один.
Изменено в версии 3.3: В качестве подпоследовательности также принимается целое число в диапазоне от 0 до 255.
-
bytes.removeprefix(prefix, /) -
bytearray.removeprefix(prefix, /) -
Если двоичные данные начинаются со строки prefix, возвращает
bytes[len(prefix):]. В противном случае возвращает копию исходных двоичных данных:>>> b'TestHook'.removeprefix(b'Test') b'Hook' >>> b'BaseTestCase'.removeprefix(b'Test') b'BaseTestCase'
Значением prefix может быть любой объект, подобный bytes.
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
Добавлено в версии 3.9.
-
bytes.removesuffix(suffix, /) -
bytearray.removesuffix(suffix, /) -
Если двоичные данные заканчиваются строкой suffix и эта строка suffix не пуста, возвращает
bytes[:-len(suffix)]. В противном случае возвращает копию исходных двоичных данных:>>> b'MiscTests'.removesuffix(b'Tests') b'Misc' >>> b'TmpDirMixin'.removesuffix(b'Tests') b'TmpDirMixin'
Значением suffix может быть любой объект, подобный bytes.
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
Добавлено в версии 3.9.
-
bytes.decode(encoding='utf-8', errors='strict') -
bytearray.decode(encoding='utf-8', errors='strict') -
Возвращает декодированные bytes в виде
str.По умолчанию для encoding используется
'utf-8'; возможные значения см. в разделе Стандартные кодировки.Аргумент errors определяет способ обработки ошибок декодирования. Если указано
'strict'(значение по умолчанию), возникает исключениеUnicodeError. Другие возможные значения:'ignore','replace'и любое другое имя, зарегистрированное с помощьюcodecs.register_error(). Подробности см. в разделе Обработчики ошибок.Для повышения производительности значение errors не проверяется на допустимость, если только не возникает ошибка декодирования, не включен режим разработки Python или не используется отладочная сборка.
Примечание
Передача аргумента encoding в
strпозволяет декодировать любой объект, подобный bytes напрямую, без создания временного объектаbytesилиbytearray.Изменено в версии 3.1: Добавлена поддержка именованных аргументов.
Изменено в версии 3.9: Значение аргумента errors теперь проверяется в режиме разработки Python и в режиме отладки.
-
bytes.endswith(suffix[, start[, end]]) -
bytearray.endswith(suffix[, start[, end]]) -
Возвращает
True, если двоичные данные заканчиваются указанным суффиксом suffix, иFalseв противном случае. В качестве suffix также может быть кортеж суффиксов для поиска. Если указан необязательный аргумент start, проверка начинается с этой позиции. Если указан необязательный аргумент end, сравнение заканчивается на этой позиции.Искомым суффиксом или суффиксами может быть любой объект, подобный bytes.
-
bytes.find(sub[, start[, end]]) -
bytearray.find(sub[, start[, end]]) -
Возвращает наименьший индекс данных, по которому найдена подпоследовательность sub, такую, что sub содержится в срезе
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в записи среза. Если sub не найдена, возвращает-1.Искомая подпоследовательность может быть любым объектом, подобным bytes или целым числом в диапазоне от 0 до 255.
Примечание
Метод
find()следует использовать только в том случае, если необходимо узнать позицию sub. Чтобы проверить, является ли sub подстрокой, используйте операторin:>>> b'Py' in b'Python' True
Изменено в версии 3.3: В качестве подпоследовательности также принимается целое число в диапазоне от 0 до 255.
-
bytes.index(sub[, start[, end]]) -
bytearray.index(sub[, start[, end]]) -
Подобен
find(), но вызывает исключениеValueError, если подпоследовательность не найдена.Искомая подпоследовательность может быть любым объектом, подобным bytes или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: В качестве подпоследовательности также принимается целое число в диапазоне от 0 до 255.
-
bytes.join(iterable) -
bytearray.join(iterable) -
Возвращает объект bytes или bytearray, представляющий собой объединение двоичных последовательностей данных из iterable. Возникает исключение
TypeError, если в iterable есть значения, не являющиеся объектами, подобными bytes, включая объектыstr. Разделителем между элементами служит содержимое объекта bytes или bytearray, для которого вызван этот метод.
-
static bytes.maketrans(from, to) -
static bytearray.maketrans(from, to) -
Этот статический метод возвращает таблицу преобразования, используемую методом
bytes.translate(). Она сопоставляет каждый символ в from символу на той же позиции в to; оба аргумента, from и to, должны быть объектами, подобными bytes, и иметь одинаковую длину.Добавлено в версии 3.1.
-
bytes.partition(sep) -
bytearray.partition(sep) -
Разбивает последовательность при первом вхождении sep и возвращает кортеж из трех элементов: часть перед разделителем, сам разделитель или его копию bytearray и часть после разделителя. Если разделитель не найден, возвращает кортеж из трех элементов: копию исходной последовательности и два пустых объекта bytes или bytearray.
Искомым разделителем может быть любой объект, подобный bytes.
-
bytes.replace(old, new[, count]) -
bytearray.replace(old, new[, count]) -
Возвращает копию последовательности, в которой все вхождения подпоследовательности old заменены на new. Если задан необязательный аргумент count, заменяются только первые count вхождений.
Искомая подпоследовательность и ее замена могут быть любыми объектами, подобными bytes.
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.rfind(sub[, start[, end]]) -
bytearray.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс последовательности, по которому найдена подпоследовательность sub, такую, что sub содержится в
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в записи среза. В случае неудачи возвращает-1.Искомая подпоследовательность может быть любым объектом, подобным bytes или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: В качестве подпоследовательности также принимается целое число в диапазоне от 0 до 255.
-
bytes.rindex(sub[, start[, end]]) -
bytearray.rindex(sub[, start[, end]]) -
Подобен
rfind(), но вызывает исключениеValueError, если подпоследовательность sub не найдена.Искомая подпоследовательность может быть любым объектом, подобным bytes или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: В качестве подпоследовательности также принимается целое число в диапазоне от 0 до 255.
-
bytes.rpartition(sep) -
bytearray.rpartition(sep) -
Разбивает последовательность при последнем вхождении sep и возвращает кортеж из трех элементов: часть перед разделителем, сам разделитель или его копию bytearray и часть после разделителя. Если разделитель не найден, возвращает кортеж из трех элементов: два пустых объекта bytes или bytearray, а затем копию исходной последовательности.
Искомым разделителем может быть любой объект, подобный bytes.
-
bytes.startswith(prefix[, start[, end]]) -
bytearray.startswith(prefix[, start[, end]]) -
Возвращает
True, если двоичные данные начинаются с указанного префикса prefix, иFalseв противном случае. В качестве prefix также может быть кортеж префиксов для поиска. Если указан необязательный аргумент start, проверка начинается с этой позиции. Если указан необязательный аргумент end, сравнение заканчивается на этой позиции.Искомым префиксом или префиксами может быть любой объект, подобный bytes.
-
bytes.translate(table, /, delete=b'') -
bytearray.translate(table, /, delete=b'') -
Возвращает копию объекта bytes или bytearray, из которой удалены все байты, указанные в необязательном аргументе delete, а оставшиеся байты преобразованы с помощью заданной таблицы преобразования, которая должна быть объектом bytes длиной 256.
Для создания таблицы преобразования можно использовать метод
bytes.maketrans().Для преобразований, удаляющих только символы, задайте аргумент table равным
None:>>> b'read this short text'.translate(None, b'aeiou') b'rd ths shrt txt'
Изменено в версии 3.6: Теперь delete можно задавать как именованный аргумент.
Следующие методы объектов bytes и bytearray по умолчанию предполагают использование двоичных форматов, совместимых с ASCII, но их все же можно применять к произвольным двоичным данным, передав подходящие аргументы. Обратите внимание: все методы bytearray в этом разделе не изменяют объект на месте, а вместо этого создают новые объекты.
-
bytes.center(width[, fillbyte]) -
bytearray.center(width[, fillbyte]) -
Возвращает копию объекта, выровненную по центру в последовательности длиной width. Для заполнения используется указанный байт fillbyte (по умолчанию — пробел ASCII). Для объектов
bytesисходная последовательность возвращается, если значение width меньше или равноlen(s).Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.ljust(width[, fillbyte]) -
bytearray.ljust(width[, fillbyte]) -
Возвращает копию объекта, выровненную по левому краю в последовательности длиной width. Для заполнения используется указанный байт fillbyte (по умолчанию — пробел ASCII). Для объектов
bytesисходная последовательность возвращается, если значение width меньше или равноlen(s).Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.lstrip([chars]) -
bytearray.lstrip([chars]) -
Возвращает копию последовательности, из которой удалены указанные начальные байты. Аргумент chars — это двоичная последовательность, задающая набор удаляемых значений байтов; название связано с тем, что этот метод обычно используется с символами ASCII. Если аргумент chars не указан или равен
None, по умолчанию удаляются пробельные символы ASCII. Аргумент chars не является префиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.lstrip() b'spacious ' >>> b'www.example.com'.lstrip(b'cmowz.') b'example.com'
Двоичная последовательность значений байтов для удаления может быть любым объектом, подобным bytes. О методе, который удаляет одну строку-префикс, а не все символы из набора, см.
removeprefix(). Например:>>> b'Arthur: three!'.lstrip(b'Arthur: ') b'ee!' >>> b'Arthur: three!'.removeprefix(b'Arthur: ') b'three!'
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.rjust(width[, fillbyte]) -
bytearray.rjust(width[, fillbyte]) -
Возвращает копию объекта, выровненную по правому краю в последовательности длиной width. Для заполнения используется указанный байт fillbyte (по умолчанию — пробел ASCII). Для объектов
bytesисходная последовательность возвращается, если значение width меньше или равноlen(s).Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.rsplit(sep=None, maxsplit=-1) -
bytearray.rsplit(sep=None, maxsplit=-1) -
Разбивает двоичную последовательность на подпоследовательности того же типа, используя sep в качестве строки-разделителя. Если задан maxsplit, выполняется не более maxsplit разбиений — самых правых. Если sep не указан или равен
None, разделителем служит любая подпоследовательность, состоящая только из пробельных символов ASCII. За исключением разбиения справа налево, методrsplit()ведет себя какsplit(), подробно описанный ниже.
-
bytes.rstrip([chars]) -
bytearray.rstrip([chars]) -
Возвращает копию последовательности, из которой удалены указанные конечные байты. Аргумент chars — это двоичная последовательность, задающая набор удаляемых значений байтов; название связано с тем, что этот метод обычно используется с символами ASCII. Если аргумент chars не указан или равен
None, по умолчанию удаляются пробельные символы ASCII. Аргумент chars не является суффиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.rstrip() b' spacious' >>> b'mississippi'.rstrip(b'ipz') b'mississ'
Двоичная последовательность значений байтов для удаления может быть любым объектом, подобным bytes. О методе, который удаляет одну строку-суффикс, а не все символы из набора, см.
removesuffix(). Например:>>> b'Monty Python'.rstrip(b' Python') b'M' >>> b'Monty Python'.removesuffix(b' Python') b'Monty'
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.split(sep=None, maxsplit=-1) -
bytearray.split(sep=None, maxsplit=-1) -
Разбивает двоичную последовательность на подпоследовательности того же типа, используя sep в качестве строки-разделителя. Если задано неотрицательное значение maxsplit, выполняется не более maxsplit разбиений (таким образом, список будет содержать не более
maxsplit+1элементов). Если maxsplit не задан или равен-1, количество разбиений не ограничено (выполняются все возможные разбиения).Если задан sep, последовательные разделители не объединяются и считаются разделителями пустых подпоследовательностей (например,
b'1,,2'.split(b',')возвращает[b'1', b'', b'2']). Аргумент sep может состоять из нескольких байтов (например,b'1<>2<>3'.split(b'<>')возвращает[b'1', b'2', b'3']). Разбиение пустой последовательности с заданным разделителем возвращает[b'']или[bytearray(b'')]в зависимости от типа разбиваемого объекта. Аргументом sep может быть любой объект, подобный bytes.Например:
>>> b'1,2,3'.split(b',') [b'1', b'2', b'3'] >>> b'1,2,3'.split(b',', maxsplit=1) [b'1', b'2,3'] >>> b'1,2,,3,'.split(b',') [b'1', b'2', b'', b'3', b'']
Если sep не указан или равен
None, применяется другой алгоритм разбиения: последовательности идущих подряд пробельных символов ASCII считаются одним разделителем, а если в последовательности есть пробелы в начале или в конце, результат не будет содержать пустых строк в начале или в конце. Поэтому разбиение пустой последовательности или последовательности, состоящей только из пробельных символов ASCII, без указания разделителя возвращает[].Например:
>>> b'1 2 3'.split() [b'1', b'2', b'3'] >>> b'1 2 3'.split(maxsplit=1) [b'1', b'2 3'] >>> b' 1 2 3 '.split() [b'1', b'2', b'3']
-
bytes.strip([chars]) -
bytearray.strip([chars]) -
Возвращает копию последовательности, из которой удалены указанные начальные и конечные байты. Аргумент chars — это двоичная последовательность, задающая набор удаляемых значений байтов; название связано с тем, что этот метод обычно используется с символами ASCII. Если аргумент chars не указан или равен
None, по умолчанию удаляются пробельные символы ASCII. Аргумент chars не является префиксом или суффиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.strip() b'spacious' >>> b'www.example.com'.strip(b'cmowz.') b'example'
Двоичная последовательность значений байтов для удаления может быть любым объектом, подобным bytes.
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
Следующие методы объектов bytes и bytearray предполагают использование двоичных форматов, совместимых с ASCII, и их не следует применять к произвольным двоичным данным. Обратите внимание: все методы bytearray в этом разделе не изменяют объект на месте, а вместо этого создают новые объекты.
-
bytes.capitalize() -
bytearray.capitalize() -
Возвращает копию последовательности, в которой каждый байт интерпретируется как символ ASCII, первый байт переводится в верхний регистр, а остальные — в нижний. Значения байтов, не относящиеся к ASCII, остаются без изменений.
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.expandtabs(tabsize=8) -
bytearray.expandtabs(tabsize=8) -
Возвращает копию последовательности, в которой все символы табуляции ASCII заменены одним или несколькими пробелами ASCII в зависимости от текущего столбца и заданного размера табуляции. Позиции табуляции встречаются через каждые tabsize байт (по умолчанию — 8, то есть позиции табуляции находятся в столбцах 0, 8, 16 и так далее). Для расширения последовательности текущий столбец устанавливается в ноль, затем последовательность просматривается байт за байтом. Если байт является символом табуляции ASCII (
b'\t'), в результат вставляется один или несколько пробелов, пока текущий столбец не достигнет следующей позиции табуляции. (Сам символ табуляции не копируется.) Если текущий байт является символом новой строки ASCII (b'\n') или возврата каретки (b'\r'), он копируется, а текущий столбец сбрасывается в ноль. Любое другое значение байта копируется без изменений, а текущий столбец увеличивается на единицу независимо от того, как это значение байта отображается при печати:>>> b'01\t012\t0123\t01234'.expandtabs() b'01 012 0123 01234' >>> b'01\t012\t0123\t01234'.expandtabs(4) b'01 012 0123 01234'
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.isalnum() -
bytearray.isalnum() -
Возвращает
True, если все байты последовательности являются буквами ASCII или десятичными цифрами ASCII и последовательность не пуста; в противном случае возвращаетFalse. Буквам ASCII соответствуют значения байтов из последовательностиb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. Десятичным цифрам ASCII соответствуют значения байтов из последовательностиb'0123456789'.Например:
>>> b'ABCabc1'.isalnum() True >>> b'ABC abc1'.isalnum() False
-
bytes.isalpha() -
bytearray.isalpha() -
Возвращает
True, если все байты последовательности являются буквами ASCII и последовательность не пуста; в противном случае возвращаетFalse. Буквам ASCII соответствуют значения байтов из последовательностиb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.Например:
>>> b'ABCabc'.isalpha() True >>> b'ABCabc1'.isalpha() False
-
bytes.isascii() -
bytearray.isascii() -
Возвращает
True, если последовательность пуста или все ее байты относятся к ASCII; в противном случае возвращаетFalse. Байты ASCII находятся в диапазоне 0–0x7F.Добавлено в версии 3.7.
-
bytes.isdigit() -
bytearray.isdigit() -
Возвращает
True, если все байты последовательности являются десятичными цифрами ASCII и последовательность не пуста; в противном случае возвращаетFalse. Десятичным цифрам ASCII соответствуют значения байтов из последовательностиb'0123456789'.Например:
>>> b'1234'.isdigit() True >>> b'1.23'.isdigit() False
-
bytes.islower() -
bytearray.islower() -
Возвращает
True, если в последовательности есть хотя бы один символ ASCII в нижнем регистре и нет символов ASCII в верхнем регистре; в противном случае возвращаетFalse.Например:
>>> b'hello world'.islower() True >>> b'Hello world'.islower() False
Символам ASCII в нижнем регистре соответствуют значения байтов из последовательности
b'abcdefghijklmnopqrstuvwxyz'. Символам ASCII в верхнем регистре соответствуют значения байтов из последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
-
bytes.isspace() -
bytearray.isspace() -
Возвращает
True, если все байты в последовательности являются пробельными символами ASCII и последовательность не пуста, иFalseв противном случае. Пробельными символами ASCII являются значения байтов в последовательностиb' \t\n\r\x0b\f'(пробел, табуляция, перевод строки, возврат каретки, вертикальная табуляция, перевод страницы).
-
bytes.istitle() -
bytearray.istitle() -
Возвращает
True, если последовательность записана в регистре заголовка ASCII и не пуста, иFalseв противном случае. Подробнее об определении «регистра заголовка» см. в описанииbytes.title().Например:
>>> b'Hello World'.istitle() True >>> b'Hello world'.istitle() False
-
bytes.isupper() -
bytearray.isupper() -
Возвращает
True, если в последовательности есть хотя бы один прописной буквенный символ ASCII и нет строчных символов ASCII, иFalseв противном случае.Например:
>>> b'HELLO WORLD'.isupper() True >>> b'Hello world'.isupper() False
Строчными символами ASCII являются значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Прописными символами ASCII являются значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
-
bytes.lower() -
bytearray.lower() -
Возвращает копию последовательности, в которой все прописные символы ASCII преобразованы в соответствующие строчные.
Например:
>>> b'Hello World'.lower() b'hello world'
Строчными символами ASCII являются значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Прописными символами ASCII являются значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.splitlines(keepends=False) -
bytearray.splitlines(keepends=False) -
Возвращает список строк двоичной последовательности, разделяя её по границам строк ASCII. Этот метод использует подход универсальных переводов строк для разделения строк. Переводы строк не включаются в результирующий список, если только параметр keepends не задан и не равен true.
Например:
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines() [b'ab c', b'', b'de fg', b'kl'] >>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) [b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
В отличие от
split(), если задана строка-разделитель sep, этот метод возвращает пустой список для пустой строки, а завершающий перевод строки не создаёт дополнительную строку:>>> b"".split(b'\n'), b"Two lines\n".split(b'\n') ([b''], [b'Two lines', b'']) >>> b"".splitlines(), b"One line\n".splitlines() ([], [b'One line'])
-
bytes.swapcase() -
bytearray.swapcase() -
Возвращает копию последовательности, в которой все строчные символы ASCII преобразованы в соответствующие прописные и наоборот.
Например:
>>> b'Hello World'.swapcase() b'hELLO wORLD'
Строчными символами ASCII являются значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Прописными символами ASCII являются значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.В отличие от
str.swapcase(), для двоичных версий всегда выполняется условиеbin.swapcase().swapcase() == bin. Преобразования регистра в ASCII симметричны, хотя для произвольных кодовых точек Unicode это, как правило, неверно.Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.title() -
bytearray.title() -
Возвращает двоичную последовательность в регистре заголовка: слова начинаются с прописного символа ASCII, а остальные символы являются строчными. Символы без регистра остаются без изменений.
Например:
>>> b'Hello world'.title() b'Hello World'
Строчными символами ASCII являются значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Прописными символами ASCII являются значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. Все остальные значения байтов не имеют регистра.Алгоритм использует простое, не зависящее от языка определение слова как группы последовательных букв. Это определение подходит для многих случаев, но из-за него апострофы в сокращениях и притяжательных формах образуют границы слов, что может привести к нежелательному результату:
>>> b"they're bill's friends from the UK".title() b"They'Re Bill'S Friends From The Uk"
Обойти проблему с апострофами можно с помощью регулярных выражений:
>>> import re >>> def titlecase(s): ... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0)[0:1].upper() + ... mo.group(0)[1:].lower(), ... s) ... >>> titlecase(b"they're bill's friends.") b"They're Bill's Friends."Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.upper() -
bytearray.upper() -
Возвращает копию последовательности, в которой все строчные символы ASCII преобразованы в соответствующие прописные.
Например:
>>> b'Hello World'.upper() b'HELLO WORLD'
Строчными символами ASCII являются значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Прописными символами ASCII являются значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.zfill(width) -
bytearray.zfill(width) -
Возвращает копию последовательности, дополненную слева цифрами ASCII
b'0'до длины width. Начальный знак (b'+'/b'-') обрабатывается добавлением заполнения после знака, а не перед ним. Для объектовbytesисходная последовательность возвращается, если значение width меньше или равноlen(seq).Например:
>>> b"42".zfill(5) b'00042' >>> b"-42".zfill(5) b'-0042'
Примечание
Версия этого метода для bytearray не изменяет объект на месте — она всегда создаёт новый объект, даже если изменений не было.
Форматирование байтов в стиле
printf
Примечание
Описанные здесь операции форматирования имеют ряд особенностей, которые приводят к распространённым ошибкам (например, к некорректному отображению кортежей и словарей). Если выводимое значение может быть кортежем или словарём, оберните его в кортеж.
Объекты bytes (bytes/bytearray) имеют одну уникальную встроенную операцию: оператор % (остаток от деления). Он также известен как оператор форматирования или интерполяции bytes. При задании format % values (где format — объект bytes) спецификации преобразования % в format заменяются нулём или несколькими элементами values. Результат аналогичен использованию sprintf() в языке C.
Если для format требуется один аргумент, values может быть одним объектом, не являющимся кортежем. [5] В противном случае values должен быть кортежем, содержащим ровно столько элементов, сколько указано в объекте bytes формата, либо одним объектом-отображением (например, словарём).
Спецификатор преобразования состоит из двух или более символов и включает следующие компоненты, которые должны идти в указанном порядке:
- Символ
'%', отмечающий начало спецификатора. - Ключ отображения (необязательный), состоящий из последовательности символов в круглых скобках (например,
(somename)). - Флаги преобразования (необязательные), влияющие на результат некоторых типов преобразования.
- Минимальная ширина поля (необязательная). Если указана как
'*'(звёздочка), фактическая ширина считывается из следующего элемента кортежа в values, а преобразуемый объект следует после минимальной ширины поля и необязательной точности. - Точность (необязательная), задаваемая как
'.'(точка) с последующим значением точности. Если указана как'*'(звёздочка), фактическая точность считывается из следующего элемента кортежа в values, а преобразуемое значение следует после точности. - Модификатор длины (необязательный).
- Тип преобразования.
Если правый аргумент является словарём (или объектом другого типа отображения), форматы в объекте bytes должны содержать заключённый в круглые скобки ключ отображения этого словаря, вставленный сразу после символа '%'. Ключ отображения выбирает из отображения значение для форматирования. Например:
>>> 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есть понятие элемента — атомарной единицы памяти, обрабатываемой исходным объектом object. Для многих простых типов, таких какbytesиbytearray, элементом является один байт, однако у других типов, таких какarray.array, элементы могут быть крупнее.len(view)равно длинеtolist. Еслиview.ndim = 0, длина равна 1. Еслиview.ndim = 1, длина равна числу элементов в представлении. Для большей размерности длина равна длине представления в виде вложенного списка. Атрибутitemsizeвозвращает число байтов в одном элементе.Объект
memoryviewподдерживает срезы и индексацию для доступа к своим данным. Срез одномерного представления создаёт подвид:>>> v = memoryview(b'abcefg') >>> v[1] 98 >>> v[-1] 103 >>> v[1:4] <memory at 0x7f3ddc9f4350> >>> bytes(v[1:4]) b'bce'
Если
format— один из спецификаторов встроенного формата модуляstruct, поддерживается также индексация целым числом или кортежем целых чисел, возвращающая отдельный элемент соответствующего типа. Одномерные представления памяти можно индексировать целым числом или одноэлементным кортежем. Многомерные представления памяти можно индексировать кортежами ровно из ndim целых чисел, где ndim — число измерений. Представления памяти нулевой размерности можно индексировать пустым кортежем.Вот пример с форматом, отличным от байтового:
>>> import array >>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]Если исходный объект доступен для записи, представление памяти поддерживает присваивание срезу в одном измерении. Изменение размера не допускается:
>>> data = bytearray(b'abcefg') >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b'z') >>> data bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data bytearray(b'z123fg') >>> v[2:3] = b'spam' Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b'spam' >>> data bytearray(b'z1spam')
Одномерные представления памяти хешируемых (доступных только для чтения) типов с форматами ‘B’, ‘b’ или ‘c’ также хешируемы. Хеш определяется как
hash(m) == hash(m.tobytes()):>>> v = memoryview(b'abcefg') >>> hash(v) == hash(b'abcefg') True >>> hash(v[2:4]) == hash(b'ce') True >>> hash(v[::-2]) == hash(b'abcefg'[::-2]) True
Изменено в версии 3.3: Теперь для одномерных представлений памяти можно создавать срезы. Одномерные представления памяти с форматами ‘B’, ‘b’ или ‘c’ теперь хешируемы.
Изменено в версии 3.4: Теперь memoryview автоматически регистрируется в
collections.abc.SequenceИзменено в версии 3.5: Теперь представления памяти можно индексировать кортежами целых чисел.
У
memoryviewесть несколько методов:-
__eq__(exporter) -
Представление памяти и экспортёр PEP 3118 равны, если их формы эквивалентны и все соответствующие значения равны при интерпретации кодов формата операндов с использованием синтаксиса
struct.Для подмножества строк формата
struct, которое в настоящее время поддерживаетсяtolist(),vиwравны, еслиv.tolist() == w.tolist():>>> import array >>> a = array.array('I', [1, 2, 3, 4, 5]) >>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array('b', [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() TrueЕсли одна из строк формата не поддерживается модулем
struct, объекты всегда будут считаться неравными (даже если строки формата и содержимое буферов идентичны):>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b FalseОбратите внимание: как и в случае чисел с плавающей точкой,
v is wне подразумеваетv == wдля объектов 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() -
Возвращает доступную только для чтения версию объекта memoryview. Исходный объект memoryview не изменяется.
>>> m = memoryview(bytearray(b'abc')) >>> mm = m.toreadonly() >>> mm.tolist() [97, 98, 99] >>> mm[0] = 42 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot modify read-only memory >>> m[0] = 43 >>> mm.tolist() [43, 98, 99]
Добавлено в версии 3.8.
-
release() -
Освобождает базовый буфер, предоставленный объектом memoryview. Многие объекты выполняют специальные действия, пока на них существует представление (например,
bytearrayвременно запрещает изменение размера); поэтому вызов release() позволяет как можно скорее снять эти ограничения и освободить все неиспользуемые ресурсы.После вызова этого метода любая дальнейшая операция над представлением вызывает исключение
ValueError(за исключением самогоrelease(), который можно вызывать несколько раз):>>> m = memoryview(b'abc') >>> m.release() >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
Для аналогичного эффекта можно использовать протокол управления контекстом с помощью инструкции
with:>>> with memoryview(b'abc') as m: ... m[0] ... 97 >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
Добавлено в версии 3.2.
-
cast(format[, shape]) -
Преобразует представление памяти в новый формат или форму. По умолчанию shape равно
[byte_length//new_itemsize], что означает, что результирующее представление будет одномерным. Возвращаемое значение — новое представление памяти, но сам буфер не копируется. Поддерживаются преобразования 1D -> C-непрерывное и C-непрерывное -> 1D.Формат назначения ограничен встроенным форматом одного элемента в синтаксисе
struct. Один из форматов должен быть байтовым (‘B’, ‘b’ или ‘c’). Длина результата в байтах должна совпадать с исходной длиной. Обратите внимание, что длина в байтах может зависеть от операционной системы.Преобразование 1D/long в 1D/unsigned bytes:
>>> import array >>> a = array.array('l', [1,2,3]) >>> x = memoryview(a) >>> x.format 'l' >>> x.itemsize 8 >>> len(x) 3 >>> x.nbytes 24 >>> y = x.cast('B') >>> y.format 'B' >>> y.itemsize 1 >>> len(y) 24 >>> y.nbytes 24Преобразование 1D/unsigned bytes в 1D/char:
>>> b = bytearray(b'zyz') >>> x = memoryview(b) >>> x[0] = b'a' Traceback (most recent call last): ... TypeError: memoryview: invalid type for format 'B' >>> y = x.cast('c') >>> y[0] = b'a' >>> b bytearray(b'ayz')Преобразование 1D/bytes в 3D/ints в 1D/signed char:
>>> import struct >>> buf = struct.pack("i"*12, *list(range(12))) >>> x = memoryview(buf) >>> y = x.cast('i', shape=[2,2,3]) >>> y.tolist() [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] >>> y.format 'i' >>> y.itemsize 4 >>> len(y) 2 >>> y.nbytes 48 >>> z = y.cast('b') >>> z.format 'b' >>> z.itemsize 1 >>> len(z) 48 >>> z.nbytes 48Преобразование 1D/unsigned long в 2D/unsigned long:
>>> buf = struct.pack("L"*6, *list(range(6))) >>> x = memoryview(buf) >>> y = x.cast('L', shape=[2,3]) >>> len(y) 2 >>> y.nbytes 48 >>> y.tolist() [[0, 1, 2], [3, 4, 5]]Добавлено в версии 3.3.
Изменено в версии 3.5: Теперь исходный формат не ограничен при преобразовании в байтовое представление.
Также доступны несколько атрибутов только для чтения:
-
obj -
Базовый объект представления памяти:
>>> b = bytearray(b'xyz') >>> m = memoryview(b) >>> m.obj is b True
Добавлено в версии 3.3.
-
nbytes -
nbytes == product(shape) * itemsize == len(m.tobytes()). Это объём пространства в байтах, который занял бы массив в непрерывном представлении. Он не обязательно равенlen(m):>>> import array >>> a = array.array('i', [1,2,3,4,5]) >>> m = memoryview(a) >>> len(m) 5 >>> m.nbytes 20 >>> y = m[::2] >>> len(y) 3 >>> y.nbytes 12 >>> len(y.tobytes()) 12Многомерные массивы:
>>> import struct >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)]) >>> x = memoryview(buf) >>> y = x.cast('d', shape=[3,4]) >>> y.tolist() [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]] >>> len(y) 3 >>> y.nbytes 96Добавлено в версии 3.3.
-
readonly -
Логическое значение, указывающее, доступна ли память только для чтения.
-
format -
Строка, содержащая формат (в стиле модуля
struct) каждого элемента представления. Представление памяти можно создать на основе экспортёров с произвольными строками формата, однако некоторые методы (например,tolist()) ограничены встроенными форматами одного элемента.Изменено в версии 3.3: Теперь формат
'B'обрабатывается в соответствии с синтаксисом модуля struct. Это означает, чтоmemoryview(b'abc')[0] == b'abc'[0] == 97.
-
itemsize -
Размер каждого элемента представления памяти в байтах:
>>> import array, struct >>> m = memoryview(array.array('H', [32000, 32001, 32002])) >>> m.itemsize 2 >>> m[0] 32000 >>> struct.calcsize('H') == m.itemsize True
-
ndim -
Целое число, указывающее, сколько измерений многомерного массива представлено в памяти.
-
shape -
Кортеж целых чисел длины
ndim, задающий форму памяти как N-мерного массива.Изменено в версии 3.3: При ndim = 0 возвращается пустой кортеж вместо
None.
-
strides -
Кортеж целых чисел длины
ndim, задающий размер в байтах для доступа к каждому элементу в каждом измерении массива.Изменено в версии 3.3: При ndim = 0 возвращается пустой кортеж вместо
None.
-
suboffsets -
Используется внутри для массивов в стиле PIL. Значение носит исключительно информационный характер.
-
c_contiguous -
Логическое значение, указывающее, является ли память C-непрерывной.
Добавлено в версии 3.3.
-
f_contiguous -
Логическое значение, указывающее, является ли память непрерывной в порядке Fortran.
Добавлено в версии 3.3.
-
contiguous -
Логическое значение, указывающее, является ли память непрерывной.
Добавлено в версии 3.3.
-
Типы множеств — set, frozenset
Объект set — это неупорядоченная коллекция различных хешируемых объектов. Его часто используют для проверки принадлежности, удаления дубликатов из последовательности и выполнения математических операций, таких как пересечение, объединение, разность и симметрическая разность. (Другие контейнеры описаны в разделах о встроенных классах dict, list и tuple, а также в модуле collections.)
Как и другие коллекции, множества поддерживают x in set, len(set) и for x in
set. Поскольку множества являются неупорядоченными коллекциями, они не хранят позиции элементов или порядок их добавления. Поэтому множества не поддерживают индексацию, срезы и другие операции, характерные для последовательностей.
В настоящее время есть два встроенных типа множеств: set и frozenset. Тип set изменяемый — его содержимое можно менять с помощью таких методов, как add() и remove(). Поскольку этот тип изменяемый, у него нет хеш-значения, и его нельзя использовать ни в качестве ключа словаря, ни в качестве элемента другого множества. Тип frozenset неизменяемый и хешируемый: после создания его содержимое нельзя изменить, поэтому его можно использовать в качестве ключа словаря или элемента другого множества.
Непустые множества (но не frozenset) можно создать, поместив разделённый запятыми список элементов в фигурные скобки, например: {'jack', 'sjoerd'}, а также с помощью конструктора set.
Конструкторы обоих классов работают одинаково:
-
class set([iterable]) -
class frozenset([iterable]) -
Возвращает новый объект set или frozenset, элементы которого взяты из iterable. Элементы множества должны быть хешируемыми. Для представления множеств множеств внутренние множества должны быть объектами
frozenset. Если iterable не указан, возвращается новое пустое множество.Создать множества можно несколькими способами:
- Использовать разделённый запятыми список элементов в фигурных скобках:
{'jack', 'sjoerd'} - Использовать генератор множества:
{c for c in 'abracadabra' if c not in 'abc'} - Использовать конструктор типа:
set(),set('foobar'),set(['a', 'b', 'foo'])
Экземпляры
setиfrozensetподдерживают следующие операции:- len(s)
-
Возвращает число элементов множества s (мощность s).
- x in s
-
Проверяет, содержится ли x в s.
- x not in s
-
Проверяет, не содержится ли x в s.
-
isdisjoint(other) -
Возвращает
True, если у множества нет общих элементов с other. Множества не пересекаются тогда и только тогда, когда их пересечение является пустым множеством.
-
issubset(other) - set <= other
-
Проверяет, содержится ли каждый элемент множества в other.
- set < other
-
Проверяет, является ли множество строгим подмножеством other, то есть
set <= other and set != other.
-
issuperset(other) - set >= other
-
Проверяет, содержится ли каждый элемент other в множестве.
- set > other
-
Проверяет, является ли множество строгим надмножеством other, то есть
set >= other and set != other.
-
union(*others) - set | other | ...
-
Возвращает новое множество, содержащее элементы данного множества и всех остальных.
-
intersection(*others) - set & other & ...
-
Возвращает новое множество, содержащее общие элементы данного множества и всех остальных.
-
difference(*others) - set - other - ...
-
Возвращает новое множество, содержащее элементы данного множества, которых нет в остальных.
-
symmetric_difference(other) - set ^ other
-
Возвращает новое множество, содержащее элементы, которые входят либо в данное множество, либо в other, но не в оба одновременно.
-
copy() -
Возвращает поверхностную копию множества.
Обратите внимание: версии методов
union(),intersection(),difference(),symmetric_difference(),issubset()иissuperset(), не использующие операторы, принимают в качестве аргумента любой итерируемый объект. В отличие от них, соответствующие версии с операторами требуют, чтобы аргументы были множествами. Это позволяет избежать подверженных ошибкам конструкций вродеset('abc') & 'cbs'в пользу более понятной записиset('abc').intersection('cbs').И
set, иfrozensetподдерживают сравнение множеств. Два множества равны тогда и только тогда, когда каждый элемент каждого множества содержится в другом (каждое является подмножеством другого). Одно множество меньше другого тогда и только тогда, когда первое является строгим подмножеством второго (является подмножеством, но не равно ему). Одно множество больше другого тогда и только тогда, когда первое является строгим надмножеством второго (является надмножеством, но не равно ему).Экземпляры
setсравниваются с экземплярамиfrozensetпо их элементам. Например,set('abc') == frozenset('abc')возвращаетTrue, как иset('abc') in set([frozenset('abc')]).Сравнения на подмножество и равенство не образуют полную линейную упорядоченность. Например, любые два непустых непересекающихся множества не равны и не являются подмножествами друг друга, поэтому все следующие выражения возвращают
False:a<b,a==bилиa>b.Поскольку множества задают только частичный порядок (отношения подмножества), результат метода
list.sort()для списков множеств не определён.Элементы множеств, как и ключи словарей, должны быть хешируемыми.
Бинарные операции, применяемые к экземплярам
setиfrozenset, возвращают тип первого операнда. Например,frozenset('ab') | set('bc')возвращает экземплярfrozenset.В следующей таблице перечислены операции, доступные для
set, которые неприменимы к неизменяемым экземплярамfrozenset:-
update(*others) - set |= other | ...
-
Обновляет множество, добавляя элементы из всех остальных множеств.
-
intersection_update(*others) - set &= other & ...
-
Обновляет множество, оставляя только элементы, найденные в нём и во всех остальных множествах.
-
difference_update(*others) - set -= other | ...
-
Обновляет множество, удаляя элементы, найденные в остальных множествах.
-
symmetric_difference_update(other) - set ^= other
-
Обновляет множество, оставляя только элементы, входящие в одно из двух множеств, но не в оба одновременно.
-
add(elem) -
Добавляет элемент elem в множество.
-
remove(elem) -
Удаляет элемент elem из множества. Если elem не содержится в множестве, вызывает исключение
KeyError.
-
discard(elem) -
Удаляет элемент elem из множества, если он в нём присутствует.
-
pop() -
Удаляет и возвращает произвольный элемент множества. Если множество пустое, вызывает исключение
KeyError.
-
clear() -
Удаляет все элементы из множества.
Обратите внимание: версии методов
update(),intersection_update(),difference_update()иsymmetric_difference_update(), не использующие операторы, принимают в качестве аргумента любой итерируемый объект.Обратите внимание: аргумент elem методов
__contains__(),remove()иdiscard()может быть множеством. Для поиска эквивалентного frozenset из elem создаётся временный объект. - Использовать разделённый запятыми список элементов в фигурных скобках:
Типы отображений — dict
Объект отображения сопоставляет хешируемые значения произвольным объектам. Отображения — изменяемые объекты. В настоящее время существует только один стандартный тип отображения — словарь. (О других контейнерах см. встроенные классы list, set и tuple, а также модуль collections.)
Ключами словаря могут быть почти любые значения. Значения, которые не являются хешируемыми, то есть значения, содержащие списки, словари или другие изменяемые типы (сравниваемые по значению, а не по идентичности объекта), нельзя использовать в качестве ключей. Значения, которые сравниваются как равные (например, 1, 1.0 и True), можно взаимозаменяемо использовать для обращения к одной и той же записи словаря.
-
class dict(**kwargs) - class dict(mapping, **kwargs)
- class dict(iterable, **kwargs)
-
Возвращает новый словарь, инициализированный необязательным позиционным аргументом и, возможно, пустым набором именованных аргументов.
Словари можно создать несколькими способами:
- Использовать разделённый запятыми список пар
key: valueв фигурных скобках:{'jack': 4098, 'sjoerd': 4127}или{4098: 'jack', 4127: 'sjoerd'} - Использовать генератор словаря:
{},{x: x ** 2 for x in range(10)} - Использовать конструктор типа:
dict(),dict([('foo', 100), ('bar', 200)]),dict(foo=100, bar=200)
Если позиционный аргумент не задан, создаётся пустой словарь. Если позиционный аргумент задан и является объектом отображения, создаётся словарь с теми же парами ключ-значение, что и у объекта отображения. В противном случае позиционный аргумент должен быть объектом итерируемым. Каждый элемент итерируемого объекта сам должен быть итерируемым объектом, содержащим ровно два объекта. Первый объект каждого элемента становится ключом нового словаря, а второй объект — соответствующим значением. Если ключ встречается более одного раза, соответствующим значением в новом словаре становится последнее значение для этого ключа.
Если заданы именованные аргументы, они вместе со своими значениями добавляются в словарь, созданный из позиционного аргумента. Если добавляемый ключ уже существует, значение из именованного аргумента заменяет значение, полученное из позиционного аргумента.
Для иллюстрации все приведённые ниже примеры возвращают словарь, равный
{"one": 1, "two": 2, "three": 3}:>>> a = dict(one=1, two=2, three=3) >>> b = {'one': 1, 'two': 2, 'three': 3} >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) >>> f = dict({'one': 1, 'three': 3}, two=2) >>> a == b == c == d == e == f TrueПередача именованных аргументов, как в первом примере, работает только для ключей, являющихся допустимыми идентификаторами Python. В остальных случаях можно использовать любые допустимые ключи.
Ниже перечислены операции, поддерживаемые словарями (и, следовательно, поддерживаемые пользовательскими типами отображений):
- list(d)
-
Возвращает список всех ключей, используемых в словаре d.
- len(d)
-
Возвращает количество элементов в словаре d.
- d[key]
-
Возвращает элемент словаря d с ключом key. Если key отсутствует в отображении, вызывает исключение
KeyError.Если подкласс dict определяет метод
__missing__(), а key отсутствует, операцияd[key]вызывает этот метод, передавая ему ключ key в качестве аргумента. Затем операцияd[key]возвращает или вызывает то, что возвращено или вызвано при обращении к__missing__(key). Никакие другие операции или методы не вызывают__missing__(). Если__missing__()не определён, вызывается исключениеKeyError.__missing__()должен быть методом; он не может быть переменной экземпляра:>>> class Counter(dict): ... def __missing__(self, key): ... return 0 >>> c = Counter() >>> c['red'] 0 >>> c['red'] += 1 >>> c['red'] 1
В приведённом выше примере показана часть реализации
collections.Counter. Вcollections.defaultdictиспользуется другой метод__missing__.
- d[key] = value
-
Устанавливает
d[key]равным value.
- del d[key]
-
Удаляет
d[key]из d. Если key отсутствует в отображении, вызывает исключениеKeyError.
- key in d
-
Возвращает
True, если d содержит ключ key, иначеFalse.
- key not in d
-
Эквивалентно
not key in d.
- iter(d)
-
Возвращает итератор по ключам словаря. Это сокращённая форма записи для
iter(d.keys()).
-
clear() -
Удаляет все элементы из словаря.
-
copy() -
Возвращает поверхностную копию словаря.
-
classmethod fromkeys(iterable[, value]) -
Создаёт новый словарь с ключами из iterable и значениями, установленными в value.
fromkeys()— это метод класса, возвращающий новый словарь. По умолчанию value равноNone. Все значения ссылаются на один и тот же экземпляр, поэтому обычно нет смысла использовать в качестве value изменяемый объект, например пустой список. Чтобы получить разные значения, используйте вместо этого генератор словаря.
-
get(key[, default]) -
Возвращает значение для 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]) -
Если 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; оба объекта должны быть словарями. Если в d и other есть общие ключи, приоритет имеют значения из other.
Добавлено в версии 3.9.
- d |= other
-
Обновляет словарь d ключами и значениями из other, который может быть объектом отображения или итерируемым объектом из пар ключ/значение. Если в d и other есть общие ключи, приоритет имеют значения из other.
Добавлено в версии 3.9.
Словари равны тогда и только тогда, когда содержат одинаковые пары
(key, value)(независимо от порядка). Сравнения порядка (‘<’, ‘<=’, ‘>=’, ‘>’) вызывают исключениеTypeError.Словари сохраняют порядок вставки. Обратите внимание, что обновление ключа не влияет на порядок. Ключи, добавленные после удаления, вставляются в конец.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(d) ['one', 'two', 'three', 'four'] >>> list(d.values()) [1, 2, 3, 4] >>> d["one"] = 42 >>> d {'one': 42, 'two': 2, 'three': 3, 'four': 4} >>> del d["two"] >>> d["two"] = None >>> d {'one': 42, 'three': 3, 'four': 4, 'two': None}Изменено в версии 3.7: Гарантируется, что порядок элементов словаря соответствует порядку вставки. В CPython такое поведение было деталью реализации начиная с версии 3.6.
Словари и представления словарей поддерживают обратный перебор.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(reversed(d)) ['four', 'three', 'two', 'one'] >>> list(reversed(d.values())) [4, 3, 2, 1] >>> list(reversed(d.items())) [('four', 4), ('three', 3), ('two', 2), ('one', 1)]Изменено в версии 3.8: Теперь словари поддерживают обратный перебор.
- Использовать разделённый запятыми список пар
См. также
types.MappingProxyType можно использовать для создания доступного только для чтения представления dict.
Объекты-представления словаря
Объекты, возвращаемые методами dict.keys(), dict.values() и dict.items(), являются объектами-представлениями. Они предоставляют динамическое представление записей словаря, то есть при изменении словаря представление отражает эти изменения.
По представлениям словарей можно выполнять перебор, получая соответствующие данные; они также поддерживают проверку принадлежности:
- len(dictview)
-
Возвращает количество записей в словаре.
- iter(dictview)
-
Возвращает итератор по ключам, значениям или элементам словаря (представленным в виде кортежей из
(key, value)).Перебор ключей и значений выполняется в порядке вставки. Это позволяет создавать пары
(value, key)с помощьюzip():pairs = zip(d.values(), d.keys()). Другой способ создать такой же список:pairs = [(v, k) for (k, v) in d.items()].Перебор представлений при добавлении или удалении записей в словаре может вызвать исключение
RuntimeErrorили привести к тому, что будут перебраны не все записи.Изменено в версии 3.7: Гарантируется, что порядок элементов словаря соответствует порядку вставки.
- x in dictview
-
Возвращает
True, если x содержится среди ключей, значений или элементов исходного словаря (в последнем случае x должен быть кортежем(key, value)), иное значение в противном случае.
- reversed(dictview)
-
Возвращает обратный итератор по ключам, значениям или элементам словаря. Перебор представления будет выполняться в порядке, обратном порядку вставки.
Изменено в версии 3.8: Теперь представления словарей поддерживают обратный перебор.
- dictview.mapping
-
Возвращает
types.MappingProxyType, оборачивающий исходный словарь, на который ссылается представление.Добавлено в версии 3.10.
Представления ключей подобны множествам, поскольку их элементы уникальны и хешируемы. Если все значения хешируемы, так что пары (key, value) уникальны и хешируемы, то представление элементов также подобно множеству. (Представления значений не считаются подобными множествам, поскольку их элементы, как правило, не уникальны.) Для представлений, подобных множествам, доступны все операции, определённые для абстрактного базового класса collections.abc.Set (например, ==, < или ^).
Пример использования представления словаря:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()
>>> # iteration
>>> n = 0
>>> for val in values:
... n += val
>>> print(n)
504
>>> # keys and values are iterated over in the same order (insertion order)
>>> list(keys)
['eggs', 'sausage', 'bacon', 'spam']
>>> list(values)
[2, 1, 1, 500]
>>> # view objects are dynamic and reflect dict changes
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['bacon', 'spam']
>>> # set operations
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}
True
>>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}
True
>>> # get back a read-only proxy for the original dictionary
>>> values.mapping
mappingproxy({'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500
Типы менеджеров контекста
Инструкция Python with поддерживает концепцию контекста времени выполнения, задаваемого менеджером контекста. Это реализуется с помощью пары методов, позволяющих пользовательским классам задавать контекст времени выполнения, который начинается перед выполнением тела инструкции и завершается после окончания инструкции:
-
contextmanager.__enter__() -
Входит в контекст времени выполнения и возвращает либо этот объект, либо другой объект, связанный с контекстом времени выполнения. Значение, возвращаемое этим методом, связывается с идентификатором в предложении
asинструкцийwith, использующих этот менеджер контекста.Пример менеджера контекста, возвращающего себя самого, — это файловый объект. Файловые объекты возвращают себя из __enter__(), что позволяет использовать
open()в качестве контекстного выражения в инструкцииwith.Пример менеджера контекста, возвращающего связанный объект, — объект, возвращаемый методом
decimal.localcontext(). Эти менеджеры устанавливают активный десятичный контекст в копию исходного десятичного контекста, а затем возвращают эту копию. Благодаря этому в теле инструкцииwithможно изменять текущий десятичный контекст, не затрагивая код за пределами инструкцииwith.
-
contextmanager.__exit__(exc_type, exc_val, exc_tb) -
Выходит из контекста времени выполнения и возвращает логический флаг, указывающий, следует ли подавить возникшее исключение. Если при выполнении тела инструкции
withвозникло исключение, аргументы содержат тип исключения, его значение и сведения о трассировке. В противном случае все три аргумента равныNone.Возвращение этим методом истинного значения приведёт к тому, что инструкция
withподавит исключение и продолжит выполнение с инструкции, непосредственно следующей за инструкциейwith. В противном случае исключение продолжит распространяться после завершения выполнения этого метода. Исключения, возникшие при выполнении этого метода, заменят любые исключения, возникшие в теле инструкцииwith.Переданное исключение никогда не следует вызывать повторно явно — вместо этого метод должен вернуть ложное значение, чтобы указать, что он завершился успешно и не намерен подавлять возникшее исключение. Это позволяет коду управления контекстом легко определить, завершился ли метод
__exit__()с ошибкой.
Python предоставляет несколько менеджеров контекста для удобной синхронизации потоков, своевременного закрытия файлов и других объектов, а также упрощённой работы с активным контекстом десятичной арифметики. Эти конкретные типы не имеют особого статуса, кроме реализации протокола управления контекстом. Примеры см. в модуле contextlib.
Генераторы Python и декоратор contextlib.contextmanager обеспечивают удобный способ реализации этих протоколов. Если функция-генератор декорирована декоратором contextlib.contextmanager, она возвращает менеджер контекста, реализующий необходимые методы __enter__() и __exit__(), а не итератор, создаваемый недекорированной функцией-генератором.
Обратите внимание, что в структуре типов объектов Python в Python/C API нет специального слота для этих методов. Типы расширений, которым нужно определить такие методы, должны предоставлять их как обычные доступные из Python методы. По сравнению с затратами на создание контекста времени выполнения затраты на один поиск в словаре класса незначительны.
Типы аннотаций — Обобщённый псевдоним, Объединение
Основные встроенные типы для аннотаций типов — это обобщённый псевдоним и объединение.
Тип обобщённого псевдонима
Объекты GenericAlias обычно создаются с помощью индексации класса. Чаще всего их используют с классами-контейнерами, такими как list или dict. Например, list[int] — это объект GenericAlias, созданный индексацией класса list с аргументом int. Объекты GenericAlias предназначены преимущественно для использования в аннотациях типов.
Примечание
Индексировать класс обычно можно только в том случае, если в нём реализован специальный метод __class_getitem__().
Объект GenericAlias выступает в качестве прокси для обобщённого типа, реализуя параметризованные обобщённые типы.
Для класса-контейнера аргументы, передаваемые при индексации класса, могут указывать типы элементов, содержащихся в объекте. Например, set[bytes] можно использовать в аннотациях типов, чтобы обозначить set, все элементы которого имеют тип bytes.
Для класса, в котором определён метод __class_getitem__(), но который не является контейнером, аргументы, передаваемые при индексации класса, часто указывают типы возвращаемых значений одного или нескольких методов объекта. Например, regular expressions можно использовать как с типом данных str, так и с типом данных bytes:
- Если
x = re.search('foo', 'foo'),xбудет объектом re.Match, в котором возвращаемые значенияx.group(0)иx[0]будут иметь типstr. Такой объект можно представить в аннотациях типов с помощью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
Однако такие выражения допустимы при использовании переменных типов. Индекс должен содержать столько же элементов, сколько элементов переменных типов в атрибуте __args__ объекта GenericAlias.
>>> 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__(), тип Union может переопределить этот метод:
>>> class M(type): ... def __or__(self, other): ... return "Hello" ... >>> class C(metaclass=M): ... pass ... >>> C | int 'Hello' >>> int | C int | C
См. также
PEP 604 — PEP, предлагающий синтаксис X | Y и тип Union.
Добавлено в версии 3.10.
Другие встроенные типы
Интерпретатор поддерживает несколько других видов объектов. Большинство из них поддерживают только одну или две операции.
Модули
Единственная специальная операция для модуля — доступ к атрибуту: m.name, где m — модуль, а name обращается к имени, определённому в таблице символов m. Атрибутам модуля можно присваивать значения. (Обратите внимание, что инструкция import, строго говоря, не является операцией над объектом модуля; import
foo не требует, чтобы существовал объект модуля с именем foo, а требует наличия где-либо (внешнего) определения модуля с именем foo.)
Особый атрибут каждого модуля — __dict__. Это словарь, содержащий таблицу символов модуля. Изменение этого словаря фактически изменяет таблицу символов модуля, но прямое присваивание атрибуту __dict__ невозможно (можно написать m.__dict__['a'] = 1, что определяет m.a как 1, но нельзя написать m.__dict__ = {}). Изменять __dict__ напрямую не рекомендуется.
Встроенные в интерпретатор модули записываются так: <module 'sys'
(built-in)>. Если они загружены из файла, то записываются как <module 'os' from
'/usr/local/lib/pythonX.Y/os.pyc'>.
Классы и экземпляры классов
См. разделы Объекты, значения и типы и Определения классов.
Функции
Объекты-функции создаются определениями функций. Единственная операция над объектом-функцией — вызов: func(argument-list).
На самом деле существует два вида объектов-функций: встроенные функции и функции, определённые пользователем. Оба вида поддерживают одну и ту же операцию (вызов функции), но реализованы по-разному, поэтому это разные типы объектов.
Дополнительные сведения см. в разделе Определения функций.
Методы
Методы — это функции, которые вызываются с помощью записи через атрибут. Существуют два вида: встроенные методы (например, append() у списков) и методы экземпляров классов. Встроенные методы описаны вместе с типами, которые их поддерживают.
Если получить доступ к методу (функции, определённой в пространстве имён класса) через экземпляр, будет получен особый объект: связанный метод (также называемый объектом метода экземпляра). При вызове он добавит аргумент self в список аргументов. У связанных методов есть два особых атрибута, доступных только для чтения: m.__self__ — объект, над которым выполняется метод, а m.__func__ — функция, реализующая метод. Вызов m(arg-1, arg-2, ..., arg-n) полностью эквивалентен вызову m.__func__(m.__self__, arg-1, arg-2, ...,
arg-n).
Как и объекты-функции, объекты связанных методов поддерживают получение произвольных атрибутов. Однако, поскольку атрибуты метода фактически хранятся в лежащем в его основе объекте-функции (method.__func__), присваивание атрибутов связанным методам запрещено. Попытка задать атрибут метода приводит к возникновению исключения AttributeError. Чтобы задать атрибут метода, необходимо явно установить его для лежащего в основе объекта-функции:
>>> class C: ... def method(self): ... pass ... >>> c = C() >>> c.method.whoami = 'my name is method' # can't set on the method Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'method' object has no attribute 'whoami' >>> c.method.__func__.whoami = 'my name is method' >>> c.method.whoami 'my name is method'
Дополнительные сведения см. в разделе Методы экземпляров.
Объекты кода
Объекты кода используются реализацией для представления «псевдоскомпилированного» исполняемого кода Python, например тела функции. Они отличаются от объектов-функций тем, что не содержат ссылку на глобальное окружение выполнения. Объекты кода возвращаются встроенной функцией compile() и могут быть извлечены из объектов-функций через их атрибут __code__. См. также модуль code.
Доступ к __code__ вызывает событие аудита object.__getattr__ с аргументами obj и "__code__".
Объект кода можно выполнить или вычислить, передав его (вместо исходной строки) встроенным функциям exec() или eval().
Дополнительные сведения см. в разделе Стандартная иерархия типов.
Объекты типов
Объекты типов представляют различные типы объектов. Тип объекта можно получить с помощью встроенной функции type(). Для типов не предусмотрено специальных операций. Стандартный модуль types определяет имена всех стандартных встроенных типов.
Типы записываются так: <class 'int'>.
Объект Null
Этот объект возвращается функциями, которые явно не возвращают значение. Он не поддерживает специальных операций. Существует ровно один объект Null, называемый None (встроенное имя). type(None)() возвращает тот же одиночный объект.
Он записывается как None.
Объект многоточия
Этот объект обычно используется при срезах (см. раздел Срезы). Он не поддерживает специальных операций. Существует ровно один объект многоточия, называемый Ellipsis (встроенное имя). type(Ellipsis)() возвращает одиночный объект Ellipsis.
Он записывается как Ellipsis или ....
Объект NotImplemented
Этот объект возвращается при сравнениях и бинарных операциях, если их пытаются применить к типам, которые они не поддерживают. Дополнительные сведения см. в разделе Сравнения. Существует ровно один объект NotImplemented. type(NotImplemented)() возвращает этот одиночный экземпляр.
Он записывается как NotImplemented.
Логические значения
Логические значения — это два постоянных объекта False и True. Они используются для представления истинностных значений (хотя и другие значения также могут считаться ложными или истинными). В числовом контексте (например, при использовании в качестве аргумента арифметического оператора) они ведут себя соответственно как целые числа 0 и 1. Встроенную функцию bool() можно использовать для преобразования любого значения в логическое, если это значение можно интерпретировать как истинностное (см. приведённый выше раздел Проверка истинностного значения).
Они записываются соответственно как False и True.
Внутренние объекты
См. соответствующие сведения в разделе Стандартная иерархия типов. В нём описаны объекты кадров стека, объекты трассировки стека и объекты срезов.
Специальные атрибуты
Реализация добавляет несколько специальных атрибутов, доступных только для чтения, к некоторым типам объектов, если они применимы. Некоторые из них не отображаются встроенной функцией dir().
-
object.__dict__ -
Словарь или другой объект отображения, используемый для хранения (доступных для записи) атрибутов объекта.
-
instance.__class__ -
Класс, к которому принадлежит экземпляр класса.
-
class.__bases__ -
Кортеж базовых классов объекта класса.
-
definition.__name__ -
Имя класса, функции, метода, дескриптора или экземпляра генератора.
-
definition.__qualname__ -
Квалифицированное имя класса, функции, метода, дескриптора или экземпляра генератора.
Добавлено в версии 3.3.
-
class.__mro__ -
Этот атрибут представляет собой кортеж классов, которые учитываются при поиске базовых классов во время разрешения методов.
-
class.mro() -
Этот метод можно переопределить в метаклассе, чтобы настроить порядок разрешения методов для его экземпляров. Он вызывается при создании экземпляра класса, а результат сохраняется в
__mro__.
-
class.__subclasses__() -
Каждый класс хранит список слабых ссылок на свои непосредственные подклассы. Этот метод возвращает список всех ещё действующих ссылок. Список упорядочен по порядку определения. Пример:
>>> int.__subclasses__() [<class 'bool'>, <enum 'IntEnum'>, <flag 'IntFlag'>, <class 're._constants._NamedIntConstant'>]
Ограничение длины при преобразовании целых чисел в строки
В CPython действует глобальное ограничение на преобразование между int и str для защиты от атак типа «отказ в обслуживании». Это ограничение применяется только к десятичным и другим системам счисления, основание которых не является степенью двойки. Преобразования в шестнадцатеричную, восьмеричную и двоичную системы не ограничены. Ограничение можно настроить.
Тип int в CPython представляет собой число произвольной длины, хранящееся в двоичном виде (обычно называемое «большим числом»). Не существует алгоритма, который мог бы преобразовать строку в двоичное целое число или двоичное целое число в строку за линейное время, если только основание системы счисления не является степенью 2. Даже лучшие известные алгоритмы для основания 10 имеют сложность выше квадратичной. Преобразование большого значения, например int('1' *
500_000), может занять более секунды даже на быстром процессоре.
Ограничение размера преобразования — практичный способ избежать CVE-2020-10735.
Ограничение применяется к количеству символов цифр во входной или выходной строке, если используется алгоритм преобразования с нелинейной сложностью. Подчёркивания и знак не учитываются при подсчёте.
Если операция превысит ограничение, будет возбуждено исключение ValueError:
>>> import sys
>>> sys.set_int_max_str_digits(4300) # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit
>>> i = int('2' * 4300)
>>> len(str(i))
4300
>>> i_squared = i*i
>>> len(str(i_squared))
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit
>>> len(hex(i_squared))
7144
>>> assert int(hex(i_squared), base=16) == i*i # Hexadecimal is unlimited.
По умолчанию ограничение составляет 4300 цифр, как указано в sys.int_info.default_max_str_digits. Минимальное настраиваемое ограничение составляет 640 цифр, как указано в sys.int_info.str_digits_check_threshold.
Проверка:
>>> import sys
>>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info
>>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info
>>> msg = int('578966293710682886880994035146873798396722250538762761564'
... '9252925514383915483333812743580549779436104706260696366600'
... '571186405732').to_bytes(53, 'big')
...
Добавлено в версии 3.11.
Затронутые API
Ограничение применяется только к потенциально медленным преобразованиям между int и str или bytes:
-
int(string)с основанием по умолчанию 10. -
int(string, base)для всех оснований, не являющихся степенью 2. -
str(integer). -
repr(integer). - любое другое преобразование строки в основание 10, например
f"{integer}","{}".format(integer)илиb"%d" % integer.
Ограничения не применяются к функциям с линейным алгоритмом:
-
int(string, base)с основанием 2, 4, 8, 16 или 32. -
int.from_bytes()иint.to_bytes(). -
hex(),oct(),bin(). - Мини-язык спецификации формата для шестнадцатеричных, восьмеричных и двоичных чисел.
-
Преобразование
strвfloat. -
Преобразование
strвdecimal.Decimal.
Настройка ограничения
До запуска Python можно настроить ограничение с помощью переменной окружения или флага командной строки интерпретатора:
-
PYTHONINTMAXSTRDIGITS, напримерPYTHONINTMAXSTRDIGITS=640 python3, чтобы установить ограничение в 640, илиPYTHONINTMAXSTRDIGITS=0 python3, чтобы отключить ограничение. -
-X int_max_str_digits, напримерpython3 -X int_max_str_digits=640 -
sys.flags.int_max_str_digitsсодержит значениеPYTHONINTMAXSTRDIGITSили-X int_max_str_digits. Если заданы и переменная окружения, и параметр-X, приоритет имеет параметр-X. Значение -1 означает, что оба параметра не были заданы и при инициализации использовалось значениеsys.int_info.default_max_str_digits.
Из кода можно проверить текущее ограничение и задать новое с помощью следующих API модуля sys:
-
sys.get_int_max_str_digits()иsys.set_int_max_str_digits()— функции получения и установки ограничения для всего интерпретатора. У подинтерпретаторов собственное ограничение.
Сведения о значении по умолчанию и минимальном значении приведены в sys.int_info:
-
sys.int_info.default_max_str_digits— ограничение, заданное по умолчанию при компиляции. -
sys.int_info.str_digits_check_threshold— наименьшее допустимое значение ограничения (кроме 0, отключающего его).
Добавлено в версии 3.11.
Предупреждение
Установка низкого ограничения может привести к проблемам. Хотя это случается редко, существуют фрагменты кода с целочисленными константами в десятичной записи, превышающими минимальный порог. Если установить ограничение, исходный код Python с десятичными целочисленными литералами, длина которых превышает это ограничение, вызовет ошибку при синтаксическом анализе — обычно во время запуска или импорта, а иногда и при установке, — если для этого кода ещё не существует актуального .pyc. Для исходного кода с такими большими константами можно преобразовать их в шестнадцатеричную форму 0x, поскольку она не ограничена.
Тщательно протестируйте приложение, если используете низкое ограничение. Убедитесь, что тесты запускаются с ограничением, заданным заранее через переменную окружения или флаг, чтобы оно применялось при запуске и даже во время установки, если на каком-либо её этапе Python вызывается для предварительной компиляции исходных файлов .py в файлы .pyc.
Рекомендуемая конфигурация
Значение по умолчанию sys.int_info.default_max_str_digits считается подходящим для большинства приложений. Если приложению требуется другое ограничение, задайте его в основной точке входа, используя код, не зависящий от версии Python, поскольку эти API были добавлены в выпусках исправлений безопасности для версий до 3.11.
Пример:
>>> 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.11/library/stdtypes.html