Встроенные типы
В следующих разделах описаны стандартные типы, встроенные в интерпретатор.
Основные встроенные типы — это числовые типы, последовательности, отображения, классы, экземпляры и исключения.
Некоторые классы коллекций являются изменяемыми. Методы, которые добавляют, вычитают или переупорядочивают их члены на месте, и не возвращают конкретный элемент, никогда не возвращают сам экземпляр коллекции, а 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свойством).См. http://www.unicode.org/Public/12.1.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.Объект range будет пустым, если
r[0]не удовлетворяет ограничению значения. Диапазоны поддерживают отрицательные индексы, но они интерпретируются как индексы с конца последовательности, определяемой положительными индексами.Диапазоны, содержащие абсолютные значения, большие, чем
sys.maxsize, разрешены, но некоторые функции (например,len()) могут вызывать исключениеOverflowError.Примеры диапазонов:
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []
Диапазоны реализуют все операции над последовательностями общего типа, кроме конкатенации и повторения (поскольку объекты диапазона могут представлять только последовательности, которые следуют строгому шаблону, а повторение и конкатенация обычно нарушают этот шаблон).
-
start -
Значение параметра start (или
0если параметр не был указан)
-
stop -
Значение параметра stop
-
step -
Значение параметра step (или
1если параметр не был указан)
-
Преимущество типа range перед обычным list или tuple заключается в том, что объект range всегда занимает одинаковый (небольшой) объём памяти, независимо от размера представляемого им диапазона (так как он хранит только значения start, stop и step, рассчитывая отдельные элементы и поддиапазоны по мере необходимости).
Объекты диапазона реализуют ABC collections.abc.Sequence и предоставляют такие функции, как проверки на вхождение, поиск по индексу элементов, срезы и поддержка отрицательных индексов (см. Типы последовательностей — list, tuple, range):
>>> r = range(0, 20, 2) >>> r range(0, 20, 2) >>> 11 in r False >>> 10 in r True >>> r.index(10) 5 >>> r[5] 10 >>> r[:5] range(0, 10, 2) >>> r[-1] 18
Проверка равенства объектов range с помощью == и != сравнивает их как последовательности. То есть, два объекта range считаются равными, если они представляют одну и ту же последовательность значений. (Обратите внимание, что два равных объекта range могут иметь разные атрибуты start, stop и step, например range(0) == range(2, 1, 3) или range(0, 3, 2) == range(0, 4, 2).)
Изменено в версии 3.2: Реализует ABC Sequence. Поддерживает срезы и отрицательные индексы. Проверка объектов int на членство выполняется за постоянное время вместо перебора всех элементов.
Изменено в версии 3.3: Определяет операторы «==» и «!=» для сравнения объектов range на основе определяемой ими последовательности значений (вместо сравнения по идентификатору объекта).
См. также
- Рецепт linspace показывает, как реализовать ленивую версию range, подходящую для применений с плавающей точкой.
Тип последовательности текста — str
Текстовые данные в Python обрабатываются с помощью объектов str или строк. Строки являются неизменяемыми последовательностями точек кода Юникода. Литералы строк записываются различными способами:
- Одинарные кавычки:
'allows embedded "double" quotes' - Двойные кавычки:
"allows embedded 'single' quotes". - Тройные кавычки:
'''Three single quotes''',"""Three double quotes"""
Строки в тройных кавычках могут занимать несколько строк — все связанные пробелы будут включены в литерал строки.
Литералы строк, которые являются частью одного выражения и имеют только пробелы между ними, будут неявно преобразованы в один литерал строки. То есть, ("spam " "eggs") == "spam eggs".
См. Литералы строк и байтов для получения дополнительной информации о различных формах литералов строк, включая поддерживаемые escape-последовательности, и префикс r («сырой»), который отключает большинство обработок escape-последовательностей.
Строки также можно создать из других объектов, используя конструктор str.
Поскольку нет отдельного типа «символ», индексирование строки возвращает строки длины 1. То есть, для непустой строки s, s[0] == s[0:1].
Также нет изменяемого типа строки, но str.join() или io.StringIO можно использовать для эффективного построения строк из нескольких фрагментов.
Изменено в версии 3.3: Для обратной совместимости с Python 2, префикс u снова разрешен для литералов строк. Он не влияет на значение литералов строк и не может быть объединён с префиксом r.
-
class str(object='') -
class str(object=b'', encoding='utf-8', errors='strict') -
Возвращает строковую версию объекта object. Если object не указан, возвращает пустую строку. В противном случае, поведение
str()зависит от того, заданы ли encoding или errors, следующим образом.Если ни encoding, ни errors не заданы,
str(object)возвращаетobject.__str__(), которая представляет собой «неформальное» или красиво напечатанное строковое представление object. Для строковых объектов это сама строка. Если у object нет метода__str__(), тогдаstr()возвращаетrepr(object).Если хотя бы один из encoding или errors задан, object должен быть объектом-подобным байтам (например,
bytesилиbytearray). В этом случае, если object является объектомbytes(илиbytearray), тоstr(bytes, encoding, errors)эквивалентноbytes.decode(encoding, errors). В противном случае, байтовый объект, лежащий в основе объекта буфера, получается перед вызовомbytes.decode(). См. Бинарные типы последовательностей — bytes, bytearray, memoryview и Протокол буфера для получения информации об объектах буфера.Передача объекта
bytesвstr()без аргументов encoding или errors попадает под первый случай возврата неформального строкового представления (см. также командную строку-bPython). Например:>>> str(b'Zoot!') "b'Zoot!'"
Для получения дополнительной информации о классе
strи его методах см. Тип последовательности текста — str и раздел Методы строк ниже. Чтобы вывести отформатированные строки, см. разделы Литералы отформатированных строк и Синтаксис строки форматирования. Кроме того, см. раздел Сервисы обработки текста.
Методы строк
Строки реализуют все общие операции с последовательностями, а также дополнительные методы, описанные ниже.
Строки также поддерживают два стиля форматирования строк: один обеспечивает большую гибкость и настраиваемость (см. str.format(), Синтаксис форматирования строк и Настраиваемое форматирование строк), а другой основан на форматировании по стилю C printf , который обрабатывает более узкий диапазон типов и немного сложнее использовать правильно, но часто быстрее в тех случаях, когда он применим (Форматирование строк в стиле printf).
Раздел «Службы обработки текста» стандартной библиотеки охватывает ряд других модулей, которые предоставляют различные утилиты, связанные с текстом (включая поддержку регулярных выражений в модуле re).
-
str.capitalize() -
Возвращает копию строки с заглавной первой буквой и остальными строчными.
Изменено в версии 3.8: Первая буква теперь используется в стиле заголовков, а не в верхнем регистре. Это означает, что такие символы, как диграфы, будут иметь только первую букву заглавной, а не весь символ.
-
str.casefold() -
Возвращает копию строки в сложенном формате. Строки в сложенном формате могут использоваться для сопоставления без учета регистра.
Сворачивание регистра аналогично приведению к нижнему регистру, но более агрессивно, так как предназначено для удаления всех различий в регистре в строке. Например, немецкая строчная буква
'ß'эквивалентна"ss". Поскольку она уже в нижнем регистре,lower()не произведет никаких изменений в'ß';casefold()преобразует ее в"ss".Алгоритм сворачивания регистра описан в разделе 3.13 стандарта Unicode.
Введено в версии 3.3.
-
str.center(width[, fillchar]) -
Возвращает строку, центрированную в строке длины 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(), см. раздел Обработчики ошибок. Список возможных кодировок см. в разделе Стандартные кодировки.Изменено в версии 3.1: Добавлена поддержка ключевых аргументов.
-
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в противном случае. Числовые символы включают цифры и все символы, имеющие числовое свойство Юникода, например U+2155, ПРОСТАЯ ДРОБЬ ОДНА ПЯТАЯ. Формально, числовые символы — это те, у которых значение свойства Numeric_Type равно Digit, Decimal или Numeric.
-
str.isprintable() -
Возвращает
True, если все символы в строке являются печатными или строка пустая,Falseв противном случае. Непечатные символы — это символы, определённые в базе данных символов Юникода как «Другие» или «Разделители», за исключением ASCII пробела (0x20), который считается печатным. (Обратите внимание, что печатные символы в данном контексте — это те, которые не должны экранироваться при вызовеrepr()для строки. Это никак не влияет на обработку строк, записываемых вsys.stdoutилиsys.stderr.)
-
str.isspace() -
Возвращает
True, если в строке содержатся только пробельные символы и в строке есть хотя бы один символ,Falseв противном случае.Символ является пробелом, если в базе данных символов Юникода (см.
unicodedata), либо его общая категория равнаZs(«Разделитель, пробел»), либо его направление текста (bidirectional class) является одним изWS,B, илиS.
-
str.istitle() -
Возвращает
True, если строка является строкой с заглавными буквами в начале слов и в строке есть хотя бы один символ, например, заглавные буквы могут следовать только за незаглавными буквами, а строчные буквы только за заглавными. ВозвращаетFalseв противном случае.
-
str.isupper() -
Возвращает
True, если все символы с регистром 4 в строке являются заглавными и в строке есть хотя бы один символ с регистром,Falseв противном случае.
-
str.join(iterable) -
Возвращает строку, являющуюся конкатенацией строк в iterable. Будет вызвано исключение
Разделитель между элементами — это строка, предоставляющая этот метод.TypeError, если в iterable есть значения, не являющиеся строками, включая объектыbytes.
-
str.ljust(width[, fillchar]) -
Возвращает строку, выровненную по левому краю в строке длины width. Заполнение выполняется с использованием указанного fillchar (по умолчанию ASCII пробел). Исходная строка возвращается, если width меньше или равно
len(s).
-
str.lower() -
Возвращает копию строки со всеми символами с регистром 4, преобразованными в строчные.
Алгоритм приведения к нижнему регистру описан в разделе 3.13 стандарта Юникод.
-
str.lstrip([chars]) -
Возвращает копию строки с удаленными начальными символами. Аргумент chars — это строка, определяющая набор символов для удаления. Если аргумент опущен или
None, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является префиксом; удаляются все комбинации его значений:>>> ' spacious '.lstrip() 'spacious ' >>> 'www.example.com'.lstrip('cmowz.') 'example.com'
-
static str.maketrans(x[, y[, z]]) -
Этот статический метод возвращает таблицу преобразований, пригодную для использования с
str.translate().Если есть только один аргумент, он должен быть словарем, сопоставляющим порядковые номера Юникода (целые числа) или символы (строки длины 1) с порядковыми номерами Юникода, строками (произвольной длины) или
None. Символьные ключи затем будут преобразованы в порядковые номера.Если есть два аргумента, они должны быть строками одинаковой длины, и в результирующем словаре каждый символ в x будет сопоставлен символу на той же позиции в y. Если есть третий аргумент, он должен быть строкой, символы которой будут сопоставлены с
Noneв результате.
-
str.partition(sep) -
Разделяет строку на части по первому вхождению sep и возвращает кортеж из трёх элементов: часть строки перед разделителем, сам разделитель и часть строки после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий строку, за которой следуют две пустые строки.
-
str.replace(old, new[, count]) -
Возвращает копию строки, во всех вхождениях подстроки old заменяются на new. Если необязательный аргумент count указан, заменяются только первые count вхождений.
-
str.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс в строке, где найдена подстрока sub, такая что sub содержится в
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в обозначении срезов. Возвращает-1в случае неудачи.
-
str.rindex(sub[, start[, end]]) -
Аналогично
rfind(), но вызывает исключениеValueError, если подстрока sub не найдена.
-
str.rjust(width[, fillchar]) -
Возвращает строку, выровненную по правому краю в строке длины width. Заполнение выполняется с использованием указанного fillchar (по умолчанию ASCII пробел). Исходная строка возвращается, если width меньше или равно
len(s).
-
str.rpartition(sep) -
Разделяет строку на части по последнему вхождению sep и возвращает кортеж из трёх элементов: часть строки перед разделителем, сам разделитель и часть строки после разделителя. Если разделитель не найден, возвращает кортеж из трёх элементов, содержащий две пустые строки, за которыми следует сама строка.
-
str.rsplit(sep=None, maxsplit=-1) -
Возвращает список слов в строке, используя sep в качестве разделителя строки. Если задан maxsplit, выполняется не более maxsplit разбиений, начиная с правого конца. Если sep не задан или
None, любая пробельная строка является разделителем. За исключением разбиения справа,rsplit()ведет себя какsplit(), которая подробно описана ниже.
-
str.rstrip([chars]) -
Возвращает копию строки с удаленными конечными символами. Аргумент chars — это строка, определяющая набор символов для удаления. Если аргумент опущен или
None, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является суффиксом; удаляются все комбинации его значений:>>> ' spacious '.rstrip() ' spacious' >>> 'mississippi'.rstrip('ipz') 'mississ'
-
str.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]) -
Возвращает список строк в строке, разбивая по границам строк. Разделители строк не включаются в результирующий список, если не указано значение keepends, равное true.
Этот метод разбивает по следующим границам строк. В частности, границы являются супермножеством универсальных новых строк.
Представление
Описание
\nПеревод строки
\rВозврат каретки
\r\nВозврат каретки + перевод строки
\vor\x0bТабуляция
\for\x0cФорматирование страницы
\x1cРазделитель файлов
\x1dРазделитель групп
\x1eРазделитель записей
\x85Следующая строка (управляющий код C1)
\u2028Разделитель строк
\u2029Разделитель абзацев
Изменено в версии 3.2:
\vи\fдобавлены в список границ строк.Например:
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines() ['ab c', '', 'de fg', 'kl'] >>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) ['ab c\n', '\n', 'de fg\r', 'kl\r\n']
В отличие от
split(), когда указана строка-разделитель sep, этот метод возвращает пустой список для пустой строки, и конечный перевод строки не приводит к дополнительной строке:>>> "".splitlines() [] >>> "One line\n".splitlines() ['One line']
Для сравнения,
split('\n')даёт:>>> ''.split('\n') [''] >>> 'Two lines\n'.split('\n') ['Two lines', '']
-
str.startswith(prefix[, start[, end]]) -
Возвращает
True, если строка начинается с префикса, в противном случае возвращаетFalse. Префикс также может быть кортежем префиксов, которые нужно искать. При необязательном start тестирование начинается с этой позиции. При необязательном end сравнение останавливается на этой позиции.
-
str.strip([chars]) -
Возвращает копию строки, из которой удалены начальные и конечные символы. Аргумент chars — это строка, определяющая множество символов, которые нужно удалить. Если опущен или
None, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является префиксом или суффиксом; вместо этого удаляются все комбинации его значений:>>> ' spacious '.strip() 'spacious' >>> 'www.example.com'.strip('cmowz.') 'example'Извлекаются самые внешние начальные и конечные значения аргумента chars. Символы удаляются из начала, пока не будет достигнут символ строки, который не содержится в наборе символов в chars. Аналогичное действие происходит с конечным концом. Например:
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......' >>> comment_string.strip('.#! ') 'Section 3.2.1 Issue #32'
-
str.swapcase() -
Возвращает копию строки с заглавными символами, преобразованными в строчные, и наоборот. Обратите внимание, что
s.swapcase().swapcase() == sне обязательно.
-
str.title() -
Возвращает строку в формате заголовка, где слова начинаются с заглавной буквы, а остальные символы — строчные.
Например:
>>> 'Hello world'.title() 'Hello World'
Алгоритм использует простое, независимое от языка определение слова как групп последовательных букв. Определение работает во многих контекстах, но это означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может не соответствовать желаемому результату:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
Обходной путь для апострофов можно реализовать с помощью регулярных выражений:
>>> 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) -
Возвращает копию строки, в которой каждый символ был отображён через заданную таблицу преобразований. Таблица должна быть объектом, реализующим индексацию через
None, обычно отображение или последовательность. При индексации по порядковому номеру Юникода (целому числу), объект таблицы может выполнить любое из следующих действий: вернуть порядковый номер Юникода или строку, чтобы отобразить символ на один или несколько других символов; вернутьNone, чтобы удалить символ из возвращаемой строки; или поднять исключениеLookupError, чтобы отобразить символ на себя.Можно использовать
str.maketrans()для создания таблицы преобразования из сопоставлений символ-символ в разных форматах.См. также модуль
codecsдля более гибкого подхода к пользовательским сопоставлениям символов.
-
str.upper() -
Возвращает копию строки со всеми символами с регистром 4, преобразованными в верхний регистр. Обратите внимание, что
s.upper().isupper()может бытьFalseеслиsсодержит символы без регистра или если категория Юникода результирующего символа(ов) не «Lu» (буква, заглавная), а, например, «Lt» (буква, строчная).Используемый алгоритм преобразования в верхний регистр описан в разделе 3.13 стандарта Юникод.
-
str.zfill(width) -
Возвращает копию строки, заполненную слева цифрами ASCII до длины ширина. Префикс знака (
'+'/'-') обрабатывается вставкой заполнения после символа знака, а не перед ним. Исходная строка возвращается, если ширина меньше или равна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 и тесно связаны с объектами строк в различных других аспектах.
-
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 с использованием соответствующей последовательности escape.
Как и в случае с литералами строк, литералы bytes также могут использовать префикс
rдля отключения обработки последовательностей escape. Подробнее о различных формах литералов bytes, включая поддерживаемые последовательности escape, см. в разделе Литералы строк и bytes.Хотя литералы и представления объектов bytes основаны на тексте ASCII, сами объекты bytes ведут себя как неизменяемые последовательности целых чисел, при этом каждое значение в последовательности ограничено тем, что
0 <= x < 256(попытки нарушить это ограничение приведут к исключениюValueError). Это сделано намеренно, чтобы подчеркнуть, что, хотя многие двоичные форматы включают элементы на основе ASCII и могут быть полезно обработаны с помощью некоторых алгоритмов, ориентированных на текст, это обычно не относится к произвольным двоичным данным (слепое применение алгоритмов обработки текста к форматам двоичных данных, несовместимым с ASCII, обычно приводит к повреждению данных).В дополнение к литеральным формам объекты bytes можно создать несколькими другими способами:
- Объект bytes с нулевыми значениями заданной длины:
bytes(10) - Из итерируемого объекта целых чисел:
bytes(range(20)) - Копирование существующих двоичных данных с помощью протокола буфера:
bytes(obj)
См. также встроенную функцию bytes.
Поскольку две шестнадцатеричные цифры точно соответствуют одному байту, шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип bytes имеет дополнительный метод класса для чтения данных в этом формате:
-
classmethod fromhex(string) -
Этот метод класса
bytesвозвращает объект bytes, декодируя указанный строковый объект. Строка должна содержать две шестнадцатеричные цифры на каждый байт, а символы ASCII-пробела игнорируются.>>> bytes.fromhex('2Ef0 F1f2 ') b'.\xf0\xf1\xf2'Изменено в версии 3.7:
bytes.fromhex()теперь пропускает все символы ASCII-пробела в строке, а не только пробелы.
Существует обратная функция преобразования для преобразования объекта bytes в его шестнадцатеричное представление.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.
>>> b'\xf0\xf1\xf2'.hex() 'f0f1f2'
Если вы хотите сделать шестнадцатеричную строку более читаемой, вы можете указать параметр разделителя sep для вставки в выходные данные. По умолчанию между каждым байтом. Второй необязательный параметр bytes_per_sep управляет позицией разделителя. Положительные значения вычисляют позицию разделителя справа, отрицательные — слева.
>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') 'f0-f1-f2' >>> value.hex('_', 2) 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) '55554444 4c524c52 4142'Новое в версии 3.5.
Изменено в версии 3.8:
bytes.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
Поскольку объекты bytes представляют собой последовательности целых чисел (аналогично кортежу), для объекта bytes b,
b[0]будет целым числом, аb[0:1]будет объектом bytes длиной 1. (Это отличается от текстовых строк, где и индексирование, и срезы дадут строку длиной 1)Представление объектов bytes использует литеральный формат (
b'...') так как он часто более полезен, чем, например,bytes([46, 46, 46]). Вы всегда можете преобразовать объект bytes в список целых чисел, используяlist(b).Примечание
Для пользователей Python 2.x: В Python 2.x допускалось множество неявных преобразований между строками 8-битного кода (самый близкий аналог встроенного двоичного типа данных) и строками Unicode. Это был обходной путь обратной совместимости для учета того факта, что Python изначально поддерживал только 8-битный текст, а текст Unicode — это более позднее дополнение. В Python 3.x неявные преобразования отсутствуют — преобразования между двоичными данными 8-битного кода и текстом Unicode должны быть явными, и объекты bytes и строковые объекты всегда будут считаться разными.
- Одинарные кавычки:
Объекты типа bytearray
bytearray — это изменяемый аналог объектов bytes.
-
class bytearray([source[, encoding[, errors]]]) -
Для объектов bytearray нет специального синтаксиса литералов, вместо этого они всегда создаются вызовом конструктора:
- Создание пустого экземпляра:
bytearray() - Создание экземпляра с нулевыми значениями заданной длины:
bytearray(10) - Из итерируемого объекта целых чисел:
bytearray(range(20)) - Копирование существующих двоичных данных с помощью протокола буфера:
bytearray(b'Hi!')
Поскольку объекты bytearray являются изменяемыми, они поддерживают операции с изменяемыми последовательностями mutable в дополнение к общим операциям bytes и bytearray, описанным в разделе Операции с bytes и bytearray.
См. также встроенную функцию bytearray.
Поскольку две шестнадцатеричные цифры точно соответствуют одному байту, шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип bytearray имеет дополнительный метод класса для чтения данных в этом формате:
-
classmethod fromhex(string) -
Этот метод класса
bytearrayвозвращает объект bytearray, декодируя указанный строковый объект. Строка должна содержать две шестнадцатеричные цифры на каждый байт, а символы ASCII-пробела игнорируются.>>> bytearray.fromhex('2Ef0 F1f2 ') bytearray(b'.\xf0\xf1\xf2')Изменено в версии 3.7:
bytearray.fromhex()теперь пропускает все символы ASCII-пробела в строке, а не только пробелы.
Существует обратная функция преобразования для преобразования объекта bytearray в его шестнадцатеричное представление.
-
hex([sep[, bytes_per_sep]]) -
Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта в экземпляре.
>>> bytearray(b'\xf0\xf1\xf2').hex() 'f0f1f2'
Новое в версии 3.5.
Изменено в версии 3.8: Аналогично
bytes.hex(),bytearray.hex()теперь поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричном выводе.
Поскольку объекты bytearray представляют собой последовательности целых чисел (аналогично списку), для объекта bytearray b,
b[0]будет целым числом, аb[0:1]будет объектом bytearray длиной 1. (Это отличается от текстовых строк, где и индексирование, и срезы дадут строку длиной 1)Представление объектов bytearray использует формат литерала bytes (
bytearray(b'...')) так как он часто более полезен, чем, например,bytearray([46, 46, 46]). Вы всегда можете преобразовать объект bytearray в список целых чисел, используяlist(b). - Создание пустого экземпляра:
Операции с объектами bytes и bytearray
Объекты bytes и bytearray поддерживают общие операции с последовательностями common. Они взаимодействуют не только с операндами того же типа, но и с любым объектом типа bytes-like. Благодаря этой гибкости, их можно свободно смешивать в операциях без возникновения ошибок. Однако тип результата может зависеть от порядка операндов.
Примечание
Методы объектов bytes и bytearray не принимают строки в качестве аргументов, точно так же как методы строк не принимают байты в качестве аргументов. Например, вы должны написать:
a = "abc"
b = a.replace("a", "f")
и:
a = b"abc" b = a.replace(b"a", b"f")
Некоторые операции с объектами bytes и bytearray предполагают использование совместимых с ASCII двоичных форматов, и поэтому их следует избегать при работе с произвольными двоичными данными. Эти ограничения рассмотрены ниже.
Примечание
Использование этих основанных на ASCII операций для обработки двоичных данных, которые не хранятся в формате, основанном на ASCII, может привести к повреждению данных.
Следующие методы объектов bytes и bytearray могут быть использованы с произвольными двоичными данными.
-
bytes.count(sub[, start[, end]]) -
bytearray.count(sub[, start[, end]]) -
Возвращает количество неперекрывающихся вхождений подпоследовательности sub в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются так же, как в обозначении срезов.
Подпоследовательность для поиска может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
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(), см. раздел Обработчики ошибок. Список возможных кодировок см. в разделе Стандартные кодировки.Примечание
Передача аргумента encoding методу
strпозволяет декодировать любой объект типа bytes-like напрямую, без необходимости создания временного объекта bytes или bytearray.Изменено в версии 3.1: Добавлена поддержка ключевых аргументов.
-
bytes.endswith(suffix[, start[, end]]) -
bytearray.endswith(suffix[, start[, end]]) -
Возвращает
Trueесли двоичные данные заканчиваются указанным суффикс, в противном случае возвращаетFalse. суффикс также может быть кортежем суффиксов для поиска. С необязательным start, выполняется проверка начиная с этой позиции. С необязательным end, сравнение останавливается на этой позиции.Суффикс(ы) для поиска может быть любым объектом типа bytes-like.
-
bytes.find(sub[, start[, end]]) -
bytearray.find(sub[, start[, end]]) -
Возвращает наименьший индекс в данных, где найдена подпоследовательность sub, такая что sub содержится в срезе
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в обозначении срезов. Возвращает-1если sub не найдена.Подпоследовательность для поиска может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Примечание
Метод
find()должен использоваться только если вам нужно знать положение sub. Чтобы проверить, является ли sub подстрокой, используйте операторin:>>> b'Py' in b'Python' True
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.index(sub[, start[, end]]) -
bytearray.index(sub[, start[, end]]) -
Аналогично
find(), но вызываетValueError, когда подпоследовательность не найдена.Подпоследовательность для поиска может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.join(iterable) -
bytearray.join(iterable) -
Возвращает объект bytes или bytearray, являющийся конкатенацией последовательностей двоичных данных в iterable. Будет возбуждено исключение
TypeError, если в iterable есть какие-либо значения, которые не являются объектами типа bytes-like, включая объектыstr.Разделитель между элементами — содержимое объекта bytes или bytearray, предоставляющего этот метод.
-
static bytes.maketrans(from, to) -
static bytearray.maketrans(from, to) -
Этот статический метод возвращает таблицу преобразования, пригодную для использования с
bytes.translate(), которая будет сопоставлять каждый символ в from с символом в той же позиции в to; from и to должны быть оба объектами типа bytes-like и иметь одинаковую длину.Введено в версии 3.1.
-
bytes.partition(sep) -
bytearray.partition(sep) -
Разделяет последовательность по первому вхождению sep и возвращает кортеж из 3 элементов: часть перед разделителем, сам разделитель (или его копия bytearray) и часть после разделителя. Если разделитель не найден, возвращается кортеж из 3 элементов: копия исходной последовательности, после чего два пустых объекта bytes или bytearray.
Разделитель для поиска может быть любым объектом типа bytes-like.
-
bytes.replace(old, new[, count]) -
bytearray.replace(old, new[, count]) -
Возвращает копию последовательности со всеми вхождениями подпоследовательности old, заменёнными на new. Если необязательный аргумент count задан, заменятся только первые count вхождений.
Подпоследовательность для поиска и её замена может быть любым объектом типа bytes-like.
Примечание
Версия bytearray этого метода не работает на месте — она всегда создаёт новый объект, даже если изменений не произошло.
-
bytes.rfind(sub[, start[, end]]) -
bytearray.rfind(sub[, start[, end]]) -
Возвращает наибольший индекс в последовательности, где найдена подпоследовательность sub, такая что sub содержится в
s[start:end]. Необязательные аргументы start и end интерпретируются так же, как в обозначении срезов. Возвращает-1при неудаче.Подпоследовательность для поиска может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.rindex(sub[, start[, end]]) -
bytearray.rindex(sub[, start[, end]]) -
Аналогично
rfind(), но вызываетValueError, когда подпоследовательность sub не найдена.Подпоследовательность для поиска может быть любым объектом типа bytes-like или целым числом в диапазоне от 0 до 255.
Изменено в версии 3.3: Также принимает целое число в диапазоне от 0 до 255 в качестве подпоследовательности.
-
bytes.rpartition(sep) -
bytearray.rpartition(sep) -
Разделить последовательность по последнему вхождению sep и вернуть кортеж из 3 элементов: часть перед разделителем, сам разделитель или его копию типа bytearray, и часть после разделителя. Если разделитель не найден, вернуть кортеж из двух пустых объектов bytes или bytearray, за которым следует копия исходной последовательности.
Разделитель, по которому производится поиск, может быть любым объектом типа bytes-like.
-
bytes.startswith(prefix[, start[, end]]) -
bytearray.startswith(prefix[, start[, end]]) -
Возвращает
True, если двоичные данные начинаются с указанного префикса, в противном случае возвращаетFalse. префикс также может быть кортежем префиксов для проверки. С необязательным start, проверка начинается с этой позиции. С необязательным end, сравнение останавливается на этой позиции.Префикс(ы) для поиска может быть любым объектом типа bytes-like.
-
bytes.translate(table, /, delete=b'') -
bytearray.translate(table, /, delete=b'') -
Возвращает копию объекта bytes или bytearray, где все байты, присутствующие в необязательном аргументе delete, удаляются, а оставшиеся байты отображаются через заданную таблицу преобразования, которая должна быть объектом bytes длиной 256.
Вы можете использовать метод
bytes.maketrans()для создания таблицы преобразования.Установите аргумент table в
Noneдля преобразований, которые только удаляют символы:>>> b'read this short text'.translate(None, b'aeiou') b'rd ths shrt txt'
Изменено в версии 3.6: delete теперь поддерживается в качестве ключевого аргумента.
Следующие методы для объектов bytes и bytearray предполагают использование совместимых с ASCII двоичных форматов, но их можно использовать и с произвольными двоичными данными, передавая соответствующие аргументы. Обратите внимание, что все методы bytearray в этом разделе не работают на месте и вместо этого создают новые объекты.
-
bytes.center(width[, fillbyte]) -
bytearray.center(width[, fillbyte]) -
Возвращает копию объекта, центрированную в последовательности длиной width. Заполнение выполняется с использованием указанного fillbyte (по умолчанию - пробел ASCII). Для объектов
bytes, исходная последовательность возвращается, если width меньше или равноlen(s).Примечание
Версия метода bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.ljust(width[, fillbyte]) -
bytearray.ljust(width[, fillbyte]) -
Возвращает копию объекта, выровненного влево в последовательности длиной width. Заполнение выполняется с использованием указанного fillbyte (по умолчанию - пробел ASCII). Для объектов
bytes, исходная последовательность возвращается, если width меньше или равноlen(s).Примечание
Версия метода bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.lstrip([chars]) -
bytearray.lstrip([chars]) -
Возвращает копию последовательности со удаленными начальными байтами. Аргумент chars — двоичная последовательность, определяющая набор значений байтов для удаления — название метода обычно относится к использованию с ASCII символами. Если опущен или
None, аргумент chars по умолчанию удаляет пробелы ASCII. Аргумент chars не является префиксом; удаляются все комбинации его значений:>>> b' spacious '.lstrip() b'spacious ' >>> b'www.example.com'.lstrip(b'cmowz.') b'example.com'
Двоичная последовательность значений байтов для удаления может быть любым объектом типа bytes-like.
Примечание
Версия метода bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.rjust(width[, fillbyte]) -
bytearray.rjust(width[, fillbyte]) -
Возвращает копию объекта, выровненного вправо в последовательности длиной width. Заполнение выполняется с использованием указанного fillbyte (по умолчанию - пробел ASCII). Для объектов
bytes, исходная последовательность возвращается, если width меньше или равноlen(s).Примечание
Версия метода bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.rsplit(sep=None, maxsplit=-1) -
bytearray.rsplit(sep=None, maxsplit=-1) -
Разделить двоичную последовательность на подпоследовательности того же типа, используя sep в качестве разделителя. Если задан maxsplit, выполняется не более maxsplit разбиений, начиная с правого края. Если sep не указан или
None, любой подпоследовательность, состоящая только из пробелов ASCII, является разделителем. За исключением разделения справа,rsplit()ведет себя какsplit(), подробное описание которого приведено ниже.
-
bytes.rstrip([chars]) -
bytearray.rstrip([chars]) -
Возвращает копию последовательности со удаленными конечными байтами. Аргумент chars — двоичная последовательность, определяющая набор значений байтов для удаления — название метода обычно относится к использованию с ASCII символами. Если опущен или
None, аргумент chars по умолчанию удаляет пробелы ASCII. Аргумент chars не является суффиксом; удаляются все комбинации его значений:>>> b' spacious '.rstrip() b' spacious' >>> b'mississippi'.rstrip(b'ipz') b'mississ'
Двоичная последовательность значений байтов для удаления может быть любым объектом типа bytes-like.
Примечание
Версия метода 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.Например:
>>> 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.
Примечание
Версия метода bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
Следующие методы для объектов bytes и bytearray предполагают использование совместимых с ASCII двоичных форматов и не должны применяться к произвольным двоичным данным. Обратите внимание, что все методы bytearray в этом разделе не работают на месте и вместо этого создают новые объекты.
-
bytes.capitalize() -
bytearray.capitalize() -
Возвращает копию последовательности с каждым байтом, интерпретированным как ASCII символ, первым байтом в верхнем регистре и остальными в нижнем. Значения байтов, не являющиеся ASCII, передаются без изменений.
Примечание
Версия метода bytearray не работает на месте — она всегда создает новый объект, даже если изменений не было.
-
bytes.expandtabs(tabsize=8) -
bytearray.expandtabs(tabsize=8) -
Возвращает копию последовательности, в которой все символы табуляции ASCII заменены одним или несколькими символами пробела ASCII, в зависимости от текущей колонки и заданного размера табуляции. Позиции табуляции встречаются каждые tabsize байт (по умолчанию 8, что даёт позиции табуляции в столбцах 0, 8, 16 и так далее). Для расширения последовательности текущая колонка устанавливается в ноль, и последовательность проверяется побайтно. Если байт является символом табуляции ASCII (
b'\t'), в результат вставляется один или несколько символов пробела, пока текущая колонка не станет равной следующей позиции табуляции. (Сам символ табуляции не копируется.) Если текущий байт — символ новой строки ASCII (b'\n') или возврата каретки (b'\r'), он копируется, а текущая колонка сбрасывается в ноль. Любое другое значение байта копируется без изменений, и текущая колонка увеличивается на единицу независимо от того, как значение байта представлено при выводе:>>> b'01\t012\t0123\t01234'.expandtabs() b'01 012 0123 01234' >>> b'01\t012\t0123\t01234'.expandtabs(4) b'01 012 0123 01234'
Примечание
Версия метода для объекта bytearray не изменяет исходный объект — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.isalnum() -
bytearray.isalnum() -
Возвращает
Trueесли все байты в последовательности являются буквенно-цифровыми символами ASCII или десятичными цифрами ASCII, и последовательность не пуста,Falseв противном случае. Буквенно-цифровые символы ASCII — это те значения байтов в последовательностиb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. Десятичные цифры ASCII — это те значения байтов в последовательностиb'0123456789'.Например:
>>> b'ABCabc1'.isalnum() True >>> b'ABC abc1'.isalnum() False
-
bytes.isalpha() -
bytearray.isalpha() -
Возвращает
Trueесли все байты в последовательности являются буквенными символами ASCII, и последовательность не пуста,Falseв противном случае. Буквенные символы ASCII — это те значения байтов в последовательностиb'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.Например:
>>> b'ABCabc'.isalpha() True >>> b'ABCabc1'.isalpha() False
-
bytes.isascii() -
bytearray.isascii() -
Возвращает
Trueесли последовательность пуста или все байты в последовательности являются символами ASCII,Falseв противном случае. Байты ASCII находятся в диапазоне 0-0x7F.Введено в версии 3.7.
-
bytes.isdigit() -
bytearray.isdigit() -
Возвращает
Trueесли все байты в последовательности являются десятичными цифрами ASCII, и последовательность не пуста,Falseв противном случае. Десятичные цифры ASCII — это те значения байтов в последовательностиb'0123456789'.Например:
>>> b'1234'.isdigit() True >>> b'1.23'.isdigit() False
-
bytes.islower() -
bytearray.islower() -
Возвращает
Trueесли в последовательности есть хотя бы один строчный символ ASCII и нет заглавных символов ASCII,Falseв противном случае.Например:
>>> b'hello world'.islower() True >>> b'Hello world'.islower() False
Строчные символы ASCII — это те значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные символы ASCII — это те значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
-
bytes.isspace() -
bytearray.isspace() -
Возвращает
Trueесли все байты в последовательности являются пробельными символами ASCII, и последовательность не пуста,Falseв противном случае. Пробельные символы ASCII — это те значения байтов в последовательностиb' \t\n\r\x0b\f'(пробел, табуляция, новая строка, возврат каретки, вертикальная табуляция, перевод страницы).
-
bytes.istitle() -
bytearray.istitle() -
Возвращает
Trueесли последовательность является заглавной ASCII и последовательность не пуста,Falseв противном случае. См.bytes.title()для получения более подробной информации об определении «заглавной» формы.Например:
>>> b'Hello World'.istitle() True >>> b'Hello world'.istitle() False
-
bytes.isupper() -
bytearray.isupper() -
Возвращает
Trueесли в последовательности есть хотя бы один заглавный буквенный символ ASCII и нет строчных символов ASCII,Falseв противном случае.Например:
>>> b'HELLO WORLD'.isupper() True >>> b'Hello world'.isupper() False
Строчные символы ASCII — это те значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные символы ASCII — это те значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
-
bytes.lower() -
bytearray.lower() -
Возвращает копию последовательности, в которой все заглавные ASCII символы преобразованы в соответствующие строчные.
Например:
>>> b'Hello World'.lower() b'hello world'
Строчные символы ASCII — это те значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные символы ASCII — это те значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Примечание
Версия метода для объекта bytearray не изменяет исходный объект — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.splitlines(keepends=False) -
bytearray.splitlines(keepends=False) -
Возвращает список строк в бинарной последовательности, разбивая их по границам строк ASCII. Этот метод использует подход универсальных разделителей строк для разделения строк. Разделители строк не включаются в результирующий список, если не задано keepends и оно не равно true.
Например:
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines() [b'ab c', b'', b'de fg', b'kl'] >>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) [b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
В отличие от
split(), когда задана строка-разделитель sep, этот метод возвращает пустой список для пустой строки и конечный разделитель строки не приводит к дополнительной строке:>>> b"".split(b'\n'), b"Two lines\n".split(b'\n') ([b''], [b'Two lines', b'']) >>> b"".splitlines(), b"One line\n".splitlines() ([], [b'One line'])
-
bytes.swapcase() -
bytearray.swapcase() -
Возвращает копию последовательности, в которой все строчные ASCII символы преобразованы в соответствующие заглавные, а заглавные — в строчные.
Например:
>>> b'Hello World'.swapcase() b'hELLO wORLD'
Строчные символы ASCII — это те значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные символы ASCII — это те значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.В отличие от
str.swapcase(), всегда верно, чтоbin.swapcase().swapcase() == binдля бинарных версий. Преобразования регистра симметричны в ASCII, хотя это не всегда верно для произвольных значений Unicode.Примечание
Версия метода для объекта bytearray не изменяет исходный объект — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.title() -
bytearray.title() -
Возвращает заглавленную версию бинарной последовательности, где слова начинаются с заглавной ASCII буквы, а остальные символы — строчные. Символы без регистра остаются без изменений.
Например:
>>> b'Hello world'.title() b'Hello World'
Строчные символы ASCII — это те значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные символы ASCII — это те значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. Все другие значения байтов не меняются.Алгоритм использует простое, независимое от языка, определение слова как групп последовательных букв. Это определение работает во многих контекстах, но означает, что апострофы в сокращениях и притяжательных формах образуют границы слов, что может не быть желаемым результатом:
>>> b"they're bill's friends from the UK".title() b"They'Re Bill'S Friends From The Uk"
Решение проблемы с апострофами может быть построено с использованием регулярных выражений:
>>> import re >>> def titlecase(s): ... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0)[0:1].upper() + ... mo.group(0)[1:].lower(), ... s) ... >>> titlecase(b"they're bill's friends.") b"They're Bill's Friends."Примечание
Версия метода для объекта bytearray не изменяет исходный объект — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.upper() -
bytearray.upper() -
Возвращает копию последовательности, в которой все строчные ASCII символы преобразованы в соответствующие заглавные.
Например:
>>> b'Hello World'.upper() b'HELLO WORLD'
Строчные символы ASCII — это те значения байтов в последовательности
b'abcdefghijklmnopqrstuvwxyz'. Заглавные символы ASCII — это те значения байтов в последовательностиb'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.Примечание
Версия метода для объекта bytearray не изменяет исходный объект — она всегда создаёт новый объект, даже если изменений не было.
-
bytes.zfill(width) -
bytearray.zfill(width) -
Возвращает копию последовательности, заполненной слева символами ASCII
b'0'цифрами до длины width. Предшествующий знак (b'+'/b'-') обрабатывается вставкой заполнения после знака, а не перед ним. Для объектовbytesисходная последовательность возвращается, если width меньше или равноlen(seq).Например:
>>> b"42".zfill(5) b'00042' >>> b"-42".zfill(5) b'-0042'
Примечание
Версия метода для объекта bytearray не изменяет исходный объект — она всегда создаёт новый объект, даже если изменений не было.
printf-форматирование байтовых объектов
Примечание
Операции форматирования, описанные здесь, обладают рядом особенностей, которые приводят к множеству распространенных ошибок (например, к неверному отображению кортежей и словарей). Если печатаемое значение может быть кортежем или словарем, оберните его в кортеж.
Объекты типа bytes (bytes/bytearray) имеют одну уникальную встроенную операцию: оператор % (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) |
| Один байт (принимает целое число или объект одного байта). | |
| Байты (любой объект, который следует протоколу буфера буфера или имеет | (5) |
|
| (6) |
| Байты (преобразует любой объект Python, используя | (5) |
|
| (7) |
| Никакой аргумент не преобразуется, результатом является символ |
Примечания:
- Альтернативная форма вставляет префикс «0o» перед первой цифрой.
- Альтернативная форма вставляет префикс «0x» или «0X» (в зависимости от того, использовался ли формат %x или %X) перед первой цифрой.
-
Альтернативная форма всегда включает десятичную точку, даже если за ней нет цифр.
Точность определяет количество цифр после десятичной точки и по умолчанию равна 6.
-
Альтернативная форма всегда включает десятичную точку, и хвостовые нули не удаляются, как это происходило бы в противном случае.
Точность определяет количество значащих цифр до и после десятичной точки и по умолчанию равна 6.
- Если точность равна
N, вывод усекается доNсимволов. b'%s'устарел, но не будет удален в серии 3.x.b'%r'устарел, но не будет удален в серии 3.x.- См. PEP 237.
Примечание
Версия метода bytearray этого метода не работает на месте — она всегда создаёт новый объект, даже если не были внесены никакие изменения.
См. также
PEP 461 — Добавление форматирования % к bytes и bytearray
Новое в версии 3.5.
Представления памяти
memoryview объекты позволяют коду Python получать доступ к внутренним данным объекта, поддерживающего протокол буфера, без копирования.
-
class memoryview(obj) -
Создать
memoryview, ссылающийся на obj. obj должен поддерживать протокол буфера. Встроенные объекты, поддерживающие протокол буфера, включаютbytesиbytearray.У
memoryviewесть понятие элемента, которое является атомарной единицей памяти, обрабатываемой исходным объектом obj. Для многих простых типов, таких какbytesиbytearray, элемент — это один байт, но другие типы, такие какarray.array, могут иметь более крупные элементы.len(view)равно длинеtolist. Еслиview.ndim = 0, длина равна 1. Еслиview.ndim = 1, длина равна числу элементов в представлении. Для многомерных представлений длина равна длине вложенного списка представления.Атрибут
itemsizeукажет вам количество байтов в одном элементе.A
memoryviewподдерживает срезы и индексирование для доступа к данным. Срезы одномерного типа приведут к подпредставлению:>>> v = memoryview(b'abcefg') >>> v[1] 98 >>> v[-1] 103 >>> v[1:4] <memory at 0x7f3ddc9f4350> >>> bytes(v[1:4]) b'bce'
Если
formatявляется одним из встроенных спецификаторов формата из модуляstruct, индексирование с целым числом или кортежем целых чисел также поддерживается и возвращает один элемент с правильным типом. Одномерные представления памяти можно индексировать целым числом или кортежем из одного целого числа. Многомерные представления памяти можно индексировать кортежами ровно ndim целых чисел, где ndim — количество измерений. Нульмерные представления памяти можно индексировать пустым кортежем.Вот пример с не байтовым форматом:
>>> import array >>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]Если базовый объект разрешён для записи, представление памяти поддерживает присваивание срезу одномерного типа. Изменение размера запрещено:
>>> data = bytearray(b'abcefg') >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b'z') >>> data bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data bytearray(b'z123fg') >>> v[2:3] = b'spam' Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b'spam' >>> data bytearray(b'z1spam')
Одномерные представления памяти с хэшируемыми (только для чтения) типами с форматами 'B', 'b' или 'c' также хэшируемы. Хэш определяется как
hash(m) == hash(m.tobytes()):>>> v = memoryview(b'abcefg') >>> hash(v) == hash(b'abcefg') True >>> hash(v[2:4]) == hash(b'ce') True >>> hash(v[::-2]) == hash(b'abcefg'[::-2]) True
Изменено в версии 3.3: Теперь одномерные представления памяти могут иметь срезы. Одномерные представления памяти с форматами 'B', 'b' или 'c' теперь хэшируемы.
Изменено в версии 3.4: Теперь представление памяти автоматически регистрируется с
collections.abc.SequenceИзменено в версии 3.5: Теперь представления памяти можно индексировать кортежем целых чисел.
memoryviewимеет несколько методов:-
__eq__(exporter) -
Представление памяти и экспортер PEP 3118 равны, если их формы эквивалентны и все соответствующие значения равны при интерпретации кодов формата соответствующих операндов с использованием синтаксиса
struct.Для подмножества строк формата
struct, которые в настоящее время поддерживаютсяtolist(),vиwравны, еслиv.tolist() == w.tolist():>>> import array >>> a = array.array('I', [1, 2, 3, 4, 5]) >>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array('b', [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() TrueЕсли ни одна из строк формата не поддерживается модулем
struct, то объекты всегда будут сравниваться как неравные (даже если строки формата и содержимое буфера идентичны):>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b FalseОбратите внимание, что, как и с числами с плавающей точкой,
v is wне подразумеваетv == wдля объектов memoryview.Изменено в версии 3.3: Предыдущие версии сравнивали сырую память, не учитывая формат элемента и логическую структуру массива.
-
tobytes(order=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), то они могут быть использованы взаимозаменяемо для индексации одной и той же записи словаря. (Однако следует учитывать, что поскольку компьютеры хранят числа с плавающей точкой как приближения, обычно не рекомендуется использовать их в качестве ключей словаря.)
Словари можно создать, поместив в фигурные скобки список пар ключей-значений, разделенных запятыми, например: {'jack': 4098, 'sjoerd': 4127} или {4098:
'jack', 4127: 'sjoerd'}, или с помощью конструктора dict.
-
class dict(**kwarg) -
class dict(mapping, **kwarg) -
class dict(iterable, **kwarg) -
Возвращает новый словарь, инициализированный из необязательного позиционного аргумента и, возможно, пустого набора именованных аргументов.
Словари могут быть созданы несколькими способами:
- Используйте список пар «ключ-значение» через запятую в фигурных скобках:
{'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}) >>> a == b == c == d == e 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() -
Возвращает новый вид элементов словаря (пары «ключ-значение»). См. документацию по объектам представления.
-
keys() -
Возвращает новый вид ключей словаря. См. документацию по объектам представления.
-
pop(key[, default]) -
Если key находится в словаре, удаляет его и возвращает его значение, иначе возвращает default. Если default не задан, а key отсутствует в словаре, возникает
KeyError.
-
popitem() -
Удаляет и возвращает пару «ключ-значение» из словаря. Пары возвращаются в порядке 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
Словари сравниваются как равные только в том случае, если они имеют одинаковые пары «ключ-значение» (независимо от порядка). Сравнения порядка (‘<’, ‘<=’, ‘>=’, ‘>’) вызывают
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)) в словаре.Ключи и значения перебираются в порядке вставки. Это позволяет создавать пары «ключ-значение» с помощью
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: Представления словарей теперь обратимы.
Представления ключей похожи на множества, так как их записи уникальны и хешируемы. Если все значения хешируемы, так что пары «ключ-значение» также уникальны и хешируемы, то представление пар «ключ-значение» также подобно множеству. (Представления значений не рассматриваются как множества, так как записи обычно не уникальны.) Для представлений, подобных множествам, доступны все операции, определенные для абстрактного базового класса 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 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. По сравнению с накладными расходами на настройку контекста выполнения, накладные расходы на один поиск в словаре класса ничтожны.
Другие встроенные типы
Интерпретатор поддерживает несколько других типов объектов. Большинство из них поддерживают только одну или две операции.
Модули
Единственная специальная операция над модулем — доступ к атрибуту: 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»). Не существует алгоритма, который может преобразовать строку в двоичное целое число или двоичное целое число в строку за линейное время, если основание не является степенью 2. Даже лучшие известные алгоритмы для основания 10 имеют подквадратичную сложность. Преобразование большого значения, такого как int('1' *
500_000), может занять более секунды на быстром процессоре.
Ограничение размера преобразования предлагает практический способ избежать CVE-2020-10735.
Ограничение применяется к количеству символов цифр в входной или выходной строке, когда используется нелинейный алгоритм преобразования. Подчеркивания и знаки не учитываются при подсчёте.
При превышении ограничения генерируется исключение ValueError:
>>> import sys
>>> sys.set_int_max_str_digits(4300) # Illustrative, this is the default.
>>> _ = int('2' * 5432)
Traceback (most recent call last):
...
ValueError: Exceeds the limit (4300) 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.8.14.
Затронутые API
Ограничение применяется только к потенциально медленным преобразованиям между int и str или bytes:
-
int(string)с основанием по умолчанию 10. -
int(string, base)для всех оснований, не являющихся степенями двойки. -
str(integer). repr(integer)- любое другое преобразование строки в основание 10, например
f"{integer}","{}".format(integer), илиb"%d" % integer.
Ограничения не применяются к функциям с линейным алгоритмом:
-
int(string, base)с основанием 2, 4, 8, 16 или 32. -
int.from_bytes()иint.to_bytes(). -
hex(),oct(),bin(). - Форматное мини-язык для шестнадцатеричных, восьмеричных и двоичных чисел.
-
strвfloat. -
strвdecimal.Decimal.
Настройка ограничения
Перед запуском Python вы можете использовать переменную среды или флаг командной строки интерпретатора для настройки ограничения:
-
PYTHONINTMAXSTRDIGITS, например,PYTHONINTMAXSTRDIGITS=640 python3для установки ограничения на 640 илиPYTHONINTMAXSTRDIGITS=0 python3для отключения ограничения. -
-X int_max_str_digits, например,python3 -X int_max_str_digits=640 -
sys.flags.int_max_str_digitsсодержит значениеPYTHONINTMAXSTRDIGITSили-X int_max_str_digits. Если обе переменные среды и-Xпараметр командной строки установлены,-Xимеет приоритет. Значение -1 указывает, что оба не были установлены, поэтому значениеsys.int_info.default_max_str_digitsиспользовалось при инициализации.
Из кода вы можете получить текущее ограничение и установить новое с помощью этих API sys:
-
sys.get_int_max_str_digits()иsys.set_int_max_str_digits()— это функции получения и установки ограничения для всего интерпретатора. У подинтерпретаторов есть свои ограничения.
Дополнительную информацию о значении по умолчанию и минимуме можно найти в sys.int_info:
-
sys.int_info.default_max_str_digits— ограничение по умолчанию, скомпилированное в интерпретатор. -
sys.int_info.str_digits_check_threshold— минимально допустимое значение ограничения (кроме 0, которое его отключает).
Добавлен в версии 3.8.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.8/library/stdtypes.html