Встроенные типы
В следующих разделах описаны стандартные типы, встроенные в интерпретатор.
Основные встроенные типы — это числовые типы, последовательности, отображения, классы, экземпляры и исключения.
Некоторые классы коллекций являются изменяемыми. Методы, которые добавляют, вычитают или переупорядочивают их члены на месте, и не возвращают конкретный элемент, никогда не возвращают сам экземпляр коллекции, а 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 ложно, то y, иначе x | (1) |
| если x ложно, то x, иначе y | (2) |
| если x ложно, то | (3) |
Примечания:
- Это оператор короткого замыкания, поэтому он вычисляет второй аргумент только если первый аргумент ложный.
- Это оператор короткого замыкания, поэтому он вычисляет второй аргумент только если первый аргумент истинный.
-
notимеет более низкий приоритет, чем небулевы операторы, поэтомуnot a == bинтерпретируется какnot (a == b), аa == not b— синтаксическая ошибка.
Сравнения
В Python существует восемь операций сравнения. У них все одинаковый приоритет (который выше, чем у логических операций). Сравнения могут быть сколь угодно длинными; например, x < y <= z эквивалентно x < y and
y <= z, за исключением того, что y оценивается только один раз (но в обоих случаях z не оценивается вообще, когда x < y окажется ложным).
В этой таблице подведены итоги операций сравнения:
Операция | Значение |
|---|---|
| строго меньше |
| меньше или равно |
| строго больше |
| больше или равно |
| равно |
| не равно |
| тождественность объекта |
| отрицание тождественности объекта |
Объекты разных типов, за исключением различных числовых типов, никогда не сравниваются как равные. Оператор == всегда определен, но для некоторых типов объектов (например, для объектов классов) эквивалентен is. Операторы <, <=, > и >= определены только там, где это имеет смысл; например, они генерируют исключение TypeError, когда один из аргументов является комплексным числом.
Нетождественные экземпляры класса обычно сравниваются как неравные, если только класс не определяет метод __eq__().
Экземпляры класса не могут быть упорядочены относительно других экземпляров того же класса или других типов объектов, если класс не определяет достаточно методов __lt__(), __le__(), __gt__() и __ge__() (в общем случае, __lt__() и __eq__() достаточно, если вы хотите получить стандартные значения операторов сравнения).
Поведение операторов is и is not не может быть настраиваемым; также они могут применяться к любым двум объектам и никогда не генерируют исключение.
Ещё две операции с тем же синтаксическим приоритетом, in и not in, поддерживаются типами, которые являются итерируемыми или реализуют метод __contains__().
Числовые типы — int, float, complex
Существует три различных числовых типа: целые числа, числа с плавающей точкой и комплексные числа. Кроме того, булевы значения являются подтипом целых чисел. Целые числа имеют неограниченную точность. Числа с плавающей точкой обычно реализуются с использованием double в C; информация о точности и внутреннем представлении чисел с плавающей точкой для машины, на которой выполняется ваша программа, доступна в sys.float_info. Комплексные числа имеют действительную и мнимую части, каждая из которых является числом с плавающей точкой. Для извлечения этих частей из комплексного числа z используйте z.real и z.imag. (В стандартной библиотеке есть дополнительные числовые типы fractions.Fraction для рациональных чисел и decimal.Decimal для чисел с плавающей точкой с определяемой пользователем точностью.)
Числа создаются с помощью числовых литералов или в результате встроенных функций и операторов. Числовые литералы без декораций (включая шестнадцатеричные, восьмеричные и двоичные числа) дают целые числа. Числовые литералы, содержащие десятичную точку или знак экспоненты, дают числа с плавающей точкой. Присоединение 'j' или 'J' к числовому литералу дает мнимое число (комплексное число с нулевой действительной частью), которое вы можете добавить к целому числу или числу с плавающей точкой, чтобы получить комплексное число с действительной и мнимой частями.
Python полностью поддерживает смешанную арифметику: когда бинарный арифметический оператор имеет операнды разных числовых типов, операнд с «более узким» типом расширяется до типа другого операнда, где целое число является более узким типом, чем число с плавающей точкой, которое является более узким типом, чем комплексное число. Сравнение чисел разных типов ведет себя так, как будто сравнивались точные значения этих чисел. 2
Конструкторы int(), float() и complex() могут использоваться для создания чисел определенного типа.
Все числовые типы (кроме комплексных) поддерживают следующие операции (для приоритетов операций см. Порядок приоритета операторов):
Операция | Результат | Примечания | Полное описание |
|---|---|---|---|
| сумма x и y | ||
| разность x и y | ||
| произведение x и y | ||
| частное x и y | ||
| целочисленное частное от деления x на y | (1) | |
| остаток от деления | (2) | |
| x с отрицательным знаком | ||
| x без изменений | ||
| модуль или величина x | ||
| x преобразован к целому числу | (3)(6) | |
| x преобразован к числу с плавающей точкой | (4)(6) | |
| комплексное число с действительной частью re, мнимой частью im. im по умолчанию равно нулю. | (6) | |
| сопряженное комплексное число c | ||
| пара | (2) | |
| x в степени y | (5) | |
| x в степени y | (5) |
Примечания:
- Также называется целочисленным делением. Результирующее значение — целое число, хотя тип результата необязательно int. Результат всегда округляется к минус бесконечности:
1//2равно0,(-1)//2равно-1,1//(-2)равно-1, и(-1)//(-2)равно0. - Не для комплексных чисел. Вместо этого преобразуйте в числа с плавающей точкой с помощью
abs(), если необходимо. - Преобразование из числа с плавающей точкой в целое число может округлять или усекать как в C; см. функции
math.floor()иmath.ceil()для четко определенных преобразований. - float также принимает строки “nan” и “inf” с необязательным префиксом “+” или “-” для Не Числа (NaN) и положительной или отрицательной бесконечности.
- Python определяет
pow(0, 0)и0 ** 0как1, как это обычно делается в языках программирования. -
Принимаемые числовые литералы включают цифры
0по9или любой эквивалент Unicode (кодовые точки сNdсвойством).См. https://www.unicode.org/Public/13.0.0/ucd/extracted/DerivedNumericType.txt для полного списка кодовых точек с
Ndсвойством.
Все типы numbers.Real ( int и float) также включают следующие операции:
Операция | Результат |
|---|---|
x усечен до | |
x округлен до n знаков, округление по правилам «половина к четному». Если n опущено, оно по умолчанию равно 0. | |
наибольшее | |
наименьшее |
Для дополнительных числовых операций см. модули math и cmath.
Побитовые операции над целыми типами
Побитовые операции имеют смысл только для целых чисел. Результат побитовых операций вычисляется так, как будто они выполняются в дополнении до двух с бесконечным количеством знаковых битов.
Приоритеты бинарных побитовых операций ниже приоритетов арифметических операций и выше приоритетов сравнений; унарная операция ~ имеет тот же приоритет, что и другие унарные арифметические операции (+ и -).
В этой таблице побитовые операции упорядочены по возрастанию приоритета:
Операция | Результат | Примечания |
|---|---|---|
| побитовое или от x и y | (4) |
| побитовое исключающее или от x и y | (4) |
| побитовое и от x и y | (4) |
| сдвиг x влево на n битов | (1)(2) |
| сдвиг x вправо на n битов | (1)(3) |
| инверсия битов x |
Примечания:
- Отрицательные сдвиги недопустимы и вызывают исключение
ValueError. - Сдвиг влево на n битов эквивалентен умножению на
pow(2, n). - Сдвиг вправо на n битов эквивалентен целочисленному делению с отбрасыванием дробной части (floor division) на
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.to_bytes(length, byteorder, *, signed=False) -
Возвращает массив байтов, представляющий целое число.
>>> (1024).to_bytes(2, byteorder='big') b'\x04\x00' >>> (1024).to_bytes(10, byteorder='big') b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' >>> (-1024).to_bytes(10, byteorder='big', signed=True) b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' >>> x = 1000 >>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little') b'\xe8\x03'
Целое число представляется с использованием length байтов. Если целое число не может быть представлено заданным количеством байтов, генерируется исключение
OverflowError.Аргумент byteorder определяет порядок байтов, используемый для представления целого числа. Если byteorder равен
"big", самый старший байт находится в начале массива байтов. Если byteorder равен"little", самый старший байт находится в конце массива байтов. Чтобы запросить порядок байтов хост-системы, используйте значениеsys.byteorderдля byteorder.Аргумент signed определяет, используется ли дополнение до двух для представления целого числа. Если signed равно
Falseи задано отрицательное целое число, генерируется исключениеOverflowError. Значение по умолчанию для signed равноFalse.Добавлено в версии 3.2.
-
classmethod int.from_bytes(bytes, byteorder, *, signed=False) -
Возвращает целое число, представленное заданным массивом байтов.
>>> int.from_bytes(b'\x00\x10', byteorder='big') 16 >>> int.from_bytes(b'\x00\x10', byteorder='little') 4096 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) -1024 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False) 64512 >>> int.from_bytes([255, 0, 0], byteorder='big') 16711680
Аргумент bytes должен быть объектом-подобным байтам или итерируемым объектом, возвращающим байты.
Аргумент byteorder определяет порядок байтов, используемый для представления целого числа. Если byteorder равен
"big", самый старший байт находится в начале массива байтов. Если byteorder равен"little", самый старший байт находится в конце массива байтов. Чтобы запросить порядок байтов хост-системы, используйте значениеsys.byteorderдля byteorder.Аргумент signed указывает, используется ли дополнение до двух для представления целого числа.
Добавлено в версии 3.2.
-
int.as_integer_ratio() -
Возвращает пару целых чисел, отношение которых точно равно исходному целому числу и с положительным знаменателем. Целочисленное отношение целых чисел всегда имеет целое число в качестве числителя и
1в качестве знаменателя.Добавлено в версии 3.8.
Дополнительные методы для типа float
Тип float реализует numbers.Real абстрактный базовый класс. Тип float также имеет следующие дополнительные методы.
-
float.as_integer_ratio() -
Возвращает пару целых чисел, отношение которых точно равно исходному числу с плавающей запятой и с положительным знаменателем. Возвращает исключение
OverflowErrorдля бесконечностей и исключениеValueErrorдля NaN.
-
float.is_integer() -
Возвращает
Trueесли экземпляр числа с плавающей точкой является конечным с целым значением, иFalseв противном случае:>>> (-2.0).is_integer() True >>> (3.2).is_integer() False
Два метода поддерживают преобразование в и из шестнадцатеричных строк. Поскольку числа с плавающей запятой в Python хранятся внутри как двоичные числа, преобразование числа с плавающей запятой в или из десятичной строки обычно приводит к небольшой ошибке округления. В противоположность этому, шестнадцатеричные строки позволяют точное представление и задание чисел с плавающей запятой. Это может быть полезно при отладке и в численных расчетах.
-
float.hex() -
Возвращает шестнадцатеричное представление числа с плавающей запятой. Для конечных чисел с плавающей запятой это представление всегда включает ведущую
0xи заключительнуюpи показатель степени.
-
classmethod float.fromhex(s) -
Метод класса для возвращения числа с плавающей запятой, представленного шестнадцатеричной строкой s. Строка s может иметь пробелы в начале и конце.
Обратите внимание, что float.hex() — метод экземпляра, а float.fromhex() — метод класса.
Шестнадцатеричная строка имеет вид:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
где необязательный sign может быть + или -, integer и fraction — строки шестнадцатеричных цифр, а exponent — целое десятичное число с необязательным ведущим знаком. Регистр не имеет значения, и должно быть хотя бы одно шестнадцатеричное число в целой или дробной части. Этот синтаксис аналогичен синтаксису, указанному в разделе 6.4.4.2 стандарта C99, а также синтаксису, используемому в Java 1.5 и более поздних версиях. В частности, вывод float.hex() может использоваться как шестнадцатеричная литеральная константа числа с плавающей запятой в коде C или Java, а шестнадцатеричные строки, созданные форматирующим символом %a языка C или форматирующим символом Double.toHexString языка Java, принимаются float.fromhex().
Обратите внимание, что показатель степени записывается в десятичном, а не в шестнадцатеричном формате, и что он указывает степень 2, на которую нужно умножить коэффициент. Например, шестнадцатеричная строка 0x3.a7p10 представляет число с плавающей запятой (3 + 10./16 + 7./16**2) * 2.0**10, или 3740.0:
>>> float.fromhex('0x3.a7p10')
3740.0
Применение обратного преобразования к 3740.0 даёт другую шестнадцатеричную строку, представляющую то же самое число:
>>> float.hex(3740.0) '0x1.d380000000000p+11'
Хэширование числовых типов
Для чисел x и y, возможно, разных типов, требуется, чтобы hash(x) == hash(y) всякий раз, когда x == y (см. документацию метода __hash__() для получения более подробной информации). Для простоты реализации и эффективности работы с различными числовыми типами (включая int, float, decimal.Decimal и fractions.Fraction) хэш-функция Python для числовых типов основана на одной математической функции, определённой для любого рационального числа, и поэтому применяется ко всем экземплярам int и fractions.Fraction, и ко всем конечным экземплярам float и decimal.Decimal. По сути, эта функция задаётся как остаток от деления на P для заданного простого числа P. Значение P доступно для Python как атрибут modulus объекта sys.hash_info.
Деталь реализации CPython: В настоящее время используемое простое число равно P = 2**31 - 1 на машинах с 32-битными C-целыми числами и P = 2**61 - 1 на машинах с 64-битными C-целыми числами.
Вот подробное описание правил:
- Если
x = m / n— неотрицательное рациональное число, иnне делится наP, определитеhash(x)какm * invmod(n, P) % P, гдеinvmod(n, P)даёт обратное значениеnпо модулюP. - Если
x = m / n— неотрицательное рациональное число, иnделится наP(ноmне делится), то уnнет обратного значения по модулюP, и правило выше не применяется; в этом случае определитеhash(x)как постоянное значениеsys.hash_info.inf. - Если
x = m / n— отрицательное рациональное число, определитеhash(x)как-hash(-x). Если полученный хэш равен-1, замените его на-2. - Конкретные значения
sys.hash_info.inf,-sys.hash_info.infиsys.hash_info.nanиспользуются в качестве хэшей для положительной бесконечности, отрицательной бесконечности или NaN (соответственно). (Все хэшируемые NaN имеют одинаковый хэш). - Для комплексного числа
complexz, хэши действительной и мнимой частей объединяются вычислениемhash(z.real) + sys.hash_info.imag * hash(z.imag), остаток от деления на2**sys.hash_info.width, так, чтобы он лежал вrange(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1)). Опять же, если результат равен-1, он заменяется на-2.
Для большей ясности вышеуказанных правил, вот пример кода Python, эквивалентного встроенному хэшированию, для вычисления хэша рационального числа, float или complex:
import sys, math
def hash_fraction(m, n):
"""Compute the hash of a rational number m / n.
Assumes m and n are integers, with n positive.
Equivalent to hash(fractions.Fraction(m, n)).
"""
P = sys.hash_info.modulus
# Remove common factors of P. (Unnecessary if m and n already coprime.)
while m % P == n % P == 0:
m, n = m // P, n // P
if n % P == 0:
hash_value = sys.hash_info.inf
else:
# Fermat's Little Theorem: pow(n, P-1, P) is 1, so
# pow(n, P-2, P) gives the inverse of n modulo P.
hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
if m < 0:
hash_value = -hash_value
if hash_value == -1:
hash_value = -2
return hash_value
def hash_float(x):
"""Compute the hash of a float x."""
if math.isnan(x):
return sys.hash_info.nan
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-объектов в API Python/C.
Сами объекты-итераторы должны поддерживать следующие два метода, которые вместе образуют протокол итератора:
-
iterator.__iter__() -
Возвращает сам объект-итератор. Это необходимо для использования контейнеров и итераторов с операторами
forиin. Этот метод соответствует слотуtp_iterструктуры типа для Python-объектов в API Python/C.
-
iterator.__next__() -
Возвращает следующий элемент из контейнера. Если больше элементов нет, генерируется исключение
StopIteration. Этот метод соответствует слотуtp_iternextструктуры типа для Python-объектов в API Python/C.
Python определяет несколько объектов-итераторов для поддержки итераций по общим и специфическим последовательностям, словарям и другим специализированным формам. Конкретные типы не важны, за исключением их реализации протокола итератора.
После того, как метод __next__() итератора сгенерирует исключение StopIteration, он должен продолжать генерировать это исключение при последующих вызовах. Реализации, которые не подчиняются этому свойству, считаются некорректными.
Типы генераторов
Генераторы Python предоставляют удобный способ реализации протокола итератора. Если метод __iter__() объекта-контейнера реализован как генератор, он автоматически вернёт объект-итератор (технически, объект генератора), предоставляя методы __iter__() и __next__(). Более подробную информацию о генераторах можно найти в документации по выражению yield.
Типы последовательностей — список, кортеж, диапазон
Существует три основных типа последовательностей: списки, кортежи и объекты диапазона. Дополнительные типы последовательностей, предназначенные для обработки бинарных данных и строк текста, описаны в отдельных разделах.
Общие операции с последовательностями
Операции в следующей таблице поддерживаются большинством типов последовательностей, как изменяемыми, так и неизменяемыми. collections.abc.Sequence ABC предоставляет удобный способ правильной реализации этих операций для пользовательских типов последовательностей.
В этой таблице операции упорядочены по возрастанию приоритета. В таблице 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 |
Последовательности одного типа также поддерживают сравнения. В частности, кортежи и списки сравниваются лексикографически путем сравнения соответствующих элементов. Это означает, что для равенства каждый элемент должен быть равен, и две последовательности должны быть одного типа и иметь одинаковую длину. (Полные подробности см. в разделе Сравнения в справочнике языка.)
Примечания:
-
Хотя операции
inиnot inв общем случае используются только для простого тестирования включения, некоторые специализированные последовательности (такие какstr,bytesиbytearray) также используют их для проверки подпоследовательности:>>> "gg" in "eggs" True
-
Значения n, меньшие
0, обрабатываются как0(что приводит к пустой последовательности того же типа, что и s). Обратите внимание, что элементы в последовательности s не копируются; они ссылаются несколько раз. Это часто беспокоит начинающих программистов Python; рассмотрите:>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]]
Произошло следующее:
[[]]— это список из одного элемента, содержащий пустой список, поэтому все три элемента[[]] * 3ссылаются на этот единственный пустой список. Изменение любого из элементовlistsизменяет этот единственный список. Вы можете создать список различных списков таким образом:>>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists [[3], [5], [7]]
Дополнительные объяснения см. в записи FAQ Как создать многомерный список?.
- Если i или j отрицательны, индекс относится к концу последовательности s:
len(s) + iилиlen(s) + jзаменяются. Но обратите внимание, что-0по-прежнему0. - Срез s от i до j определяется как последовательность элементов с индексом k, таким что
i <= k < j. Если i или j большеlen(s), используйтеlen(s). Если i опущено илиNone, используйте0. Если j опущено илиNone, используйтеlen(s). Если i больше или равно j, срез пустой. - Срез s от i до j с шагом k определяется как последовательность элементов с индексом
x = i + n*kтаким образом, что0 <= n < (j-i)/k. Другими словами, индексы — этоi,i+k,i+2*k,i+3*kи так далее, останавливаясь, когда достигается j (но никогда не включая j). Когда k положительно, i и j сокращаются доlen(s)если они больше. Когда k отрицательно, i и j сокращаются доlen(s) - 1если они больше. Если i или j опущено илиNone, они становятся «конечными» значениями (которые зависят от знака k). Обратите внимание, что k не может быть нулём. Если kNone, он обрабатывается как1. -
Конкатенация неизменяемых последовательностей всегда приводит к новому объекту. Это означает, что построение последовательности с помощью многократной конкатенации потребует квадратичной временной сложности по общей длине последовательности. Чтобы получить линейную временную сложность, необходимо перейти к одному из приведенных ниже альтернативных вариантов:
- при конкатенации объектов
strвы можете создать список и использоватьstr.join()в конце или же записывать в экземплярio.StringIOи извлекать его значение, когда завершение будет достигнуто - при конкатенации объектов
bytesвы можете аналогично использоватьbytes.join()илиio.BytesIO, или вы можете выполнить конкатенацию на месте с объектомbytearray. Объектыbytearrayизменяемы и имеют механизм эффективного перераспределения памяти - при конкатенации объектов
tupleвместо этого расширяйте объектlist - для других типов изучите документацию соответствующего класса
- при конкатенации объектов
- Некоторые типы последовательностей (например,
range) поддерживают только последовательности элементов, которые следуют определенным шаблонам, и поэтому не поддерживают конкатенацию или повторение последовательностей. -
indexвызываетValueError, когда x не найден в s. Не все реализации поддерживают передачу дополнительных аргументов i и j. Эти аргументы позволяют эффективно искать подпоследовательности. Передача дополнительных аргументов примерно эквивалентна использованиюs[i:j].index(x), только без копирования каких-либо данных и с возвращаемым индексом, относящимся к началу последовательности, а не к началу среза.
Неизменяемые типы последовательностей
Единственной операцией, которую неизменяемые типы последовательностей обычно реализуют, но которая не реализуется изменяемыми типами последовательностей, является поддержка встроенного hash().
Эта поддержка позволяет использовать неизменяемые последовательности, такие как экземпляры tuple, в качестве ключей dict и хранить их в экземплярах set и frozenset.
Попытка хеширования неизменяемой последовательности, содержащей нехешируемые значения, приведет к TypeError.
Изменяемые типы последовательностей
Операции в следующей таблице определены для изменяемых типов последовательностей. collections.abc.MutableSequence ABC предоставляет удобный способ корректной реализации этих операций для пользовательских типов последовательностей.
В таблице 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()не является частьюcollections.abc.MutableSequenceABC, но большинство конкретных классов изменяемых последовательностей предоставляют его.Введено в версии 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: Пока список сортируется, эффект попытки изменить или даже проверить список не определен. Реализация C Python делает список пустым на время и вызывает
ValueError, если она может обнаружить, что список был изменён во время сортировки.
- Используя пару квадратных скобок для обозначения пустого списка:
Кортежи
Кортежи — это неизменяемые последовательности, обычно используемые для хранения коллекций разнородных данных (например, 2-кортежей, создаваемых встроенной функцией enumerate()). Кортежи также используются в случаях, когда требуется неизменяемая последовательность однородных данных (например, для хранения в экземпляре set или dict).
-
class tuple([iterable]) -
Кортежи можно создать несколькими способами:
- Используя пару скобок для обозначения пустого кортежа:
() - Используя заключительный запятую для кортежа с одним элементом:
a,или(a,) - Разделяя элементы запятыми:
a, b, cили(a, b, c) - Используя встроенную функцию
tuple():tuple()илиtuple(iterable)
Конструктор создаёт кортеж, элементы которого совпадают и расположены в том же порядке, что и элементы iterable. iterable может быть последовательностью, контейнером, поддерживающим итерацию, или объектом-итератором. Если iterable уже является кортежем, он возвращается без изменений. Например,
tuple('abc')возвращает('a', 'b', 'c')иtuple( [1, 2, 3] )возвращает(1, 2, 3). Если аргумент не указан, конструктор создаёт новый пустой кортеж,().Обратите внимание, что кортеж образуется с помощью запятой, а не скобок. Скобки необязательны, за исключением пустого кортежа или когда они необходимы для избежания синтаксической неоднозначности. Например,
f(a, b, c)— это вызов функции с тремя аргументами, аf((a, b, c))— это вызов функции с 3-кортежем в качестве единственного аргумента.Кортежи реализуют все операции над последовательностями общими последовательностями.
- Используя пару скобок для обозначения пустого кортежа:
Для разнородных коллекций данных, где доступ по имени понятнее, чем доступ по индексу, collections.namedtuple() может быть более подходящим выбором, чем простой кортеж.
Диапазоны
Тип range представляет собой неизменяемую последовательность чисел и обычно используется для циклического повторения определённого числа раз в циклах for.
-
class range(stop) -
class range(start, stop[, step]) -
Аргументы конструктора range должны быть целыми числами (встроенными
intили объектами, реализующими специальный метод__index__()). Если аргумент step опущен, он по умолчанию равен1. Если аргумент start опущен, он по умолчанию равен0. Если step равен нулю, возникает исключениеValueError.Для положительного step содержимое диапазона
rопределяется формулойr[i] = start + step*iгдеi >= 0иr[i] < stop.Для отрицательного step содержимое диапазона всё ещё определяется формулой
r[i] = start + step*i, но ограничениями являютсяi >= 0иr[i] > stop.Объект диапазона будет пустым, если
r[0]не удовлетворяет ограничению по значению. Диапазоны поддерживают отрицательные индексы, но они интерпретируются как индексы с конца последовательности, определяемой положительными индексами.Диапазоны с абсолютными значениями, большими, чем
sys.maxsize, разрешены, но некоторые функции (например,len()) могут вызвать исключениеOverflowError.Примеры диапазонов:
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []
Диапазоны реализуют все операции над последовательностями общими последовательностями, кроме конкатенации и повторения (поскольку объекты диапазона могут представлять только последовательности, которые следуют строгому шаблону, а повторение и конкатенация обычно нарушают этот шаблон).
-
start -
Значение параметра start (или
0если параметр не был указан)
-
stop -
Значение параметра stop
-
step -
Значение параметра step (или
1если параметр не был указан)
-
Преимущество типа range перед обычным list или tuple заключается в том, что объект range всегда занимает одинаковый (малый) объём памяти, независимо от размера представляемого им диапазона (поскольку он хранит только значения start, stop и step, вычисляя отдельные элементы и поддиапазоны по мере необходимости).
Объекты диапазона реализуют ABC collections.abc.Sequence и предоставляют такие функции, как проверка на вхождение, поиск индекса элемента, срезы и поддержка отрицательных индексов (см. Типы последовательностей — список, кортеж, диапазон):
>>> r = range(0, 20, 2) >>> r range(0, 20, 2) >>> 11 in r False >>> 10 in r True >>> r.index(10) 5 >>> r[5] 10 >>> r[:5] range(0, 10, 2) >>> r[-1] 18
Проверка равенства объектов диапазона с помощью == и != сравнивает их как последовательности. То есть два объекта диапазона считаются равными, если они представляют одну и ту же последовательность значений. (Обратите внимание, что два объекта диапазона, которые сравниваются как равные, могут иметь разные атрибуты start, stop и step, например, range(0) == range(2, 1, 3) или range(0, 3, 2) == range(0, 4, 2).)
Изменено в версии 3.2: Реализует ABC Sequence. Поддерживает срезы и отрицательные индексы. Проверка объектов int на принадлежность выполняется за константное время вместо итерации по всем элементам.
Изменено в версии 3.3: Определены операторы «==» и «!=» для сравнения объектов диапазона на основе последовательности значений, которые они определяют (вместо сравнения по идентификатору объекта).
См. также
- Рецепт linspace показывает, как реализовать ленивую версию range, подходящую для задач с плавающей точкой.
Тип последовательности текста — str
Текстовые данные в Python обрабатываются с помощью объектов str, или строками. Строки — это неизменяемые последовательности точек кода Юникода. Литералы строк записываются различными способами:
- Одинарные кавычки:
'allows embedded "double" quotes' - Двойные кавычки:
"allows embedded 'single' quotes" - Тройные кавычки:
'''Three single quotes''',"""Three double quotes"""
Строки в тройных кавычках могут занимать несколько строк — все связанные пробелы будут включены в литерал строки.
Литералы строк, которые являются частью одного выражения и между которыми есть только пробелы, будут неявно преобразованы в один литерал строки. То есть, ("spam " "eggs") == "spam eggs".
См. Литералы строк и байтов для получения дополнительной информации о различных формах литералов строк, включая поддерживаемые escape-последовательности, и префикс r («сырой»), который отключает обработку большинства escape-последовательностей.
Строки также могут быть созданы из других объектов с использованием конструктора str.
Поскольку нет отдельного типа «символ», индексирование строки приводит к строкам длиной 1. То есть, для непустой строки s, s[0] == s[0:1].
Также нет мутируемого типа строки, но str.join() или io.StringIO могут использоваться для эффективной конструирования строк из нескольких фрагментов.
Изменено в версии 3.3: Для обратной совместимости с серией Python 2, префикс u снова разрешен для литералов строк. Он не оказывает никакого влияния на значение литералов строк и не может быть объединен с префиксом r.
-
class str(object='') -
class str(object=b'', encoding='utf-8', errors='strict') -
Возвращает строковую версию объекта. Если объект не указан, возвращает пустую строку. В противном случае поведение
str()зависит от того, заданы ли кодировка или ошибки, как показано ниже.Если ни кодировка, ни ошибки не заданы,
str(object)возвращаетtype(object).__str__(object), что представляет собой «неофициальное» или хорошо читаемое строковое представление объекта. Для строковых объектов это сама строка. Если у объекта нет метода__str__(), тоstr()возвращаетrepr(object).Если хотя бы одна из кодировки или ошибок задана, объект должен быть объектом типа bytes-подобный (например,
bytesилиbytearray). В этом случае, если объект — это объектbytes(илиbytearray), тоstr(bytes, encoding, errors)эквивалентноbytes.decode(encoding, errors). В противном случае байтовый объект, лежащий в основе объекта буфера, извлекается до вызоваbytes.decode(). См. Бинарные типы последовательностей — bytes, bytearray, memoryview и Протокол буфера для получения информации об объектах буфера.Передача объекта
bytesвstr()без аргументов кодировка или ошибки попадает под первый случай возврата строкового представления (см. также опцию командной строки-bв Python). Например:>>> str(b'Zoot!') "b'Zoot!'"
Для получения дополнительной информации о классе
strи его методах, см. Тип последовательности текста — str и раздел Методы строк ниже. Для вывода отформатированных строк см. разделы Литералы форматированных строк и Синтаксис форматирования строк. Кроме того, см. раздел Службы обработки текста.
Методы строк
Строки реализуют все общие операции со последовательностями, а также дополнительные методы, описанные ниже.
Строки также поддерживают два стиля форматирования строк: один обеспечивает большую гибкость и настраиваемость (см. str.format(), Синтаксис форматирования строк и Настраиваемое форматирование строк), а другой основан на стиле форматирования C printf и обрабатывает более узкий диапазон типов и немного сложнее для корректного использования, но часто быстрее в тех случаях, когда он применим (Форматирование строк в стиле printf).
Раздел «Службы обработки текста» стандартной библиотеки охватывает ряд других модулей, которые предоставляют различные служебные программы для работы с текстом (включая поддержку регулярных выражений в модуле re).
-
str.capitalize() -
Возвращает копию строки, в которой первая буква заглавная, а остальные строчные.
Изменено в версии 3.8: Теперь первая буква преобразуется в заглавную букву (titlecase), а не в верхний регистр (uppercase). Это означает, что такие символы, как диграфы, будут иметь только первую букву в заглавном регистре, а не весь символ.
-
str.casefold() -
Возвращает копию строки в сложенном формате. Строки в сложенном формате могут использоваться для сопоставления без учета регистра.
Преобразование в сложенный формат похоже на преобразование в нижний регистр, но более агрессивно, так как предназначено для устранения всех различий в регистре в строке. Например, немецкая строчная буква
'ß'эквивалентна"ss". Поскольку она уже в нижнем регистре,lower()не произведет никаких изменений в'ß';casefold()преобразует её в"ss".Алгоритм сложения регистров описан в разделе 3.13 стандарта Unicode.
Добавлена в версии 3.3.
-
str.center(width[, fillchar]) -
Возвращает строку, центрированную в строке длиной width. Выравнивание выполняется с использованием указанного fillchar (по умолчанию – ASCII пробел). Исходная строка возвращается, если width меньше или равно
len(s).
-
str.count(sub[, start[, end]]) -
Возвращает количество неперекрывающихся вхождений подстроки sub в диапазоне [start, end]. Дополнительные аргументы start и end интерпретируются так же, как в обозначении срезов.
-
str.encode(encoding="utf-8", errors="strict") -
Возвращает закодированную версию строки в виде объекта bytes. По умолчанию используется кодировка
'utf-8'. errors может быть задан для настройки схемы обработки ошибок. По умолчанию errors равен'strict', что означает, что ошибки кодирования генерируют исключениеUnicodeError. Другие возможные значения –'ignore','replace','xmlcharrefreplace','backslashreplace'и любое другое имя, зарегистрированное черезcodecs.register_error(), см. раздел Обработчики ошибок. Список возможных кодировок см. в разделе Стандартные кодировки.По умолчанию аргумент errors не проверяется для повышения производительности, а используется только при первой ошибке кодирования. Включите режим разработки Python или используйте отладочную сборку для проверки errors.
Изменено в версии 3.1: Добавлена поддержка ключевых аргументов.
Изменено в версии 3.9: Теперь errors проверяется в режиме разработки и в отладочном режиме.
-
str.endswith(suffix[, start[, end]]) -
Возвращает
Trueесли строка заканчивается указанным suffix, в противном случае возвращаетFalse. suffix также может быть кортежем суффиксов для поиска. С необязательным start, проверка начинается с этой позиции. С необязательным end, сравнение останавливается на этой позиции.
-
str.expandtabs(tabsize=8) -
Возвращает копию строки, где все символы табуляции заменены одним или несколькими пробелами, в зависимости от текущей колонки и заданного размера табуляции. Позиции табуляции происходят через каждые tabsize символов (по умолчанию 8, давая позиции табуляции в колонках 0, 8, 16 и т. д.). Для расширения строки текущая колонка устанавливается в ноль, и строка проверяется символ за символом. Если символом является табуляция (
\t), в результат вставляется один или несколько символов пробела, пока текущая колонка не станет равной следующей позиции табуляции. (Сам символ табуляции не копируется.) Если символом является перевод строки (\n) или возврат каретки (\r), он копируется, и текущая колонка сбрасывается до нуля. Любой другой символ копируется без изменений, и текущая колонка увеличивается на единицу независимо от того, как символ представлен при печати.>>> '01\t012\t0123\t01234'.expandtabs() '01 012 0123 01234' >>> '01\t012\t0123\t01234'.expandtabs(4) '01 012 0123 01234'
-
str.find(sub[, start[, end]]) -
Возвращает наименьший индекс в строке, где подстрока sub найдена в срезе
s[start:end]. Дополнительные аргументы start и end интерпретируются так же, как в обозначении срезов. Возвращает-1если sub не найдена.
-
str.format(*args, **kwargs) -
Выполняет операцию форматирования строк. Строка, к которой применяется этот метод, может содержать литеральные текстовые данные или поля замещения, ограниченные фигурными скобками
{}. Каждое поле замещения содержит либо числовой индекс позиционного аргумента, либо имя ключевого аргумента. Возвращает копию строки, где каждое поле замещения заменяется строковым значением соответствующего аргумента.>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3'См. Синтаксис форматирования строк для описания различных параметров форматирования, которые могут быть указаны в строках форматирования.
Примечание
При форматировании числа (
int,float,complex,decimal.Decimalи подклассы) с типомn(например:'{:n}'.format(1234)), функция временно устанавливает локальLC_CTYPEна локальLC_NUMERICдля декодированияdecimal_pointиthousands_sepполейlocaleconv()если они не ASCII или длиннее 1 байта, и локальLC_NUMERICотличается от локалиLC_CTYPE. Это временное изменение влияет на другие потоки.Изменено в версии 3.7: При форматировании числа с типом
n, функция временно устанавливает локальLC_CTYPEна локальLC_NUMERICв некоторых случаях.
-
str.format_map(mapping) -
Аналогично
str.format(**mapping), за исключением того, чтоmappingиспользуется напрямую, а не копируется вdict. Это полезно, например, еслиmappingявляется подклассом dict:>>> class Default(dict): ... def __missing__(self, key): ... return key ... >>> '{name} was born in {country}'.format_map(Default(name='Guido')) 'Guido was born in country'Добавлена в версии 3.2.
-
str.index(sub[, start[, end]]) -
Аналогично
find(), но генерирует исключениеValueErrorпри отсутствии подстроки.
-
str.isalnum() -
Возвращает
Trueесли все символы в строке являются буквенно-цифровыми и присутствует хотя бы один символ,Falseв противном случае. Символcсчитается буквенно-цифровым, если одно из следующих выражений возвращаетTrue:c.isalpha(),c.isdecimal(),c.isdigit(), илиc.isnumeric().
-
str.isalpha() -
Возвращает
Trueесли все символы в строке являются буквенными и присутствует хотя бы один символ,Falseв противном случае. Буквенные символы – это те символы, которые определены в базе данных символов Unicode как «Буква», т.е. те, у которых свойство общей категории равно одному из «Lm», «Lt», «Lu», «Ll» или «Lo». Обратите внимание, что это отличается от свойства «Буквенный» в стандарте Unicode.
-
str.isascii() -
Возвращает
Trueесли строка пустая или все символы в строке являются ASCII,Falseв противном случае. ASCII символы имеют кодовые точки в диапазоне U+0000-U+007F.Добавлена в версии 3.7.
-
str.isdecimal() -
Возвращает
Trueесли все символы в строке являются десятичными символами и в строке есть хотя бы один символ,Falseв противном случае. Десятичные символы — это символы, которые могут быть использованы для формирования чисел в системе счисления по основанию 10, например, U+0660, АРАБСКАЯ ЦИФРА НОЛЬ. Строго говоря, десятичный символ — это символ с категорией Unicode «Nd».
-
str.isdigit() -
Возвращает
Trueесли все символы в строке являются цифрами и в строке есть хотя бы один символ,Falseв противном случае. Цифры включают десятичные символы и цифры, которые требуют специальной обработки, такие как цифры с верхними индексами. Это охватывает цифры, которые нельзя использовать для формирования чисел в системе счисления по основанию 10, например, цифры системы Харошти. Строго говоря, цифра — это символ, у которого значение свойства Numeric_Type равно Digit или 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, Decimal или Numeric.
-
str.isprintable() -
Возвращает
Trueесли все символы в строке являются печатными или строка пуста,Falseв противном случае. Непечатаемые символы — это те символы, которые в базе данных Unicode определены как «Другие» или «Разделитель», за исключением ASCII-пробела (0x20), который считается печатным. (Обратите внимание, что печатные символы в данном контексте — это те, которые не должны быть экранированы, когда на строку вызываетсяrepr(). Это никак не влияет на обработку строк, записанных вsys.stdoutилиsys.stderr.)
-
str.isspace() -
Возвращает
Trueесли в строке есть только символы пробелов и в строке есть хотя бы один символ,Falseв противном случае.Символ является пробелом, если в базе данных Unicode (см.
unicodedata) его общая категория —Zs(«Разделитель, пробел»), или его класс двунаправленной обработки — один изWS,B, илиS.
-
str.istitle() -
Возвращает
Trueесли строка является строкой с заглавными буквами в начале слов и в строке есть хотя бы один символ, например, прописные буквы могут следовать только за непрописными, а строчные — только за прописными. ВозвращаетFalseв противном случае.
-
str.isupper() -
Возвращает
Trueесли все символы с регистром 4 в строке являются заглавными и в строке есть хотя бы один символ с регистром,Falseв противном случае.>>> 'BANANA'.isupper() True >>> 'banana'.isupper() False >>> 'baNana'.isupper() False >>> ' '.isupper() False
-
str.join(iterable) -
Возвращает строку, которая является конкатенацией строк в итерируемом объекте. Будет вызвано исключение
TypeError, если в итерируемом объекте есть какие-либо значения, не являющиеся строками, включая объектыbytes. Разделитель между элементами — это строка, предоставляющая этот метод.
-
str.ljust(width[, fillchar]) -
Возвращает строку, выровненную по левому краю в строке длиной width. Заполнение выполняется с использованием указанного fillchar (по умолчанию — ASCII-пробел). Исходная строка возвращается, если width меньше или равно
len(s).
-
str.lower() -
Возвращает копию строки со всеми символами с регистром 4, преобразованными в строчные.
Алгоритм приведения к нижнему регистру описан в разделе 3.13 стандарта Unicode.
-
str.lstrip([chars]) -
Возвращает копию строки со удаленными начальными символами. Аргумент chars — это строка, определяющая набор символов для удаления. Если он опущен или
None, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является префиксом; вместо этого удаляются все комбинации его значений:>>> ' spacious '.lstrip() 'spacious ' >>> 'www.example.com'.lstrip('cmowz.') 'example.com'См.
str.removeprefix()для метода, удаляющего одну строку-префикс, а не весь набор символов. Например:>>> 'Arthur: three!'.lstrip('Arthur: ') 'ee!' >>> 'Arthur: three!'.removeprefix('Arthur: ') 'three!'
-
static str.maketrans(x[, y[, z]]) -
Этот статический метод возвращает таблицу преобразования, используемую для
str.translate().Если есть только один аргумент, он должен быть словарем, сопоставляющим порядковые номера Unicode (целые числа) или символы (строки длиной 1) с порядковыми номерами Unicode, строками (любой длины) или
None. Символьные ключи затем будут преобразованы в порядковые номера.Если есть два аргумента, они должны быть строками одинаковой длины, и в результирующем словаре каждый символ в x будет сопоставлен с символом на той же позиции в y. Если есть третий аргумент, он должен быть строкой, символы которой будут сопоставлены с
Noneв результате.
-
str.partition(sep) -
Разделяет строку по первому вхождению sep и возвращает кортеж из 3 элементов: часть перед разделителем, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из 3 элементов: сама строка, за ней две пустые строки.
-
str.removeprefix(prefix, /) -
Если строка начинается со строки prefix, возвращает
string[len(prefix):]. В противном случае возвращает копию исходной строки:>>> 'TestHook'.removeprefix('Test') 'Hook' >>> 'BaseTestCase'.removeprefix('Test') 'BaseTestCase'Новое в версии 3.9.
-
str.removesuffix(suffix, /) -
Если строка заканчивается на строку suffix и эта suffix не пуста, возвращает
string[:-len(suffix)]. В противном случае возвращает копию исходной строки:>>> 'MiscTests'.removesuffix('Tests') 'Misc' >>> 'TmpDirMixin'.removesuffix('Tests') 'TmpDirMixin'Новое в версии 3.9.
-
str.replace(old, new[, count]) -
Возвращает копию строки со всеми вхождениями подстроки old, заменёнными на new. Если необязательный аргумент count задан, заменяются только первые count вхождений.
-
str.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс в строке, где найдена подстрока sub, такая, что sub содержится в
s[start:end]. Необязательные аргументы start и end интерпретируются как в нотации срезов. В случае неудачи возвращает-1.
-
str.rindex(sub[, start[, end]]) -
Подобно
rfind(), но в случае, если подстрока sub не найдена, вызывает исключениеValueError.
-
str.rjust(width[, fillchar]) -
Возвращает строку, выровненную по правому краю в строке длиной width. Заполнение выполняется с использованием указанного fillchar (по умолчанию — ASCII-пробел). Исходная строка возвращается, если width меньше или равно
len(s).
-
str.rpartition(sep) -
Разделяет строку по последнему вхождению sep и возвращает кортеж из 3 элементов: часть перед разделителем, сам разделитель и часть после разделителя. Если разделитель не найден, возвращает кортеж из 3 элементов: две пустые строки, за которыми следует сама строка.
-
str.rsplit(sep=None, maxsplit=-1) -
Возвращает список слов в строке, используя sep в качестве разделителя. Если задан maxsplit, выполняется не более maxsplit разделений, начиная с правого. Если sep не указан или
None, любая строка пробелов является разделителем. За исключением разделения справа налево,rsplit()ведет себя какsplit(), подробно описанный ниже.
-
str.rstrip([chars]) -
Возвращает копию строки с удаленными конечными символами. Аргумент chars — это строка, определяющая набор символов, которые нужно удалить. Если он опущен или
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__(), обычно это отображение или последовательность. При индексировании по коду Юникода (целому числу) объект таблицы может выполнить любое из следующих действий: вернуть код Юникода или строку, чтобы отобразить символ на один или несколько других символов; вернутьNone, чтобы удалить символ из возвращаемой строки; или вызвать исключениеLookupError, чтобы отобразить символ на сам себя.Вы можете использовать
str.maketrans()для создания таблицы преобразования из соответствий символ-символ в разных форматах.См. также модуль
codecsдля более гибкого подхода к пользовательским отображениям символов.
-
str.upper() -
Возвращает копию строки со всеми символами с регистром 4, преобразованными в верхний регистр. Обратите внимание, что
s.upper().isupper()может бытьFalse, еслиsсодержит символы без регистра, или если категория Юникода результирующего символа(ов) не «Lu» (буква, заглавная), а, например, «Lt» (буква, строчная).Используемый алгоритм преобразования в верхний регистр описан в разделе 3.13 стандарта Юникод.
-
str.zfill(width) -
Возвращает копию строки, дополненную слева ASCII цифрами до длины width. Префикс знака (
'+'/'-'обрабатывается путем вставки заполнения *после* символа знака, а не перед ним. Исходная строка возвращается, если width меньше или равенlen(s).Например:
>>> "42".zfill(5) '00042' >>> "-42".zfill(5) '-0042'
printf-форматирование строк
Примечание
Описанные здесь операции форматирования обладают различными особенностями, которые приводят к ряду распространенных ошибок (например, неправильное отображение кортежей и словарей). Использование более новых форматируемых строковых литералов, интерфейса str.format() или шаблонов строк может помочь избежать этих ошибок. Каждый из этих альтернативных вариантов имеет свои компромиссы и преимущества в простоте, гибкости и/или расширяемости.
Объекты строк имеют одну уникальную встроенную операцию: оператор % (modulo). Он также известен как оператор форматирования или интерполяции строк. При задании format % values (где format — это строка), % спецификации преобразования в format заменяются одним или несколькими элементами из values. Эффект аналогичен использованию оператора sprintf() в языке C.
Если format требует единственного аргумента, values может быть одним объектом, не являющимся кортежем. 5 В противном случае values должен быть кортежем с точным количеством элементов, указанным в формате строки, или одним объектом сопоставления (например, словарем).
Спецификатор преобразования содержит два или более символов и состоит из следующих компонентов, которые должны следовать в этом порядке:
- Символ
'%', обозначающий начало спецификатора. - Ключ сопоставления (необязательный), представляющий собой заключенную в скобки последовательность символов (например,
(somename)). - Флаги преобразования (необязательные), влияющие на результат некоторых типов преобразований.
- Минимальная ширина поля (необязательная). Если указано как
'*'(звездочка), фактическая ширина считывается из следующего элемента кортежа в values, а объект для преобразования следует за минимальной шириной поля и необязательной точностью. - Точность (необязательная), задаваемая символом
'.'(точка) и значением точности. Если указано как'*'(звездочка), фактическая точность считывается из следующего элемента кортежа в values, а значение для преобразования следует за точностью. - Модификатор длины (необязательный).
- Тип преобразования.
Когда правым аргументом является словарь (или другой тип сопоставления), форматы в строке должны содержать ключ сопоставления в этом словаре, заключенный в скобки и вставленный непосредственно после символа '%'. Ключ сопоставления выбирает значение, подлежащее форматированию, из сопоставления. Например:
>>> print('%(language)s has %(number)03d quote types.' %
... {'language': "Python", "number": 2})
Python has 002 quote types.
В этом случае * спецификаторы не могут встречаться в формате (поскольку они требуют последовательного списка параметров).
Символы флагов преобразования:
Флаг | Значение |
|---|---|
| Преобразование значения будет использовать «альтернативную форму» (где она определена ниже). |
| Преобразование будет дополнено нулями для числовых значений. |
| Преобразованное значение выравнивается влево (переопределяет |
| (пробел) Перед положительным числом (или пустой строкой), полученным в результате знакового преобразования, должен быть пробел. |
| Символ знака ( |
Модификатор длины (h, l, или L) может быть присутствовать, но игнорируется, так как он не нужен в Python — например, %ld идентично %d.
Типы преобразований:
Преобразование | Значение | Примечания |
|---|---|---|
| Целое число со знаком в десятичной форме. | |
| Целое число со знаком в десятичной форме. | |
| Целое число со знаком в восьмеричной форме. | (1) |
| Устаревший тип — он идентичен | (6) |
| Шестнадцатеричное число со знаком (строчные буквы). | (2) |
| Шестнадцатеричное число со знаком (заглавные буквы). | (2) |
| Число с плавающей точкой в экспоненциальной форме (строчные буквы). | (3) |
| Число с плавающей точкой в экспоненциальной форме (заглавные буквы). | (3) |
| Число с плавающей точкой в десятичной форме. | (3) |
| Число с плавающей точкой в десятичной форме. | (3) |
| Число с плавающей точкой. Использует экспоненциальную форму с строчными буквами, если экспонента меньше -4 или не меньше точности, в противном случае — десятичную форму. | (4) |
| Число с плавающей точкой. Использует экспоненциальную форму с заглавными буквами, если экспонента меньше -4 или не меньше точности, в противном случае — десятичную форму. | (4) |
| Один символ (принимает целое число или строку с одним символом). | |
| Строка (преобразует любой объект Python с помощью | (5) |
| Строка (преобразует любой объект Python с помощью | (5) |
| Строка (преобразует любой объект Python с помощью | (5) |
| Аргумент не преобразуется, в результате получается символ |
Примечания:
- Альтернативная форма вставляет ведущий восьмеричный спецификатор (
'0o') перед первой цифрой. - Альтернативная форма вставляет ведущий
'0x'или'0X'(в зависимости от того, использовался ли формат'x'или'X') перед первой цифрой. -
Альтернативная форма всегда включает в результат десятичную точку, даже если за ней не следуют цифры.
Точность определяет количество цифр после десятичной точки и по умолчанию равна 6.
-
Альтернативная форма всегда включает в результат десятичную точку, и хвостовые нули не удаляются, как это было бы в противном случае.
Точность определяет количество значащих цифр до и после десятичной точки и по умолчанию равна 6.
- Если точность
N, вывод обрезается доNсимволов. - См. PEP 237.
Поскольку строки Python имеют явную длину, преобразования %s не предполагают, что '\0' является концом строки.
Изменено в версии 3.1: %f преобразования для чисел, абсолютное значение которых превышает 1e50, больше не заменяются на %g преобразования.
Типы двоичных последовательностей — bytes, bytearray, memoryview
Основными встроенными типами для работы с двоичными данными являются bytes и bytearray. Они поддерживаются memoryview, который использует протокол буфера для доступа к памяти других двоичных объектов без необходимости создания копии.
Модуль array поддерживает эффективное хранение основных типов данных, таких как 32-битные целые числа и значения с двойной точностью плавающей запятой IEEE754.
Объекты типа bytes
Объекты типа bytes являются неизменяемыми последовательностями отдельных байтов. Поскольку многие основные двоичные протоколы основаны на кодировке ASCII, объекты типа bytes предлагают несколько методов, которые допустимы только при работе с данными, совместимыми с ASCII, и тесно связаны с объектами типа string во многих других отношениях.
-
class bytes([source[, encoding[, errors]]]) -
Во-первых, синтаксис для литералов типа bytes в основном такой же, как и для строковых литералов, за исключением того, что добавляется префикс
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.
Поскольку 2 шестнадцатеричных цифры точно соответствуют одному байту, шестнадцатеричные числа являются часто используемым форматом для описания двоичных данных. Соответственно, тип bytes имеет дополнительный метод класса для чтения данных в этом формате:
-
classmethod fromhex(string) -
Этот метод класса
bytesвозвращает объект типа bytes, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробелы ASCII игнорируются.>>> bytes.fromhex('2Ef0 F1f2 ') b'.\xf0\xf1\xf2'Изменено в версии 3.7:
bytes.fromhex()теперь пропускает все пробелы ASCII в строке, а не только пробелы.
Существует обратная функция преобразования для преобразования объекта типа bytes в его шестнадцатеричное представление.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.
>>> b'\xf0\xf1\xf2'.hex() 'f0f1f2'
Если вы хотите сделать шестнадцатеричную строку более читаемой, вы можете указать параметр sep с одним символом разделителя для включения в выходные данные. По умолчанию между каждым байтом. Второй необязательный параметр bytes_per_sep управляет позицией разделителя. Положительные значения рассчитывают позицию разделителя справа, отрицательные — слева.
>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') 'f0-f1-f2' >>> value.hex('_', 2) 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) '55554444 4c524c52 4142'Добавлена в версии 3.5.
Изменено в версии 3.8:
bytes.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
Поскольку объекты типа bytes являются последовательностями целых чисел (аналогично кортежу), для объекта типа bytes b,
b[0]будет целым числом, аb[0:1]будет объектом типа bytes длиной 1. (Это контрастирует со строками текста, где как индексирование, так и срезы дадут строку длиной 1)Представление объектов типа bytes использует формат литерала (
b'...'), поскольку он часто более полезен, чем, например,bytes([46, 46, 46]). Вы всегда можете преобразовать объект типа bytes в список целых чисел, используяlist(b). - Одинарные кавычки:
Объекты типа bytearray
bytearray объекты являются изменяемыми аналогами объектов bytes.
-
class bytearray([source[, encoding[, errors]]]) -
Нет специального синтаксиса литералов для объектов типа bytearray, вместо этого они всегда создаются путем вызова конструктора:
- Создание пустого экземпляра:
bytearray() - Создание нулевого экземпляра заданной длины:
bytearray(10) - Из итерируемого объекта целых чисел:
bytearray(range(20)) - Копирование существующих двоичных данных с помощью протокола буфера:
bytearray(b'Hi!')
Поскольку объекты типа bytearray являются изменяемыми, они поддерживают операции с изменяемыми последовательностями в дополнение к общим операциям с объектами типа bytes и bytearray, описанным в разделе Операции с объектами типа Bytes и Bytearray.
См. также встроенную функцию bytearray.
Поскольку 2 шестнадцатеричных цифры точно соответствуют одному байту, шестнадцатеричные числа являются часто используемым форматом для описания двоичных данных. Соответственно, тип bytearray имеет дополнительный метод класса для чтения данных в этом формате:
-
classmethod fromhex(string) -
Этот метод класса
bytearrayвозвращает объект типа bytearray, декодируя заданный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробелы ASCII игнорируются.>>> bytearray.fromhex('2Ef0 F1f2 ') bytearray(b'.\xf0\xf1\xf2')Изменено в версии 3.7:
bytearray.fromhex()теперь пропускает все пробелы ASCII в строке, а не только пробелы.
Существует обратная функция преобразования для преобразования объекта типа bytearray в его шестнадцатеричное представление.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.
>>> bytearray(b'\xf0\xf1\xf2').hex() 'f0f1f2'
Добавлена в версии 3.5.
Изменено в версии 3.8: Аналогично
bytes.hex(),bytearray.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
Поскольку объекты типа bytearray являются последовательностями целых чисел (аналогично списку), для объекта типа bytearray b,
b[0]будет целым числом, аb[0:1]будет объектом типа bytearray длиной 1. (Это контрастирует со строками текста, где как индексирование, так и срезы дадут строку длиной 1)Представление объектов типа bytearray использует формат литерала типа bytes (
bytearray(b'...')), поскольку он часто более полезен, чем, например,bytearray([46, 46, 46]). Вы всегда можете преобразовать объект типа bytearray в список целых чисел, используяlist(b). - Создание пустого экземпляра:
Операции с объектами bytes и bytearray
Объекты bytes и bytearray поддерживают общие операции со последовательностями. Они взаимодействуют не только с операндами того же типа, но и с любым объектом типа bytes. Благодаря этой гибкости, они могут свободно комбинироваться в операциях без вызова ошибок. Однако тип результата может зависеть от порядка операндов.
Примечание
Методы объектов bytes и bytearray не принимают строки в качестве аргументов, точно так же, как методы строк не принимают байты в качестве аргументов. Например, необходимо написать:
a = "abc"
b = a.replace("a", "f")
и:
a = b"abc" b = a.replace(b"a", b"f")
Некоторые операции с bytes и bytearray предполагают использование совместимых с ASCII двоичных форматов и, следовательно, должны быть избегаемы при работе с произвольными двоичными данными. Эти ограничения рассмотрены ниже.
Примечание
Использование этих основанных на ASCII операций для обработки двоичных данных, которые не хранятся в формате, основанном на ASCII, может привести к повреждению данных.
Следующие методы объектов bytes и bytearray могут использоваться с произвольными двоичными данными.
-
bytes.count(sub[, start[, end]]) -
bytearray.count(sub[, start[, end]]) -
Возвращает количество неперекрывающихся вхождений подпоследовательности sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются как в обозначении срезов.
Подпоследовательность, которую требуется найти, может быть любым объектом типа bytes или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимается целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.removeprefix(prefix, /) -
bytearray.removeprefix(prefix, /) -
Если двоичные данные начинаются с строки prefix, возвращает
bytes[len(prefix):]. В противном случае возвращает копию исходных двоичных данных:>>> b'TestHook'.removeprefix(b'Test') b'Hook' >>> b'BaseTestCase'.removeprefix(b'Test') b'BaseTestCase'
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") -
Возвращает строку, декодированную из заданных байтов. По умолчанию кодировка —
'utf-8'. errors можно использовать для настройки другой схемы обработки ошибок. По умолчанию errors —'strict', что означает, что ошибки кодирования генерируют исключениеUnicodeError. Другие возможные значения —'ignore','replace'и любые другие имена, зарегистрированные черезcodecs.register_error(), см. раздел Обработчики ошибок. Список возможных кодировок см. в разделе Стандартные кодировки.По умолчанию аргумент errors не проверяется для повышения производительности, а используется только при первой ошибке декодирования. Включите Режим разработки Python или используйте отладочную сборку для проверки errors.
Примечание
Передача аргумента encoding в
strпозволяет декодировать любой объект типа bytes напрямую без необходимости создания временного объекта bytes или bytearray.Изменено в версии 3.1: Добавлена поддержка ключевых аргументов.
Изменено в версии 3.9: Теперь errors проверяется в режиме разработки и в отладочном режиме.
-
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 интерпретируются как в обозначении срезов. Возвращает-1если sub не найдена.Подпоследовательность, которую требуется найти, может быть любым объектом типа 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 и возвращает кортеж из 3 элементов, содержащий часть перед разделителем, сам разделитель или его копию bytearray, и часть после разделителя. Если разделитель не найден, возвращает кортеж из 3 элементов, содержащий копию исходной последовательности, за которым следуют два пустых объекта bytes или bytearray.
Разделитель для поиска может быть любым объектом типа bytes.
-
bytes.replace(old, new[, count]) -
bytearray.replace(old, new[, count]) -
Возвращает копию последовательности, в которой все вхождения подпоследовательности old заменены на new. Если необязательный аргумент count задан, заменяются только первые count вхождений.
Подпоследовательность для поиска и её замена могут быть любым объектом-подобным байтам.
Примечание
Версия этого метода для bytearray не работает на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.rfind(sub[, start[, end]]) -
bytearray.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс в последовательности, где найдена подпоследовательность sub, такая что sub содержится в
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в нотации срезов. При неудаче возвращает-1.Подпоследовательность для поиска может быть любым объектом-подобным байтам или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.rindex(sub[, start[, end]]) -
bytearray.rindex(sub[, start[, end]]) -
Подобно
rfind(), но вызывает исключениеValueError, когда подпоследовательность sub не найдена.Подпоследовательность для поиска может быть любым объектом-подобным байтам или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.rpartition(sep) -
bytearray.rpartition(sep) -
Разделяет последовательность по последнему вхождению sep и возвращает кортеж из 3 элементов: часть перед разделителем, сам разделитель (или его копия bytearray), и часть после разделителя. Если разделитель не найден, возвращает кортеж из двух пустых объектов bytes или bytearray, после которого следует копия исходной последовательности.
Разделитель для поиска может быть любым объектом-подобным байтам.
-
bytes.startswith(prefix[, start[, end]]) -
bytearray.startswith(prefix[, start[, end]]) -
Возвращает
True, если бинарные данные начинаются с указанного префикса prefix, в противном случае возвращаетFalse. prefix также может быть кортежем префиксов для поиска. С необязательным start, поиск начинается с этой позиции. С необязательным end, сравнение останавливается на этой позиции.Префикс(ы) для поиска могут быть любыми объектами-подобными байтам.
-
bytes.translate(table, /, delete=b'') -
bytearray.translate(table, /, delete=b'') -
Возвращает копию объекта bytes или bytearray, где все байты, присутствующие в необязательном аргументе delete, удалены, а оставшиеся байты были отображены через заданную таблицу преобразования, которая должна быть объектом bytes длиной 256.
Вы можете использовать метод
bytes.maketrans()для создания таблицы преобразования.Установите аргумент table в
None, для переводов, которые только удаляют символы:>>> b'read this short text'.translate(None, b'aeiou') b'rd ths shrt txt'
Изменено в версии 3.6: delete теперь поддерживается в качестве ключевого аргумента.
Следующие методы для объектов bytes и bytearray имеют по умолчанию поведение, предполагающее использование ASCII-совместимых бинарных форматов, но их можно использовать и с произвольными бинарными данными, передавая соответствующие аргументы. Обратите внимание, что все методы bytearray в этом разделе не работают на месте, а вместо этого производят новые объекты.
-
bytes.center(width[, fillbyte]) -
bytearray.center(width[, fillbyte]) -
Возвращает копию объекта, центрированную в последовательности длиной width. Заполнение выполняется с использованием указанного fillbyte (по умолчанию — ASCII-пробел). Для объектов
bytes, исходная последовательность возвращается, если width меньше или равноlen(s).Примечание
Версия этого метода для bytearray не работает на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.ljust(width[, fillbyte]) -
bytearray.ljust(width[, fillbyte]) -
Возвращает копию объекта, выровненного по левому краю в последовательности длиной width. Заполнение выполняется с использованием указанного fillbyte (по умолчанию — ASCII-пробел). Для объектов
bytes, исходная последовательность возвращается, если width меньше или равноlen(s).Примечание
Версия этого метода для bytearray не работает на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.lstrip([chars]) -
bytearray.lstrip([chars]) -
Возвращает копию последовательности с удаленными указанными начальными байтами. Аргумент chars — бинарная последовательность, определяющая набор значений байтов для удаления — имя указывает на то, что этот метод обычно используется с ASCII-символами. Если опущен или
None, аргумент chars по умолчанию удаляет ASCII-пробелы. Аргумент chars не является префиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.lstrip() b'spacious ' >>> b'www.example.com'.lstrip(b'cmowz.') b'example.com'
Бинарная последовательность значений байтов для удаления может быть любым объектом-подобным байтам. См.
removeprefix()для метода, который удалит одну строку-префикс, а не все символы набора. Например:>>> b'Arthur: three!'.lstrip(b'Arthur: ') b'ee!' >>> b'Arthur: three!'.removeprefix(b'Arthur: ') b'three!'
Примечание
Версия этого метода для bytearray не работает на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.rjust(width[, fillbyte]) -
bytearray.rjust(width[, fillbyte]) -
Возвращает копию объекта, выровненного по правому краю в последовательности длиной width. Заполнение выполняется с использованием указанного fillbyte (по умолчанию — ASCII-пробел). Для объектов
bytes, исходная последовательность возвращается, если width меньше или равноlen(s).Примечание
Версия этого метода для bytearray не работает на месте — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.rsplit(sep=None, maxsplit=-1) -
bytearray.rsplit(sep=None, maxsplit=-1) -
Разделяет бинарную последовательность на подпоследовательности того же типа, используя sep в качестве разделителя. Если задан maxsplit, выполняется не более maxsplit разделений, начиная с правого. Если sep не указан или
None, любая подпоследовательность, состоящая только из ASCII-пробелов, является разделителем. За исключением разделения справа,rsplit()ведет себя какsplit(), которое описано подробно ниже.
-
bytes.rstrip([chars]) -
bytearray.rstrip([chars]) -
Возвращает копию последовательности с удаленными указанными конечными байтами. Аргумент chars — бинарная последовательность, определяющая набор значений байтов для удаления — имя указывает на то, что этот метод обычно используется с ASCII-символами. Если опущен или
None, аргумент chars по умолчанию удаляет ASCII-пробелы. Аргумент chars не является суффиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.rstrip() b' spacious' >>> b'mississippi'.rstrip(b'ipz') b'mississ'
Бинарная последовательность значений байтов для удаления может быть любым объектом-подобным байтам. См.
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-like object.Например:
>>> b'1,2,3'.split(b',') [b'1', b'2', b'3'] >>> b'1,2,3'.split(b',', maxsplit=1) [b'1', b'2,3'] >>> b'1,2,,3,'.split(b',') [b'1', b'2', b'', b'3', b'']
Если sep не указан или равен
None, применяется другой алгоритм разбиения: последовательности из последовательных ASCII-пробелов рассматриваются как один разделитель, и результат не будет содержать пустых строк в начале или конце, если последовательность имеет ведущие или завершающие пробелы. Следовательно, разбиение пустой последовательности или последовательности, состоящей только из ASCII-пробелов без указанного разделителя, возвращает[].Например:
>>> b'1 2 3'.split() [b'1', b'2', b'3'] >>> b'1 2 3'.split(maxsplit=1) [b'1', b'2 3'] >>> b' 1 2 3 '.split() [b'1', b'2', b'3']
-
bytes.strip([chars]) -
bytearray.strip([chars]) -
Возвращает копию последовательности с удаленными указанными ведущими и завершающими байтами. Аргумент chars представляет собой бинарную последовательность, указывающую множество значений байтов, которые нужно удалить — название связано с тем, что этот метод обычно используется с символами ASCII. Если он опущен или
None, аргумент chars по умолчанию удаляет ASCII-пробелы. Аргумент chars не является префиксом или суффиксом; вместо этого удаляются все комбинации его значений:>>> b' spacious '.strip() b'spacious' >>> b'www.example.com'.strip(b'cmowz.') b'example'
Бинарная последовательность значений байтов для удаления может быть любым объектом типа bytes-like object.
Примечание
Версия этого метода для 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. Этот метод использует подход universal newlines для разбиения строк. Разрывы строк не включаются в результирующий список, если только keepends не задан и не имеет значение true.
Например:
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines() [b'ab c', b'', b'de fg', b'kl'] >>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) [b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
В отличие от
split(), когда задана разделительная строка sep, этот метод возвращает пустой список для пустой строки, и конечный разрыв строки не приводит к дополнительной строке:>>> b"".split(b'\n'), b"Two lines\n".split(b'\n') ([b''], [b'Two lines', b'']) >>> b"".splitlines(), b"One line\n".splitlines() ([], [b'One line'])
-
bytes.swapcase() -
bytearray.swapcase() -
Возвращает копию последовательности, в которой все строчные ASCII-символы преобразованы в соответствующие заглавные и наоборот.
Например:
>>> b'Hello World'.swapcase() b'hELLO wORLD'
Строчные ASCII-символы — это те значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные ASCII-символы — это те значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.В отличие от
str.swapcase(), для бинарных версий всегда верно, чтоbin.swapcase().swapcase() == bin. Преобразования регистра в ASCII симметричны, хотя это не всегда верно для произвольных кодовых точек Юникода.Примечание
Версия метода
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/bytearray) имеют одну уникальную встроенную операцию: оператор % (modulo). Это также известно как оператор форматирования или интерполяции байтов. Учитывая format % values (где формат — объект байтов), спецификации преобразования % в формате заменяются нулём или более элементами из значений. Эффект аналогичен использованию оператора sprintf() в языке C.
Если формат требует одного аргумента, значения может быть одним объектом, не являющимся кортежем. 5 В противном случае значения должны быть кортежем с ровно таким количеством элементов, которое указано объектом байтов формата, или одним объектом отображения (например, словарем).
Спецификатор преобразования содержит два или более символов и состоит из следующих компонентов, которые должны следовать в этом порядке:
- Символ
'%', который отмечает начало спецификатора. - Ключ отображения (необязательный), представляющий собой заключённую в скобки последовательность символов (например,
(somename)). - Флаги преобразования (необязательные), которые влияют на результат некоторых типов преобразования.
- Минимальная ширина поля (необязательная). Если она указана как
'*'(звёздочка), фактическая ширина считывается из следующего элемента кортежа в значениях, а преобразуемый объект следует за минимальной шириной поля и необязательной точностью. - Точность (необязательная), заданная как
'.'(точка) и точностью. Если она указана как'*'(звёздочка), фактическая точность считывается из следующего элемента кортежа в значениях, а преобразуемое значение следует за точностью. - Модификатор длины (необязательный).
- Тип преобразования.
Когда правым аргументом является словарь (или другой тип отображения), форматы в объекте байтов должны включать ключ отображения в этот словарь, вставленный непосредственно после символа '%'. Ключ отображения выбирает значение, которое будет форматироваться из отображения. Например:
>>> 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) |
| Один байт (принимает целые числа или объекты по одному байту). | |
| Байты (любой объект, который следует протоколу буфера buffer или имеет метод | (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 получать доступ к внутренним данным объекта, поддерживающего протокол буфера buffer, без копирования.
-
class memoryview(object) -
Создать
memoryview, ссылающийся на object. object должен поддерживать протокол буфера. Встроенные объекты, поддерживающие протокол буфера, включаютbytesиbytearray.У
memoryviewесть понятие элемента, являющегося атомной единицей памяти, обрабатываемой исходным объектом. Для многих простых типов, таких какbytesиbytearray, элемент — это один байт, но другие типы, такие какarray.array, могут иметь элементы большего размера.len(view)равно длинеtolist. Еслиview.ndim = 0, длина равна 1. Еслиview.ndim = 1, длина равна количеству элементов в представлении. Для многомерных представлений длина равна длине вложенного списка представления.Атрибут
itemsizeдаст вам количество байтов в одном элементе.memoryviewподдерживает срезы и индексирование для доступа к данным. Срез одномерного представления приведет к представлению подчасти:>>> v = memoryview(b'abcefg') >>> v[1] 98 >>> v[-1] 103 >>> v[1:4] <memory at 0x7f3ddc9f4350> >>> bytes(v[1:4]) b'bce'
Если
formatявляется одним из нативных спецификаторов формата из модуляstruct, индексирование целым числом или кортежем целых чисел также поддерживается и возвращает один элемент с соответствующим типом. Одномерные представления памяти могут быть индексированы целым числом или кортежем из одного целого числа. Многомерные представления памяти могут быть индексированы кортежами ровно ndim целых чисел, где ndim — количество измерений. Нулевые представления памяти могут быть индексированы пустым кортежем.Вот пример с небайтовым форматом:
>>> import array >>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]Если базовый объект изменяем, представление памяти поддерживает присваивание срезам одномерного вида. Изменение размера недопустимо:
>>> data = bytearray(b'abcefg') >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b'z') >>> data bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data bytearray(b'z123fg') >>> v[2:3] = b'spam' Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b'spam' >>> data bytearray(b'z1spam')
Одномерные представления памяти для хешируемых (только для чтения) типов с форматами ‘B’, ‘b’ или ‘c’ также хешируемы. Хеш определяется как
hash(m) == hash(m.tobytes()):>>> v = memoryview(b'abcefg') >>> hash(v) == hash(b'abcefg') True >>> hash(v[2:4]) == hash(b'ce') True >>> hash(v[::-2]) == hash(b'abcefg'[::-2]) True
Изменено в версии 3.3: Одномерные представления памяти теперь могут быть срезами. Одномерные представления памяти с форматами ‘B’, ‘b’ или ‘c’ теперь хешируемы.
Изменено в версии 3.4: Представление памяти теперь автоматически регистрируется в
collections.abc.SequenceИзменено в версии 3.5: Теперь представления памяти могут быть индексированы кортежами целых чисел.
memoryviewимеет несколько методов:-
__eq__(exporter) -
Представление памяти и экспортер PEP 3118 равны, если их формы эквивалентны, и если все соответствующие значения равны, когда соответствующие коды формата операндов интерпретируются с использованием синтаксиса
struct.Для подмножества строк формата
struct, в настоящее время поддерживаемыхtolist(),vиwравны, еслиv.tolist() == w.tolist():>>> import array >>> a = array.array('I', [1, 2, 3, 4, 5]) >>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array('b', [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() TrueЕсли ни одна из строк формата не поддерживается модулем
struct, то объекты всегда будут считаться неравными (даже если строки форматов и содержимое буфера идентичны):>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b FalseОбратите внимание, что, как и с числами с плавающей точкой,
v is wне подразумеваетv == wдля объектов представления памяти.Изменено в версии 3.3: Предыдущие версии сравнивали исходную память, не учитывая формат элемента и логическую структуру массива.
-
tobytes(order=None) -
Возвращает данные в буфере в виде строки байтов. Это эквивалентно вызову конструктора
bytesдля представления памяти.>>> m = memoryview(b"abc") >>> m.tobytes() b'abc' >>> bytes(m) b'abc'
Для несмежных массивов результат равен уплощенному представлению списка со всеми элементами, преобразованными в байты.
tobytes()поддерживает все строки форматов, включая те, которые не находятся в синтаксисе модуляstruct.Новое в версии 3.8: order может быть {‘C’, ‘F’, ‘A’}. Когда order равен ‘C’ или ‘F’, данные исходного массива преобразуются в порядок C или Fortran. Для смежных представлений ‘A’ возвращает точную копию физической памяти. В частности, сохраняется порядок Fortran в памяти. Для несмежных представлений данные сначала преобразуются в порядок C. order=None эквивалентно order=’C’.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строку, содержащую две шестнадцатеричные цифры для каждого байта в буфере.
>>> m = memoryview(b"abc") >>> m.hex() '616263'
Новое в версии 3.5.
Изменено в версии 3.8: Аналогично
bytes.hex(),memoryview.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
-
tolist() -
Возвращает данные в буфере в виде списка элементов.
>>> memoryview(b'abc').tolist() [97, 98, 99] >>> import array >>> a = array.array('d', [1.1, 2.2, 3.3]) >>> m = memoryview(a) >>> m.tolist() [1.1, 2.2, 3.3]
-
toreadonly() -
Возвращает представление памяти только для чтения. Исходное представление памяти не изменяется.
>>> m = memoryview(bytearray(b'abc')) >>> mm = m.toreadonly() >>> mm.tolist() [89, 98, 99] >>> mm[0] = 42 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot modify read-only memory >>> m[0] = 43 >>> mm.tolist() [43, 98, 99]
Новое в версии 3.8.
-
release() -
Освободить базовый буфер, представленный объектом представления памяти. Многие объекты выполняют особые действия при удерживании представления (например,
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): File "<stdin>", line 1, in <module> ValueError: memoryview: invalid value for format "B" >>> y = x.cast('c') >>> y[0] = b'a' >>> b bytearray(b'ayz')Преобразование 1D/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: Пустой кортеж вместо
Noneпри ndim = 0.
-
strides -
Кортеж целых чисел длиной
ndim, задающий размер в байтах для доступа к каждому элементу для каждого измерения массива.Изменено в версии 3.3: Пустой кортеж вместо
Noneпри ndim = 0.
-
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 неизменяемый и хешируемый — его содержимое нельзя изменить после создания; поэтому его можно использовать в качестве ключа словаря или элемента другого множества.
Непустые множества (не frozensets) можно создавать, помещая список элементов, разделенных запятыми, в фигурные скобки, например: {'jack', 'sjoerd'}, а также с помощью конструктора set.
Конструкторы обоих классов работают одинаково:
-
class set([iterable]) -
class frozenset([iterable]) -
Возвращает новый объект set или frozenset, элементы которого взяты из iterable. Элементы множества должны быть хешируемыми. Для представления множеств множеств внутренние множества должны быть объектами
frozenset. Если iterable не указано, возвращается новое пустое множество.Множества могут быть созданы несколькими способами:
- Используйте список элементов, разделенных запятыми, в фигурных скобках:
{'jack', 'sjoerd'} - Используйте генерацию множества:
{c for c in 'abracadabra' if c not in 'abc'} - Используйте конструктор типа:
set(),set('foobar'),set(['a', 'b', 'foo'])
Экземпляры
setиfrozensetпредоставляют следующие операции:-
len(s) -
Возвращает количество элементов в множестве s (мощность s).
-
x in s -
Проверяет, принадлежит ли x множеству s.
-
x not in s -
Проверяет, не принадлежит ли x множеству s.
-
isdisjoint(other) -
Возвращает
Trueесли множество не имеет общих элементов с other. Множества не пересекаются тогда и только тогда, когда их пересечение является пустым множеством.
-
issubset(other) -
set <= other -
Проверяет, является ли каждый элемент множества элементом other.
-
set < other -
Проверяет, является ли множество собственным подмножеством other, то есть
set <= other and set != other.
-
issuperset(other) -
set >= other -
Проверяет, является ли каждый элемент other элементом множества.
-
set > other -
Проверяет, является ли множество собственным надмножеством other, то есть
set >= other and set != other.
-
union(*others) -
set | other | ... -
Возвращает новое множество с элементами из множества и всех других.
-
intersection(*others) -
set & other & ... -
Возвращает новое множество с элементами, общими для множества и всех других.
-
difference(*others) -
set - other - ... -
Возвращает новое множество с элементами множества, которые не находятся в других.
-
symmetric_difference(other) -
set ^ other -
Возвращает новое множество с элементами, которые находятся либо в множестве, либо в other, но не в обоих.
-
copy() -
Возвращает поверхностную копию множества.
Обратите внимание, что неоператорные версии
union(),intersection(),difference()иsymmetric_difference(),issubset()иissuperset()методов будут принимать любой итерируемый объект в качестве аргумента. В отличие от них, их операторные аналоги требуют, чтобы аргументы были множествами. Это предотвращает склонные к ошибкам конструкции, такие какset('abc') & 'cbs'в пользу более читаемогоset('abc').intersection('cbs').И
set, иfrozensetподдерживают сравнения множеств. Два множества равны тогда и только тогда, когда каждый элемент каждого множества содержится в другом (каждое является подмножеством другого). Одно множество меньше другого тогда и только тогда, когда первое множество является собственным подмножеством второго множества (является подмножеством, но не равно). Одно множество больше другого тогда и только тогда, когда первое множество является собственным надмножеством второго множества (является надмножеством, но не равно).Экземпляры
setсравниваются с экземплярамиfrozensetна основе их элементов. Например,set('abc') == frozenset('abc')возвращаетTrueи так же, какset('abc') in set([frozenset('abc')]).Сравнения подмножества и равенства не обобщаются на функцию полного упорядочения. Например, любые два непустых непересекающихся множества не равны и не являются подмножествами друг друга, поэтому все из следующего возвращают
False:a<b,a==b, илиa>b.Поскольку множества определяют только частичное упорядочение (отношения подмножества), результат метода
list.sort()для списков множеств не определен.Элементы множества, как и ключи словаря, должны быть хешируемыми.
Бинарные операции, которые смешивают экземпляры
setсfrozenset, возвращают тип первого операнда. Например:frozenset('ab') | set('bc')возвращает экземплярfrozenset.В следующей таблице перечислены операции, доступные для
set, которые не применяются к неизменяемым экземплярамfrozenset:-
update(*others) -
set |= other | ... -
Обновляет множество, добавляя элементы из всех других.
-
intersection_update(*others) -
set &= other & ... -
Обновляет множество, оставляя только элементы, которые находятся в нем и во всех других.
-
difference_update(*others) -
set -= other | ... -
Обновляет множество, удаляя элементы, которые находятся в других.
-
symmetric_difference_update(other) -
set ^= other -
Обновляет множество, оставляя только элементы, которые находятся либо в одном множестве, либо в другом, но не в обоих.
-
add(elem) -
Добавляет элемент elem в множество.
-
remove(elem) -
Удаляет элемент elem из множества. Вызывает
KeyError, если elem не содержится в множестве.
-
discard(elem) -
Удаляет элемент elem из множества, если он присутствует.
-
pop() -
Удаляет и возвращает произвольный элемент из множества. Вызывает
KeyError, если множество пустое.
-
clear() -
Удаляет все элементы из множества.
Обратите внимание, что неоператорные версии
update(),intersection_update(),difference_update()иsymmetric_difference_update()методов будут принимать любой итерируемый объект в качестве аргумента.Обратите внимание, что аргумент elem методов
__contains__(),remove()иdiscard()может быть множеством. Для поддержки поиска эквивалентного frozenset создается временное множество из elem. - Используйте список элементов, разделенных запятыми, в фигурных скобках:
Типы отображений — dict
Объект отображения сопоставляет хешируемые значения произвольным объектам. Отображения являются изменяемыми объектами. В настоящее время существует только один стандартный тип отображения, словарь. (Для других контейнеров см. встроенные классы list, set и tuple, а также модуль collections.)
Ключи словаря — это почти произвольные значения. Значения, которые не являются хешируемыми, то есть значения, содержащие списки, словари или другие изменяемые типы (которые сравниваются по значению, а не по идентификатору объекта), не могут использоваться в качестве ключей. Числовые типы, используемые в качестве ключей, подчиняются обычным правилам числового сравнения: если два числа равны (например, 1 и 1.0) , то они могут быть взаимозаменяемы для индексирования одной и той же записи словаря. (Однако следует учитывать, что, поскольку компьютеры хранят числа с плавающей точкой как приближения, обычно не рекомендуется использовать их в качестве ключей словарей.)
-
class dict(**kwargs) -
class dict(mapping, **kwargs) -
class dict(iterable, **kwargs)
-
Возвращает новый словарь, инициализированный из необязательного позиционного аргумента и, возможно, пустого набора ключевых аргументов.
Словари могут быть созданы несколькими способами:
- Используйте список пар
key: valueчерез запятую в фигурных скобках:{'jack': 4098, 'sjoerd': 4127}или{4098: 'jack', 4127: 'sjoerd'} - Используйте понимание словаря:
{},{x: x ** 2 for x in range(10)} - Используйте конструктор типа:
dict(),dict([('foo', 100), ('bar', 200)]),dict(foo=100, bar=200)
Если позиционный аргумент не указан, создаётся пустой словарь. Если позиционный аргумент указан и это объект отображения, создаётся словарь с теми же парами ключ-значение, что и у объекта отображения. В противном случае позиционный аргумент должен быть объектом итерируемого объекта. Каждый элемент в итерируемом объекте должен быть итерируемым объектом с ровно двумя объектами. Первый объект каждого элемента становится ключом в новом словаре, а второй объект — соответствующим значением. Если ключ встречается более одного раза, последнее значение для этого ключа становится соответствующим значением в новом словаре.
Если указаны ключевые аргументы, ключевые аргументы и их значения добавляются в словарь, созданный из позиционного аргумента. Если добавляемый ключ уже существует, значение из ключевого аргумента заменяет значение из позиционного аргумента.
Для иллюстрации, следующие примеры возвращают словарь, равный
{"one": 1, "two": 2, "three": 3}:>>> a = dict(one=1, two=2, three=3) >>> b = {'one': 1, 'two': 2, 'three': 3} >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) >>> f = dict({'one': 1, 'three': 3}, two=2) >>> a == b == c == d == e == f TrueПредоставление ключевых аргументов, как в первом примере, работает только для ключей, являющихся допустимыми идентификаторами Python. В противном случае могут быть использованы любые допустимые ключи.
Это операции, которые поддерживают словари (и поэтому пользовательские типы отображения тоже должны их поддерживать):
-
list(d) -
Возвращает список всех ключей, используемых в словаре d.
-
len(d) -
Возвращает количество элементов в словаре d.
-
d[key] -
Возвращает элемент d с ключом key. Вызывает исключение
KeyError, если key не содержится в отображении.Если подкласс dict определяет метод
__missing__(), и key отсутствует, операцияd[key]вызывает этот метод с ключом key в качестве аргумента. Операцияd[key]затем возвращает или вызывает исключение, что возвращает или вызывает метод__missing__(key)вызов. Никакие другие операции или методы не вызывают__missing__(). Если__missing__()не определён, возникает исключениеKeyError.__missing__()должен быть методом; он не может быть переменной экземпляра:>>> class Counter(dict): ... def __missing__(self, key): ... return 0 >>> c = Counter() >>> c['red'] 0 >>> c['red'] += 1 >>> c['red'] 1
В приведённом выше примере показана часть реализации
collections.Counter. Разный__missing__метод используется вcollections.defaultdict.
-
d[key] = value -
Установить
d[key]в value.
-
del d[key] -
Удалить
d[key]из d. Возникает исключениеKeyError, если key не содержится в отображении.
-
key in d -
Возвращает
True, если в d есть ключ key, иначеFalse.
-
key not in d -
Эквивалентно
not key in d.
-
iter(d) -
Возвращает итератор по ключам словаря. Это сокращение для
iter(d.keys()).
-
clear() -
Удаляет все элементы из словаря.
-
copy() -
Возвращает поверхностную копию словаря.
-
classmethod fromkeys(iterable[, value]) -
Создаёт новый словарь с ключами из 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, которые оба должны быть словарями. Значения other имеют приоритет, когда d и other имеют общие ключи.
Введено в версии 3.9.
-
d |= other -
Обновляет словарь d ключами и значениями из other, который может быть либо отображением, либо итерируемым объектом пар ключ/значение. Значения other имеют приоритет, когда d и other имеют общие ключи.
Введено в версии 3.9.
Словари сравниваются как равные только в том случае, если они имеют одинаковые
(key, value)пары (независимо от порядка). Сравнения порядка (‘<’, ‘<=’, ‘>=’, ‘>’) вызываютTypeError.Словари сохраняют порядок вставки. Обратите внимание, что обновление ключа не влияет на порядок. Ключи, добавленные после удаления, вставляются в конец.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(d) ['one', 'two', 'three', 'four'] >>> list(d.values()) [1, 2, 3, 4] >>> d["one"] = 42 >>> d {'one': 42, 'two': 2, 'three': 3, 'four': 4} >>> del d["two"] >>> d["two"] = None >>> d {'one': 42, 'three': 3, 'four': 4, 'two': None}Изменено в версии 3.7: Порядок словаря гарантированно является порядком вставки. Это поведение было реализационной деталью CPython с версии 3.6.
Словари и представления словарей обратимы.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(reversed(d)) ['four', 'three', 'two', 'one'] >>> list(reversed(d.values())) [4, 3, 2, 1] >>> list(reversed(d.items())) [('four', 4), ('three', 3), ('two', 2), ('one', 1)] - Используйте список пар
Изменено в версии 3.8: Словари теперь обратимы.
См. также
types.MappingProxyType можно использовать для создания только для чтения представления dict.
Объекты представления словаря
Объекты, возвращаемые dict.keys(), dict.values() и dict.items(), являются объектами представления. Они предоставляют динамическое представление записей словаря, что означает, что при изменении словаря представление отражает эти изменения.
Объекты представления словаря можно перебирать, чтобы получить соответствующие данные, и они поддерживают проверки на вхождение:
-
len(dictview) -
Возвращает количество записей в словаре.
-
iter(dictview) -
Возвращает итератор по ключам, значениям или элементам (представленным в виде кортежей из
(key, value)) в словаре.Ключи и значения перебираются в порядке вставки. Это позволяет создавать
(value, key)пары с помощьюzip():pairs = zip(d.values(), d.keys()). Другой способ создать тот же список —pairs = [(v, k) for (k, v) in d.items()].Перебор представлений при добавлении или удалении записей в словаре может вызвать
RuntimeErrorили не перебрать все записи.Изменено в версии 3.7: Порядок словаря гарантируется в порядке вставки.
-
x in dictview -
Возвращает
True, если x содержится в ключах, значениях или элементах (в последнем случае x должен быть(key, value)кортежем) базового словаря.
-
reversed(dictview) -
Возвращает обратный итератор по ключам, значениям или элементам словаря. Представление будет перебираться в обратном порядке вставки.
Изменено в версии 3.8: Представления словаря теперь обратимы.
Представления ключей похожи на множества, так как их записи уникальны и хешируемы. Если все значения хешируемы, так что (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'}
Типы менеджеров контекста
Заявление Python’s 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): File "<stdin>", line 1, in <module> TypeError: There are no type variables left in dict[str]
Однако, такие выражения допустимы при использовании переменных типов. Индекс должен содержать столько элементов, сколько существует элементов переменной типа в __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,)
См. также
- PEP 484 - Указание типов
-
Представление фреймворка Python для аннотаций типов.
- PEP 585 - Указание типов обобщений в стандартных коллекциях
-
Введение возможности для параметризации классов стандартной библиотеки, если они реализуют специальный метод класса
__class_getitem__(). -
Generics, user-defined generics andtyping.Generic -
Документация по реализации обобщенных классов, которые могут быть параметризованы во время выполнения и поняты статическими анализаторами типов.
Новое в версии 3.9.
Другие встроенные типы
Интерпретатор поддерживает несколько других типов объектов. Большинство из них поддерживают только одну или две операции.
Модули
Единственная специальная операция над модулем — доступ к атрибутам: 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).
Как и объекты функций, объекты связанных методов поддерживают получение произвольных атрибутов. Однако, поскольку атрибуты методов фактически хранятся в базовой функции (meth.__func__), установка атрибутов методов для связанных методов запрещена. Попытка установить атрибут для метода приводит к тому, что генерируется исключение AttributeError. Чтобы установить атрибут метода, необходимо явно установить его в базовой функции:
>>> class C: ... def method(self): ... pass ... >>> c = C() >>> c.method.whoami = 'my name is method' # can't set on the method Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'method' object has no attribute 'whoami' >>> c.method.__func__.whoami = 'my name is method' >>> c.method.whoami 'my name is method'
См. Стандартная иерархия типов для получения дополнительной информации.
Объекты кода
Объекты кода используются реализацией для представления «псевдоскомпилированного» исполняемого Python-кода, например, тела функции. Они отличаются от объектов функций тем, что не содержат ссылки на свою глобальную среду выполнения. Объекты кода возвращаются встроенной функцией compile() и могут быть извлечены из объектов функций через атрибут __code__. См. также модуль code.
Обращение к __code__ вызывает событие аудита аудита object.__getattr__ с аргументами obj и "__code__".
Объект кода можно выполнить или оценить, передав его (вместо строки исходного кода) встроенным функциям exec() или eval().
См. Стандартную иерархию типов для получения дополнительной информации.
Объекты типов
Объекты типов представляют различные типы объектов. Тип объекта можно получить с помощью встроенной функции type(). Нет специальных операций над типами. Стандартный модуль types определяет имена всех стандартных встроенных типов.
Типы записываются так: <class 'int'>.
Объект null
Этот объект возвращается функциями, которые не явно не возвращают значения. Он не поддерживает никаких специальных операций. Существует ровно один объект null, названный None (встроенное имя). type(None)() производит тот же синглтон.
Он записывается как None.
Объект Ellipsis
Этот объект часто используется при срезах (см. Срезы). Он не поддерживает никаких специальных операций. Существует ровно один объект Ellipsis, названный Ellipsis (встроенное имя). type(Ellipsis)() производит синглтон Ellipsis.
Он записывается как Ellipsis или ....
Объект NotImplemented
Этот объект возвращается из сравнений и бинарных операций, когда они запрошены для работы с типами, которые они не поддерживают. См. Сравнения для получения дополнительной информации. Существует ровно один объект NotImplemented. type(NotImplemented)() производит экземпляр синглтона.
Он записывается как NotImplemented.
Булевы значения
Булевы значения — это два константных объекта 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'>]
Ограничение длины преобразования целых чисел в строки
CPython имеет глобальное ограничение для преобразования между int и str для смягчения атак с отказом в обслуживании. Это ограничение только относится к десятичным или другим числам, не являющимся степенью двойки. Преобразования в шестнадцатеричную, восьмеричную и двоичную системы счисления не ограничены. Ограничение можно настроить.
Тип int в CPython — это число произвольной длины, хранящееся в двоичном формате (обычно известное как «bignum»). Нет алгоритма, который может преобразовать строку в целое двоичное число или целое двоичное число в строку за линейное время, кроме случаев, когда основание является степенью двойки. Даже лучшие известные алгоритмы для десятичной системы счисления имеют подквадратичную сложность. Преобразование большого значения, например 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) for integer string conversion: value has 5432 digits.
>>> 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) for integer string conversion: value has 8599 digits.
>>> 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.9.14.
Затронутые API
Ограничение применяется только к потенциально медленным преобразованиям между int и str или bytes:
-
int(string)с основанием по умолчанию 10. -
int(string, base)для всех оснований, которые не являются степенью двойки. -
str(integer). repr(integer)- любое другое преобразование строки в десятичную систему счисления, например
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.
Из кода вы можете просмотреть текущее ограничение и установить новое с помощью этих sys API:
-
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.9.14.
Внимание
Установка низкого ограничения может привести к проблемам. Хотя это случается редко, существуют кодовые фрагменты, которые содержат целочисленные константы в десятичной форме в исходном коде, превышающие минимальный порог. Следствием установки ограничения является то, что исходный код 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.
Примечания
-
1 -
Дополнительная информация об этих специальных методах может быть найдена в Справке по Python (Основные настройки).
-
2 -
Следовательно, список
[1, 2]считается равным[1.0, 2.0], и аналогично для кортежей. -
3 -
Они должны быть такими, так как анализатор не может определить тип операндов.
-
4(1,2,3,4) -
Символы с регистром — это те, у которых свойство общей категории является одной из «Lu» (Буква, заглавная), «Ll» (Буква, строчная) или «Lt» (Буква, строчная с заглавной).
-
5(1,2) -
Для форматирования только кортежа необходимо предоставить одиночный кортеж, единственным элементом которого является кортеж, подлежащий форматированию.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/stdtypes.html