Максимальные и минимальные значения для целых

748

Я ищу минимальные и максимальные значения для целых чисел в Python. Например, в Java у нас есть Integer.MIN_VALUEи Integer.MAX_VALUE. Есть ли что-то подобное в питоне?

bdhar
источник
14
Обратите внимание, что в Python 3 intтип в основном совпадает с longтипом в Python 2, поэтому идея максимума или минимума intполностью исчезает. Это в основном не имеет значения , даже на Python 2.
AGF
8
@agf: это может быть актуально по-разному. Например, в любом алгоритме, который требует сохранить найденное минимальное значение (например, алгоритм сортировки). Минимальное значение может быть инициализировано в sys.maxint, поэтому оно гарантирует, что любое первое найденное значение будет принято как минимальное
Basile Perrenoud
@Toaster, за исключением того, что у вас может быть список, в котором все значения больше, чем, sys.maxintтак как это только максимум для intтипа в Python 2, который Python будет молча рекламировать long.
AGF
30
Если вам нужно использовать «очень большое значение» в алгоритме, например, найти минимум или максимум общей коллекции, float('inf')или это float('-inf')может быть весьма полезно.
Джефф
1
Возможный дубликат целочисленных диапазонов Python
Waldir Leoncio

Ответы:

854

Python 3

В Python 3 этот вопрос не применяется. Простой intтип не ограничен.

Тем не менее, вы можете искать информацию о размере слова текущего интерпретатора , который в большинстве случаев будет равен размеру слова машины. Эта информация по-прежнему доступна в Python 3 as sys.maxsize, что является максимальным значением, представляемым словом со знаком. Эквивалентно, это размер максимально возможного списка или последовательности в памяти .

Как правило, максимальное значение, представляемое беззнаковым словом, будет равно sys.maxsize * 2 + 1количеству битов в слове math.log2(sys.maxsize * 2 + 2). Смотрите этот ответ для получения дополнительной информации.

Python 2

В Python 2 максимальное значение для простых intзначений доступно как sys.maxint:

>>> sys.maxint
9223372036854775807

Вы можете рассчитать минимальное значение с помощью, -sys.maxint - 1как показано здесь .

Python плавно переключается с простых на длинные целые числа, когда вы превышаете это значение. Так что большую часть времени вам не нужно будет это знать.

senderle
источник
177
Это число может показаться произвольным, но это не так. 9223372036854775807 точно 2^63 - 1, так что у вас есть 64-битный Int. Как правило, n-битное целое число имеет значения в диапазоне от -2^(n-1)до 2^(n-1) - 1.
NullUserException
22
Обратите внимание, что если вы используете 32-битную среду исполнения Python, sys.maxint вернется 2^31 - 1, даже если Python легко перейдет на 64-битную версию с типом longданных.
Скотт Стаффорд
19
Используйте sys.maxsizeвместо этого, как предложено @Akash Rana. Он присутствует также в Python 2, какsys говорят документы . Это сделает код более совместимым с обеими версиями Python.
Иоаннис Филиппидис
6
У нас с вами разные толкования этой строки из документов. Замена в 2to3это хорошая быстрая и грязная эвристика, которая ничего не сломит большую часть времени - но разница между этими двумя значениями имеет значение. Лучше всего использовать значение, которое вы на самом деле хотите использовать. Если вам действительно нужен sys.maxint Python 2, он вам больше не понадобится в Python 3, и он действительно должен быть полностью удален, а не заменен на sys.maxsize.
senderle
3
minsize - умножение с помощью побитового оператора min дает minsize ~ sys.maxsize
om471987 14.10.16
240

Если вам просто нужен номер, который больше, чем все остальные, вы можете использовать

float('inf')

аналогичным образом, число меньше, чем все остальные:

float('-inf')

Это работает как в Python 2 и 3.

Melle
источник
9
Просто примечание, которое (как бы это ни было неважно, но все же): float ('inf')> float ('inf') приводит к 'false'. Бесконечное число должно быть больше, чем другое бесконечное число :-D ...
Scre
11
@Scre Что еще вы ожидаете? x > xобычно False, и бесконечность не должна быть исключением. ( float('NaN)с другой стороны ...)
jamesdlin
6
Это на самом деле не относится к intCauze cannot convert infinite float to int... но работает в большинстве случаев
Лейтон
5
Обратите внимание, что int('inf')это не работает.
Том Хейл
4
Это не ответ на вопрос ОП
Гош
225

sys.maxintКонстанта была удалена из Python 3.0 вперед, вместо того, чтобы использовать sys.maxsize.

Целые

  • PEP 237: по сути, давно переименован в int. То есть существует только один встроенный тип с именем int; но он ведет себя в основном как старый тип long.
  • PEP 238: выражение типа 1/2 возвращает число с плавающей точкой. Используйте 1 // 2, чтобы получить усечение. (Последний синтаксис существует годами, по крайней мере, с Python 2.2.)
  • Константа sys.maxint была удалена, так как больше нет ограничения на значение целых чисел. Однако sys.maxsize можно использовать как целое число, большее, чем любой практический список или строковый индекс. Он соответствует «естественному» целочисленному размеру реализации и, как правило, совпадает с sys.maxint в предыдущих выпусках на той же платформе (при условии, что используются те же параметры сборки).
  • Repr () длинного целого больше не включает в себя завершающий L, поэтому код, который безоговорочно удаляет этот символ, вместо этого отсекает последнюю цифру. (Вместо этого используйте str ().)
  • Восьмеричные литералы больше не имеют форму 0720; вместо этого используйте 0o720.

См. Https://docs.python.org/3/whatsnew/3.0.html#integers.

Акаш Рана
источник
1
Правильный. Действительно, from help(sys): maxsize - наибольшая поддерживаемая длина контейнеров . Это должен быть принятый ответ.
Марко Сулла,
77

В Python целые числа будут автоматически переключаться из представления фиксированного размера в intпредставление переменной ширины, как longтолько вы передадите значение sys.maxint, которое равно 2 31 - 1 или 2 63 - 1, в зависимости от вашей платформы. Обратите внимание, Lчто здесь добавлено:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Из руководства по Python :

Числа создаются числовыми литералами или в результате встроенных функций и операторов. Неукрашенные целочисленные литералы (включая двоичные, шестнадцатеричные и восьмеричные числа) дают простые целые числа, если только значение, которое они обозначают, не слишком велико, чтобы быть представленным в виде простого целого числа, и в этом случае они дают длинное целое число. Целочисленные литералы с суффиксом 'L'или 'l'приводят к длинным целым числам ( 'L'желательно, потому что 1lвыглядит слишком похоже на одиннадцать!).

Python очень старается притвориться, что его целые числа являются математическими и неограниченными. Например, он может легко вычислить гугол :

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
Джон Кугельман
источник
37
Чтобы добавить к путанице, Python longне похож на Java long- он скорее ближе BigInteger.
NullUserException
В python3, кажется, нет Lсуффикса, и это просто int, нет long, независимо от того, насколько большое число.
Эрик Ван
39

Для Python 3 это

import sys
max = sys.maxsize
min = -sys.maxsize - 1
netskink
источник
3
питон 3 не существует см. stackoverflow.com/questions/13795758/…
netskink
34
ну, к счастью , Python 3 существует (!); но sys.maxintне существует в python 3 (tl; dr: " sys.maxintконстанта была удалена (в python3), так как больше нет ограничения на значение целых чисел. Однако, sys.maxsizeможет использоваться как целое число, большее, чем любой практический список или строка index. " )
Майкл
3
Зачем создавать переменные, которые создают тени, такие как min()и max()?
RoadRunner - MSFT
1
Посмотрите бинарный комплимент 2
netskink
2
min = ~sys.maxsize
Андрей
5

Если вы хотите получить максимум для индексов массива или списка (эквивалентно size_tC / C ++), вы можете использовать numpy:

np.iinfo(np.intp).max

Это так же как sys.maxsize преимущество в том, что вам не нужно импортировать sys только для этого.

Если вы хотите max для родного int на машине:

np.iinfo(np.intc).max

Вы можете посмотреть другие доступные типы в doc. .

Для поплавков вы также можете использовать sys.float_info.max.

Шиталь шах
источник
2

Я сильно полагаюсь на такие команды.

python -c 'import sys; print(sys.maxsize)'

Макс int вернулся: 9223372036854775807

Для получения дополнительных ссылок на 'sys' вы должны получить доступ

https://docs.python.org/3/library/sys.html

https://docs.python.org/3/library/sys.html#sys.maxsize

Вендер
источник
1
Нет - maxsize - это просто максимально возможный индекс контейнера. Python с радостью будет работать с 100-значными и более целыми числами
Тони Саффолк 66