Максимальні та мінімальні значення для входів


744

Я шукаю мінімальні та максимальні значення для цілих чисел у python. Наприклад, у Java у нас є Integer.MIN_VALUEі Integer.MAX_VALUE. Чи є щось подібне в python?


14
Зауважте, що в Python 3 intтип в основному такий же, як і longв Python 2, тому ідея про максимум чи мінімум intповністю зникає. Це навіть не має значення навіть на Python 2.
agf

8
@agf: це може бути доречно різним чином. Наприклад, у будь-якому алгоритмі, який потребує збереження знайденого мінімального значення (як алгоритм сортування). Мінімальне значення може бути ініціалізовано на sys.maxint, тож воно гарантує, що будь-яке перше знайдене значення буде взято як min
Basile Perrenoud

@Toaster, за винятком того, що ви можете мати список, де всі значення перевищують, sys.maxintоскільки це лише максимум для intтипу на Python 2, який Python буде мовчки просувати до long.
agf

29
Якщо вам потрібно використовувати "дуже велике значення" в алгоритмі, наприклад, знайти мінімум або максимум загальної колекції, float('inf')або float('-inf')може бути дуже корисним.
геофф

Відповіді:


852

Пітон 3

У Python 3 це питання не стосується. Рівниковий intтип необмежений.

Однак ви, можливо, шукаєте інформацію про розмір слова поточного перекладача , який у більшості випадків буде таким же, як і розмір слова машини. Ця інформація все ще доступна в Python 3 as sys.maxsize, що є максимальним значенням, яке можна представити підписаним словом. Що рівно, це розмір найбільшого можливого списку або послідовності в пам'яті .

Як правило, максимальне значення, яке може бути представлене неподписаним словом, буде sys.maxsize * 2 + 1, і кількість бітів у слові буде math.log2(sys.maxsize * 2 + 2). Дивіться цю відповідь для отримання додаткової інформації.

Пітон 2

У Python 2 максимальне значення для простих intзначень доступне у вигляді sys.maxint:

>>> sys.maxint
9223372036854775807

Ви можете розрахувати мінімальне значення, -sys.maxint - 1як показано тут .

Після перевищення цього значення Python безперешкодно перемикається з простих на довгі цілі числа. Тому більшу частину часу вам не потрібно буде це знати.


177
Це число може здатися довільним, але це не так. 9223372036854775807 саме 2^63 - 1так, тож у вас 64-розрядний int. Загалом випадку , п-розрядний ціле число має значення в діапазоні від -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 bitwise дає minsize ~ sys.maxsize
om471987

238

Якщо вам просто потрібно число, яке більше, ніж усі інші, ви можете використовувати

float('inf')

аналогічно, кількість менша, ніж усі інші:

float('-inf')

Це працює як в python 2, так і в 3.


9
Просто примітка tho (як це не має значення, але все ж): float ('inf')> float ('inf') призводить до "false". Нескінченна кількість повинна бути більшою, ніж інша нескінченна кількість :-D ... розум знімається
Scre

11
@Scre Що ще ви очікували? x > xзазвичай False, і нескінченність не повинна бути винятком. ( float('NaN), з іншого боку ...)
jamesdlin

6
Це насправді не стосується intкашлю cannot convert infinite float to int... але працює в більшості випадків
Лейтон

5
Зверніть увагу, що int('inf')це не працює.
Том Хейл

3
Це не відповідь на питання ОП
привид

225

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

Цілі особи

  • PEP 237: По суті, довго перейменований на int. Тобто є лише один вбудований інтегральний тип, названий int; але він поводиться здебільшого як старий довгий тип.
  • 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
Правильно. Справді, з 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 дуже намагається зробити вигляд, що його цілі числа є математичними цілими числами і не є необмеженими. Наприклад, він може легко обчислити googol :

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

36
Для додавання плутанини, Python longне схожий на Java long- він досить близький BigInteger.
NullUserException

У python3, здається, немає Lсуфікса, і це просто int, ні long, незалежно від того, наскільки велика їх кількість.
Ерік Ван

39

Для Python 3 це так

import sys
max = sys.maxsize
min = -sys.maxsize - 1

3
python 3 не існує. см stackoverflow.com/questions/13795758 / ...
netskink

34
ну, python 3 існує , на щастя (!); але sys.maxintне існує в python 3 (tl; dr: " sys.maxintконстанта була видалена (у python3), оскільки немає більше обмеження на значення цілих чисел. Однак sys.maxsizeїї можна використовувати як ціле число, більше, ніж будь-який практичний список або рядок покажчик " )
Майкл

2
Навіщо створювати змінні, що тіньові вбудовані, такі як min()і max()?
RoadRunner - MSFT

1
Подивіться на бінарний комплімент 2
netskink

2
min = ~sys.maxsize
Андрій


5

Якщо ви хочете максимум для індексів масиву чи списку (еквівалентний size_tC / C ++), ви можете використовувати numpy:

np.iinfo(np.intp).max

Це те саме, що sys.maxsizeоднак перевагою є те, що для цього вам не потрібні системи імпорту.

Якщо ви хочете макс для рідного int на машині:

np.iinfo(np.intc).max

Ви можете переглянути інші доступні типи в док .

Для поплавків ви також можете використовувати 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-
Tony Suffolk 66,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.