Szukam minimalnych i maksymalnych wartości liczb całkowitych w pythonie. Na przykład w Javie mamy Integer.MIN_VALUEi Integer.MAX_VALUE. Czy jest coś takiego w Pythonie?
Zauważ, że w Pythonie 3 inttyp jest w zasadzie taki sam jak longw Pythonie 2, więc idea maksimum lub minimum intznika całkowicie. Jest to w zasadzie nieistotne nawet w Pythonie 2.
agf
8
@agf: może być odpowiedni na różne sposoby. Na przykład w dowolnym algorytmie, który wymaga zapisania znalezionej wartości minimalnej (np. Algorytm sortowania). Wartość minimalną można zainicjować na sys.maxint, aby zagwarantować, że każda znaleziona pierwsza wartość zostanie przyjęta jako min
Basile Perrenoud
@Toaster z wyjątkiem tego, że możesz mieć listę, na której wszystkie wartości są większe niż, sys.maxintponieważ jest to maksimum dla inttypu w Pythonie 2, do którego Python po cichu promuje long.
agf
29
Jeśli potrzebujesz użyć w algorytmie „bardzo dużej wartości”, np. Znajdowanie minimalnego lub maksymalnego zbioru ogólnego, float('inf')lub float('-inf')może to być bardzo pomocne.
W Pythonie 3 to pytanie nie ma zastosowania. Typ zwykły intjest nieograniczony.
Być może jednak szukasz informacji o rozmiarze słowa bieżącego tłumacza , który w większości przypadków będzie taki sam jak rozmiar słowa maszyny. Ta informacja jest nadal dostępna w Pythonie 3 as sys.maxsize, który jest maksymalną wartością reprezentowaną przez podpisane słowo. Odpowiednio jest to rozmiar największej możliwej sekwencji lub sekwencji w pamięci .
Zasadniczo maksymalna wartość reprezentowana przez niepodpisane słowo będzie sys.maxsize * 2 + 1, a liczba bitów w słowie będzie math.log2(sys.maxsize * 2 + 2). Zobacz tę odpowiedź, aby uzyskać więcej informacji.
Python 2
W Pythonie 2 maksymalna wartość zwykłych intwartości jest dostępna jako sys.maxint:
>>> sys.maxint9223372036854775807
Możesz obliczyć minimalną wartość za pomocą, -sys.maxint - 1jak pokazano tutaj .
Po przekroczeniu tej wartości Python płynnie przełącza się ze zwykłych na długie liczby całkowite. Więc przez większość czasu nie będziesz musiał tego wiedzieć.
Ta liczba może wydawać się dowolna, ale tak nie jest. 9223372036854775807 jest dokładnie 2^63 - 1, więc masz 64-bitową int. Ogólnie rzecz biorąc, n-bitowa liczba całkowita ma wartości od -2^(n-1)do 2^(n-1) - 1.
NullUserException
22
Zauważ, że jeśli używasz 32-bitowego środowiska wykonawczego Python, sys.maxint zwróci 2^31 - 1, nawet jeśli Python przejdzie do 64-bitowego bezproblemowo z longtypem danych.
Scott Stafford
19
Użyj sys.maxsizezamiast tego, zgodnie z sugestią @Akash Rana. Jest obecny także w Pythonie 2, jaksys mówią doktorzy . Dzięki temu kod będzie bardziej kompatybilny z obiema wersjami Pythona.
Ioannis Filippidis
6
Ty i ja mamy różne interpretacje tej linii niż dokumenty. Zamiennik w 2to3to szybka i brudna heurystyka, która przez większość czasu niczego nie zepsuje - ale różnica między tymi dwiema wartościami ma znaczenie. Najlepszą praktyką jest wykorzystanie wartości, którą faktycznie chcesz zastosować. Jeśli naprawdę potrzebujeszsys.maxint w Pythonie 2, nie będziesz go już potrzebować w Pythonie 3, i naprawdę powinien zostać całkowicie usunięty, a nie zmieniony na sys.maxsize.
senderle
3
minsize - Mnożenie przez Bitowy operator min daje minsize ~ sys.maxsize
om471987
238
Jeśli potrzebujesz tylko numeru większego niż wszystkie inne, możesz użyć
float('inf')
w podobny sposób liczba mniejsza niż wszystkie inne:
Tylko uwaga, że (jakkolwiek nie ma to znaczenia, ale nadal): float („inf”)> float („inf”) powoduje „false”. Nieskończona liczba powinna być większa niż inna nieskończona liczba :-D ... zaskoczy umysł
Scre
11
@ Scre Czego jeszcze byś się spodziewał? x > xjest zwykle Falsei nieskończoność nie powinna być wyjątkiem. ( float('NaN)z drugiej strony ...)
jamesdlin
6
W rzeczywistości nie dotyczy to intprzyczyny cannot convert infinite float to int... ale działa w większości przypadków
Leighton
5
Pamiętaj, że int('inf')to nie działa.
Tom Hale
3
To nie jest odpowiedź na pytanie OP
ghosh
225
sys.maxintStała została usunięta z Pythonem 3.0 naprzód, zamiast używać sys.maxsize.
Liczby całkowite
PEP 237: Zasadniczo długo przemianowano na int. Oznacza to, że istnieje tylko jeden wbudowany typ całkowy o nazwie int; ale zachowuje się głównie jak stary długi typ.
PEP 238: Wyrażenie takie jak 1/2 zwraca liczbę zmiennoprzecinkową. Użyj 1 // 2, aby uzyskać obcinanie. (Ta ostatnia składnia istnieje od lat, przynajmniej od Python 2.2.)
Stała sys.maxint została usunięta, ponieważ nie ma już limitu wartości całkowitych. Jednak sys.maxsize może być użyty jako liczba całkowita większa niż jakakolwiek praktyczna lista lub indeks łańcuchowy. Jest on zgodny z „naturalną” wielkością całkowitą implementacji i zazwyczaj jest taki sam jak sys.maxint we wcześniejszych wersjach na tej samej platformie (przy założeniu tych samych opcji kompilacji).
Reppr () długiej liczby całkowitej nie zawiera już końcowego L, więc kod, który bezwarunkowo usuwa ten znak, odetnie ostatnią cyfrę. (Zamiast tego użyj str ().)
Literały ósemkowe nie mają już formy 0720; zamiast tego użyj 0o720.
Poprawny. Rzeczywiście, od help(sys): maxsize - największa obsługiwana długość pojemników . To powinna być zaakceptowana odpowiedź.
Marco Sulla,
77
W Pythonie liczby całkowite automatycznie przełączają się z reprezentacji o stałym rozmiarze na intreprezentację o zmiennej szerokości longpo przekazaniu wartości sys.maxint, która w zależności od platformy wynosi 2 31–1 lub 2 63–1 . Zauważ, Lże dołącza się tutaj:
Liczby są tworzone za pomocą literałów numerycznych lub w wyniku wbudowanych funkcji i operatorów. Niezdobione literały całkowite (w tym liczby binarne, szesnastkowe i ósemkowe) dają zwykłe liczby całkowite, chyba że wartość, którą oznaczają, jest zbyt duża, aby można ją było przedstawić jako zwykłą liczbę całkowitą, w którym to przypadku dają długą liczbę całkowitą. Literały całkowite z przyrostkiem 'L'lub 'l'przyrostkiem dają długie liczby całkowite ( 'L'jest to preferowane, ponieważ 1lwygląda na zbyt jedenaście!).
Python bardzo stara się udawać, że jego liczby całkowite są liczbami matematycznymi i są nieograniczone. Może na przykład z łatwością obliczyć googol :
cóż, python 3 istnieje , na szczęście (!); ale sys.maxintnie istnieje w Pythonie 3 (tl; dr: " sys.maxintstała została usunięta (w python3), ponieważ nie ma już ograniczenia wartości liczb całkowitych. Jednak sys.maxsizemoże być używana jako liczba całkowita większa niż jakakolwiek praktyczna lista lub ciąg znaków index. " )
Michael
2
Po co tworzyć zmienne, które wbudowują cień, takie jak min()i max()?
RoadRunner - MSFT
1
Spójrz na komplement binarny 2
netskink
2
min = ~sys.maxsize
Andrew,
10
Możesz użyć „inf” w następujący sposób:
import math
bool_true =0< math.inf
bool_false =0<-math.inf
int
typ jest w zasadzie taki sam jaklong
w Pythonie 2, więc idea maksimum lub minimumint
znika całkowicie. Jest to w zasadzie nieistotne nawet w Pythonie 2.sys.maxint
ponieważ jest to maksimum dlaint
typu w Pythonie 2, do którego Python po cichu promujelong
.float('inf')
lubfloat('-inf')
może to być bardzo pomocne.Odpowiedzi:
Python 3
W Pythonie 3 to pytanie nie ma zastosowania. Typ zwykły
int
jest nieograniczony.Być może jednak szukasz informacji o rozmiarze słowa bieżącego tłumacza , który w większości przypadków będzie taki sam jak rozmiar słowa maszyny. Ta informacja jest nadal dostępna w Pythonie 3 as
sys.maxsize
, który jest maksymalną wartością reprezentowaną przez podpisane słowo. Odpowiednio jest to rozmiar największej możliwej sekwencji lub sekwencji w pamięci .Zasadniczo maksymalna wartość reprezentowana przez niepodpisane słowo będzie
sys.maxsize * 2 + 1
, a liczba bitów w słowie będziemath.log2(sys.maxsize * 2 + 2)
. Zobacz tę odpowiedź, aby uzyskać więcej informacji.Python 2
W Pythonie 2 maksymalna wartość zwykłych
int
wartości jest dostępna jakosys.maxint
:Możesz obliczyć minimalną wartość za pomocą,
-sys.maxint - 1
jak pokazano tutaj .Po przekroczeniu tej wartości Python płynnie przełącza się ze zwykłych na długie liczby całkowite. Więc przez większość czasu nie będziesz musiał tego wiedzieć.
źródło
2^63 - 1
, więc masz 64-bitową int. Ogólnie rzecz biorąc, n-bitowa liczba całkowita ma wartości od-2^(n-1)
do2^(n-1) - 1
.2^31 - 1
, nawet jeśli Python przejdzie do 64-bitowego bezproblemowo zlong
typem danych.sys.maxsize
zamiast tego, zgodnie z sugestią @Akash Rana. Jest obecny także w Pythonie 2, jaksys
mówią doktorzy . Dzięki temu kod będzie bardziej kompatybilny z obiema wersjami Pythona.2to3
to szybka i brudna heurystyka, która przez większość czasu niczego nie zepsuje - ale różnica między tymi dwiema wartościami ma znaczenie. Najlepszą praktyką jest wykorzystanie wartości, którą faktycznie chcesz zastosować. Jeśli naprawdę potrzebujeszsys.maxint
w Pythonie 2, nie będziesz go już potrzebować w Pythonie 3, i naprawdę powinien zostać całkowicie usunięty, a nie zmieniony nasys.maxsize
.Jeśli potrzebujesz tylko numeru większego niż wszystkie inne, możesz użyć
w podobny sposób liczba mniejsza niż wszystkie inne:
Działa to zarówno w Pythonie 2, jak i 3.
źródło
x > x
jest zwykleFalse
i nieskończoność nie powinna być wyjątkiem. (float('NaN)
z drugiej strony ...)int
przyczynycannot convert infinite float to int
... ale działa w większości przypadkówint('inf')
to nie działa.sys.maxint
Stała została usunięta z Pythonem 3.0 naprzód, zamiast używaćsys.maxsize
.Patrz: https://docs.python.org/3/whatsnew/3.0.html#integers
źródło
help(sys)
: maxsize - największa obsługiwana długość pojemników . To powinna być zaakceptowana odpowiedź.W Pythonie liczby całkowite automatycznie przełączają się z reprezentacji o stałym rozmiarze na
int
reprezentację o zmiennej szerokościlong
po przekazaniu wartościsys.maxint
, która w zależności od platformy wynosi 2 31–1 lub 2 63–1 . Zauważ,L
że dołącza się tutaj:Z podręcznika Python :
Python bardzo stara się udawać, że jego liczby całkowite są liczbami matematycznymi i są nieograniczone. Może na przykład z łatwością obliczyć googol :
źródło
long
nie jest podobny do Javylong
- jest raczej bliżejBigInteger
.L
sufiksu i po prostuint
nielong
ma znaczenia, jak duża jest ta liczba.Tak jest w przypadku Python 3
źródło
sys.maxint
nie istnieje w Pythonie 3 (tl; dr: "sys.maxint
stała została usunięta (w python3), ponieważ nie ma już ograniczenia wartości liczb całkowitych. Jednaksys.maxsize
może być używana jako liczba całkowita większa niż jakakolwiek praktyczna lista lub ciąg znaków index. " )min()
imax()
?min = ~sys.maxsize
Możesz użyć „inf” w następujący sposób:
Patrz: matematyka - funkcje matematyczne
źródło
math.inf
jest to odpowiednikfloat('inf')
Jeśli chcesz uzyskać maksimum dla indeksów tablic lub list (równoważne z
size_t
C / C ++), możesz użyć numpy:Jest to takie samo, ponieważ
sys.maxsize
zaletą jest to, że nie potrzebujesz do tego tylko systemu importu.Jeśli chcesz max dla natywnej int na komputerze:
Możesz zobaczyć inne dostępne typy w dokumencie .
Do pływaków można również użyć
sys.float_info.max
.źródło
W dużym stopniu polegam na takich poleceniach.
Max int zwrócone: 9223372036854775807
Aby uzyskać więcej odniesień do „sys”, powinieneś uzyskać dostęp
https://docs.python.org/3/library/sys.html
https://docs.python.org/3/library/sys.html#sys.maxsize
źródło