Встроенные типы¶
В следующих разделах описываются стандартные типы, встроенные в интерпретатор.
Основными встроенными типами являются числа, последовательности, отображения, классы, экземпляры и исключения.
Некоторые классы коллекций являются мутабельными. Методы, которые добавляют, вычитают или переставляют местами свои члены и не возвращают конкретный элемент, никогда не возвращают сам экземпляр коллекции, а только 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
для false и 1
или True
для true, если не указано иное. (Важное исключение: булевы операции or
и and
всегда возвращают один из своих операндов).
Булевы операции — and
, or
, not
¶
Это булевы операции, упорядоченные по возрастанию приоритета:
Операция |
Результат |
Примечания |
---|---|---|
|
если x истинно, то x, иначе y |
(1) |
|
если x ложно, то x, иначе y |
(2) |
|
если x ложно, то |
(3) |
Примечания:
Это оператор короткого замыкания, поэтому он оценивает второй аргумент только в том случае, если первый равен false.
Это оператор короткого замыкания, поэтому он оценивает второй аргумент только в том случае, если первый истинен.
Оператор
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
, поддерживаются типами, которые являются iterable или реализуют метод __contains__()
.
Числовые типы — int
, float
, complex
¶
Существует три различных числовых типа: integers, floating point numbers и complex numbers. Кроме того, булевы числа являются подтипом целых чисел. Целые числа имеют неограниченную точность. Числа с плавающей точкой обычно реализуются с помощью double в языке C; информацию о точности и внутреннем представлении чисел с плавающей точкой для машины, на которой выполняется ваша программа, можно найти в sys.float_info
. Комплексные числа имеют действительную и мнимую части, каждая из которых является числом с плавающей точкой. Чтобы извлечь эти части из комплексного числа z, используйте z.real
и z.imag
. (В стандартную библиотеку входят дополнительные числовые типы fractions.Fraction
для рациональных чисел и decimal.Decimal
для чисел с плавающей точкой с задаваемой пользователем точностью).
Числа создаются с помощью числовых литералов или в результате работы встроенных функций и операторов. Целые литералы без украшений (включая шестнадцатеричные, восьмеричные и двоичные числа) дают целые числа. Числовые литералы, содержащие десятичную точку или знак экспоненты, дают числа с плавающей запятой. Добавление 'j'
или 'J'
к числовому литералу дает мнимое число (комплексное число с нулевой действительной частью), которое можно добавить к целому числу или числу с плавающей запятой, чтобы получить комплексное число с действительной и мнимой частями.
Python полностью поддерживает смешанную арифметику: когда двоичный арифметический оператор имеет операнды разных числовых типов, операнд с более «узким» типом расширяется до другого, где целое число узче плавающей точки, которая узче комплексного. Сравнение между числами разных типов ведет себя так, как будто сравниваются точные значения этих чисел. [2]
Конструкторы int()
, float()
и complex()
можно использовать для получения чисел определенного типа.
Все числовые типы (кроме комплексного) поддерживают следующие операции (приоритеты операций см. в Старшинство операторов):
Операция |
Результат |
Примечания |
Полная документация |
---|---|---|---|
|
сумма x и y |
||
|
разность x и y |
||
|
произведение x и y |
||
|
коэффициент от x и y |
||
|
колличество x и y с полом |
(1)(2) |
|
|
остаток от |
(2) |
|
|
x отрицается |
||
|
x без изменений |
||
|
абсолютное значение или величина x |
||
|
x преобразуется в целое число |
(3)(6) |
|
|
x преобразуется в плавающую точку |
(4)(6) |
|
|
комплексное число с действительной частью re, мнимой частью im. По умолчанию im равно нулю. |
(6) |
|
|
сопряжение комплексного числа c |
||
|
пара |
(2) |
|
|
x к мощности y |
(5) |
|
|
x к мощности y |
(5) |
Примечания:
Также называется целочисленным делением. Для операндов типа
int
результат имеет типint
. Для операндов типаfloat
результат имеет типfloat
. В общем случае результатом является целое число, хотя тип результата не обязательноint
. Результат всегда округляется в сторону минус бесконечности:1//2
- это0
,(-1)//2
- это-1
,1//(-2)
- это-1
, а(-1)//(-2)
- это0
.Не для комплексных чисел. Вместо этого преобразуйте в плавающие числа, используя
abs()
, если это необходимо.При преобразовании из
float
вint
происходит усечение, отбрасывается дробная часть. Альтернативные варианты преобразования см. в функцияхmath.floor()
иmath.ceil()
.float также принимает строки «nan» и «inf» с необязательным префиксом «+» или «-» для обозначения «не числа» (NaN) и положительной или отрицательной бесконечности.
Python определяет
pow(0, 0)
и0 ** 0
как1
, как это принято в языках программирования.В числовые литералы принимаются цифры от
0
до9
или любой эквивалент Unicode (кодовые точки со свойствомNd
).Полный список точек кода со свойством
Nd
см. в разделе the Unicode Standard.
Все типы numbers.Real
(int
и float
) также включают следующие операции:
Операция |
Результат |
---|---|
x усечено до |
|
x округляется до n цифр, округляя половину до четных. Если значение n опущено, по умолчанию оно равно 0. |
|
наибольший |
|
наименьший |
Дополнительные числовые операции описаны в модулях math
и cmath
.
Побитовые операции над целочисленными типами¶
Побитовые операции имеют смысл только для целых чисел. Результат побитовых операций вычисляется так, как если бы они выполнялись в двоичном дополнении с бесконечным числом знаковых битов.
Приоритеты двоичных побитовых операций ниже, чем числовых операций, и выше, чем сравнения; унарная операция ~
имеет тот же приоритет, что и другие унарные числовые операции (+
и -
).
В этой таблице перечислены побитовые операции, отсортированные по возрастанию приоритета:
Операция |
Результат |
Примечания |
---|---|---|
|
побитовое or из x и y |
(4) |
|
побитовое exclusive or из x и y |
(4) |
|
побитовое and из x и y |
(4) |
|
x сдвинуто влево на n бит |
(1)(2) |
|
x сдвинуто вправо на n бит |
(1)(3) |
|
инвертированные биты x |
Примечания:
Отрицательные значения сдвига недопустимы и приводят к появлению
ValueError
.Сдвиг влево на n бит эквивалентен умножению на
pow(2, n)
.Сдвиг вправо на n бит эквивалентен полу делению на
pow(2, n)
.Выполнение этих вычислений хотя бы с одним дополнительным битом расширения знака в конечном представлении двойки (ширина рабочего бита
1 + max(x.bit_length(), y.bit_length())
или больше) достаточно для получения того же результата, что и при наличии бесконечного числа битов знака.
Дополнительные методы для целочисленных типов¶
Тип int реализует numbers.Integral
abstract base class. Кроме того, он предоставляет еще несколько методов:
- int.bit_length()¶
Возвращает количество битов, необходимых для представления целого числа в двоичном виде, без учета знака и ведущих нулей:
>>> n = -37 >>> bin(n) '-0b100101' >>> n.bit_length() 6
Точнее, если
x
ненулевое, тоx.bit_length()
- единственное положительное целое числоk
такое, что2**(k-1) <= abs(x) < 2**k
. Эквивалентно, еслиabs(x)
достаточно мало, чтобы иметь правильно округленный логарифм, тоk = 1 + int(log(abs(x), 2))
. Еслиx
равен нулю, тоx.bit_length()
возвращает0
.Эквивалент:
def bit_length(self): s = bin(self) # binary representation: bin(-37) --> '-0b100101' s = s.lstrip('-0b') # remove leading zeros and minus sign return len(s) # len('100101') --> 6
Added in version 3.1.
- int.bit_count()¶
Возвращает количество единиц в двоичном представлении абсолютного значения целого числа. Это значение также известно как счетчик населения. Пример:
>>> n = 19 >>> bin(n) '0b10011' >>> n.bit_count() 3 >>> (-n).bit_count() 3
Эквивалент:
def bit_count(self): return bin(self).count("1")
Added in version 3.10.
- int.to_bytes(length=1, byteorder='big', *, signed=False)¶
Возвращает массив байтов, представляющих целое число.
>>> (1024).to_bytes(2, byteorder='big') b'\x04\x00' >>> (1024).to_bytes(10, byteorder='big') b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' >>> (-1024).to_bytes(10, byteorder='big', signed=True) b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' >>> x = 1000 >>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little') b'\xe8\x03'
Целое число представляется с помощью байтов length и по умолчанию равно 1. Если целое число не может быть представлено с помощью заданного количества байт, выдается сообщение
OverflowError
.Аргумент byteorder определяет порядок байтов, используемый для представления целого числа, и по умолчанию принимает значение
"big"
. Если byteorder равен"big"
, то старший байт находится в начале массива байтов. Если byteorder равен"little"
, то старший байт находится в конце массива байтов.Аргумент signed определяет, будет ли для представления целого числа использоваться дополнение двойки. Если значение signed равно
False
и задано отрицательное целое число, то будет выдано сообщениеOverflowError
. По умолчанию значение signed равноFalse
.Значения по умолчанию можно использовать для удобного преобразования целого числа в однобайтовый объект:
>>> (65).to_bytes() b'A'
Однако при использовании аргументов по умолчанию не пытайтесь преобразовать значение, превышающее 255, иначе вы получите ошибку
OverflowError
.Эквивалент:
def to_bytes(n, length=1, byteorder='big', signed=False): if byteorder == 'little': order = range(length) elif byteorder == 'big': order = reversed(range(length)) else: raise ValueError("byteorder must be either 'little' or 'big'") return bytes((n >> i*8) & 0xff for i in order)
Added in version 3.2.
Изменено в версии 3.11: Добавлены значения аргументов по умолчанию для
length
иbyteorder
.
- classmethod int.from_bytes(bytes, byteorder='big', *, signed=False)¶
Возвращает целое число, представленное заданным массивом байтов.
>>> int.from_bytes(b'\x00\x10', byteorder='big') 16 >>> int.from_bytes(b'\x00\x10', byteorder='little') 4096 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) -1024 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False) 64512 >>> int.from_bytes([255, 0, 0], byteorder='big') 16711680
Аргумент bytes должен быть либо bytes-like object, либо итерируемым числом, производящим байты.
Аргумент byteorder определяет порядок байтов, используемый для представления целого числа, и по умолчанию принимает значение
"big"
. Если byteorder равен"big"
, то старший байт находится в начале массива байтов. Если byteorder равен"little"
, то старший байт находится в конце массива байтов. Чтобы запросить собственный порядок байтов хост-системы, используйтеsys.byteorder
в качестве значения порядка байтов.Аргумент signed указывает, используется ли для представления целого числа дополнение двумя знаками.
Эквивалент:
def from_bytes(bytes, byteorder='big', signed=False): if byteorder == 'little': little_ordered = list(bytes) elif byteorder == 'big': little_ordered = list(reversed(bytes)) else: raise ValueError("byteorder must be either 'little' or 'big'") n = sum(b << i*8 for i, b in enumerate(little_ordered)) if signed and little_ordered and (little_ordered[-1] & 0x80): n -= 1 << 8*len(little_ordered) return n
Added in version 3.2.
Изменено в версии 3.11: Добавлено значение аргумента по умолчанию для
byteorder
.
- int.as_integer_ratio()¶
Возвращает пару целых чисел, отношение которых равно исходному целому числу и имеет положительный знаменатель. Отношение целых чисел (целых чисел) всегда равно целому числу в числителе и
1
в знаменателе.Added in version 3.8.
- int.is_integer()¶
Возвращает
True
. Существует для совместимости с типом уткиfloat.is_integer()
.Added in version 3.12.
Дополнительные методы на поплавке¶
Тип float реализует методы numbers.Real
abstract base class. float также имеет следующие дополнительные методы.
- float.as_integer_ratio()¶
Возвращает пару целых чисел, отношение которых в точности равно исходному float. Отношение выражается в наименьших членах и имеет положительный знаменатель. Вызывает
OverflowError
при бесконечности иValueError
при NaN.
- float.is_integer()¶
Возвращает
True
, если экземпляр float конечен с интегральным значением, иFalse
в противном случае:>>> (-2.0).is_integer() True >>> (3.2).is_integer() False
Два метода поддерживают преобразование в шестнадцатеричные строки и из них. Поскольку плавающие числа в Python хранятся как двоичные числа, преобразование плавающего числа в строку или из строки в десятичную систему счисления обычно сопровождается небольшой ошибкой округления. В отличие от этого, шестнадцатеричные строки позволяют точно представлять и указывать числа с плавающей точкой. Это может быть полезно при отладке и в численной работе.
- float.hex()¶
Возвращает представление числа с плавающей точкой в виде шестнадцатеричной строки. Для конечных чисел с плавающей точкой это представление всегда будет включать ведущую
0x
и последующуюp
и экспоненту.
- classmethod float.fromhex(s)¶
Метод класса, возвращающий float, представленный шестнадцатеричной строкой s. Строка s может содержать ведущие и последующие пробельные символы.
Обратите внимание, что float.hex()
- это метод экземпляра, а float.fromhex()
- метод класса.
Шестнадцатеричная строка имеет вид:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
где необязательный sign
может быть либо +
, либо -
, integer
и fraction
- строки шестнадцатеричных цифр, а exponent
- десятичное целое число с необязательным ведущим знаком. Регистр не имеет значения, и в целой или дробной части должна быть хотя бы одна шестнадцатеричная цифра. Этот синтаксис похож на синтаксис, указанный в разделе 6.4.4.2 стандарта C99, а также на синтаксис, используемый в Java 1.5 и далее. В частности, вывод float.hex()
можно использовать как шестнадцатеричный литерал с плавающей точкой в коде на C или Java, а шестнадцатеричные строки, создаваемые символом формата %a
в C или Double.toHexString
в Java, принимаются float.fromhex()
.
Обратите внимание, что экспонента записывается в десятичной, а не в шестнадцатеричной системе счисления, и что она дает силу 2, на которую нужно умножить коэффициент. Например, шестнадцатеричная строка 0x3.a7p10
представляет число с плавающей точкой (3 + 10./16 + 7./16**2) * 2.0**10
, или 3740.0
:
>>> float.fromhex('0x3.a7p10')
3740.0
Применение обратного преобразования к 3740.0
дает другую шестнадцатеричную строку, представляющую то же число:
>>> float.hex(3740.0)
'0x1.d380000000000p+11'
Хеширование числовых типов¶
Для чисел x
и y
, возможно, разных типов, требуется, чтобы hash(x) == hash(y)
всякий раз равнялся x == y
(подробнее см. документацию по методу __hash__()
). Для простоты реализации и эффективности работы с различными числовыми типами (включая int
, float
, decimal.Decimal
и fractions.Fraction
) хэш Python для числовых типов основан на одной математической функции, которая определена для любого рационального числа, а значит, применима ко всем экземплярам int
и fractions.Fraction
, а также ко всем конечным экземплярам float
и decimal.Decimal
. По сути, эта функция задается сокращением по модулю P
для фиксированного простого P
. Значение P
доступно в Python как атрибут modulus
в sys.hash_info
.
Детали реализации CPython: В настоящее время используется прайм P = 2**31 - 1
на машинах с 32-битным C longs и P = 2**61 - 1
на машинах с 64-битным C longs.
Вот подробные правила:
Если
x = m / n
- неотрицательное рациональное число, аn
не делится наP
, определитеhash(x)
какm * invmod(n, P) % P
, гдеinvmod(n, P)
- обратноеn
по модулюP
.Если
x = m / n
- неотрицательное рациональное число, аn
делится наP
(но не делится наm
), тоn
не имеет обратной величины по модулюP
и правило выше не применимо; в этом случае определитеhash(x)
как постоянную величинуsys.hash_info.inf
.Если
x = m / n
- отрицательное рациональное число, определитеhash(x)
как-hash(-x)
. Если полученный хэш равен-1
, замените его на-2
.Определенные значения
sys.hash_info.inf
и-sys.hash_info.inf
используются как хэш-значения для положительной бесконечности или отрицательной бесконечности (соответственно).Для числа
complex
z
хэш-значения действительной и мнимой частей объединяются путем вычисленияhash(z.real) + sys.hash_info.imag * hash(z.imag)
, уменьшенного по модулю2**sys.hash_info.width
так, чтобы оно лежало вrange(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))
. И снова, если результат равен-1
, он заменяется на-2
.
Чтобы пояснить вышеизложенные правила, приведем пример кода Python, эквивалентного встроенному хэшу, для вычисления хэша рационального числа float
или complex
:
import sys, math
def hash_fraction(m, n):
"""Compute the hash of a rational number m / n.
Assumes m and n are integers, with n positive.
Equivalent to hash(fractions.Fraction(m, n)).
"""
P = sys.hash_info.modulus
# Remove common factors of P. (Unnecessary if m and n already coprime.)
while m % P == n % P == 0:
m, n = m // P, n // P
if n % P == 0:
hash_value = sys.hash_info.inf
else:
# Fermat's Little Theorem: pow(n, P-1, P) is 1, so
# pow(n, P-2, P) gives the inverse of n modulo P.
hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
if m < 0:
hash_value = -hash_value
if hash_value == -1:
hash_value = -2
return hash_value
def hash_float(x):
"""Compute the hash of a float x."""
if math.isnan(x):
return object.__hash__(x)
elif math.isinf(x):
return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
else:
return hash_fraction(*x.as_integer_ratio())
def hash_complex(z):
"""Compute the hash of a complex number z."""
hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
# do a signed reduction modulo 2**sys.hash_info.width
M = 2**(sys.hash_info.width - 1)
hash_value = (hash_value & (M - 1)) -