Valori massimo e minimo per gli ints


745

Sto cercando valori minimi e massimi per numeri interi in Python. Ad esempio, in Java, abbiamo Integer.MIN_VALUEe Integer.MAX_VALUE. C'è qualcosa di simile in Python?


14
Si noti che in Python 3 il inttipo è sostanzialmente lo stesso del longtipo in Python 2, quindi l'idea di un massimo o minimo intscompare completamente. È praticamente irrilevante anche su Python 2.
Agf

8
@agf: può essere rilevante in vari modi. Ad esempio in qualsiasi algoritmo che richiede di salvare il valore minimo trovato (come un algoritmo di ordinamento). Il valore minimo potrebbe essere inizializzato su sys.maxint in modo da garantire che ogni primo valore trovato sia preso come min
Basile Perrenoud

@Toaster tranne che puoi avere un elenco in cui tutti i valori sono maggiori di sys.maxintpoiché è solo il massimo per il inttipo su Python 2, che Python promuoverà silenziosamente a long.
AGF

30
Se hai bisogno di usare "un valore molto grande" in un algoritmo, ad esempio trovare il minimo o il massimo di una raccolta generica, float('inf')o float('-inf')può essere molto utile.
Geoff,

1
Possibile duplicato di intervalli interi Python
Waldir Leoncio,

Risposte:


854

Python 3

In Python 3, questa domanda non si applica. Il inttipo normale non ha limiti.

Tuttavia, potresti effettivamente cercare informazioni sulla dimensione della parola dell'interprete corrente , che sarà la stessa dimensione della parola della macchina nella maggior parte dei casi. Tali informazioni sono ancora disponibili in Python 3 come sys.maxsize, che è il valore massimo rappresentabile da una parola firmata. Equivalentemente, è la dimensione dell'elenco o della sequenza in memoria più grande possibile .

Generalmente, il valore massimo rappresentabile da una parola senza segno sarà sys.maxsize * 2 + 1e il numero di bit in una parola sarà math.log2(sys.maxsize * 2 + 2). Vedi questa risposta per maggiori informazioni.

Python 2

In Python 2, il valore massimo per i intvalori semplici è disponibile come sys.maxint:

>>> sys.maxint
9223372036854775807

È possibile calcolare il valore minimo con -sys.maxint - 1come mostrato qui .

Python passa facilmente da interi semplici a lunghi una volta superato questo valore. Quindi la maggior parte delle volte non avrai bisogno di saperlo.


177
Questo numero può sembrare arbitrario, ma non lo è. 9223372036854775807 è esattamente 2^63 - 1, quindi hai un int a 64 bit. In generale, un intero n-bit ha valori che vanno da -2^(n-1)a 2^(n-1) - 1.
NullUserException

22
Si noti che se si utilizza un runtime Python a 32 bit, verrà restituito sys.maxint 2^31 - 1, anche se Python salterà a 64 bit senza interruzioni con il longtipo di dati.
Scott Stafford,

19
Usa sys.maxsizeinvece, come suggerito da @Akash Rana. È presente anche in Python 2, comesys dicono i documenti . Ciò renderà il codice più compatibile con entrambe le versioni di Python.
Ioannis Filippidis,

6
Tu ed io abbiamo interpretazioni diverse di quella linea dai documenti. La sostituzione 2to3è un'euristica rapida e sporca che non romperà nulla per la maggior parte del tempo, ma la differenza tra questi due valori è importante. La migliore pratica è usare il valore che intendi effettivamente usare. Se hai davvero bisogno sys.maxint di Python 2, non ne avrai più bisogno in Python 3 e dovrebbe essere rimosso completamente, non modificato in sys.maxsize.
mittente

3
minsize - Moltiplicando con l'operatore min Bitwise si ottiene minsize ~ sys.maxsize
om471987

238

Se hai solo bisogno di un numero più grande di tutti gli altri, puoi usarlo

float('inf')

in modo simile, un numero inferiore a tutti gli altri:

float('-inf')

Funziona sia con Python 2 che 3.


9
Solo una nota (per quanto irrilevante, ma comunque): float ('inf')> float ('inf') si traduce in 'false'. Il numero infinito dovrebbe essere maggiore di un altro numero infinito :-D ... scatta la mente
Scre

11
@Scre Cos'altro ti aspetteresti? x > xè di solito Falsee l'infinito non dovrebbe fare eccezione. (d' float('NaN)altra parte ...)
jamesdlin,

6
Questo in realtà non si applica al intcauze cannot convert infinite float to int... ma funziona nella maggior parte dei casi
Leighton,

5
Nota che int('inf')non funziona.
Tom Hale

4
Questa non è una risposta alla domanda del PO
ghosh,

225

La sys.maxintcostante è stata rimossa da Python 3.0 in poi, invece usa sys.maxsize.

Interi

  • PEP 237: essenzialmente, a lungo rinominato in int. Cioè, esiste un solo tipo integrale incorporato, chiamato int; ma si comporta principalmente come il vecchio tipo lungo.
  • PEP 238: un'espressione come 1/2 restituisce un valore a virgola mobile. Utilizzare 1 // 2 per ottenere il comportamento di troncamento. (Quest'ultima sintassi esiste da anni, almeno da Python 2.2.)
  • La costante sys.maxint è stata rimossa, poiché non esiste più un limite al valore di numeri interi. Tuttavia, sys.maxsize può essere utilizzato come numero intero più grande di qualsiasi elenco pratico o indice di stringa. È conforme alla dimensione intera "naturale" dell'implementazione ed è in genere uguale a sys.maxint nelle versioni precedenti sulla stessa piattaforma (presupponendo le stesse opzioni di generazione).
  • Il repr () di un intero lungo non include più la L finale, quindi il codice che rimuove incondizionatamente quel carattere taglierà invece l'ultima cifra. (Usa invece str ().)
  • I letterali ottali non sono più della forma 0720; utilizzare invece 0o720.

Consultare: https://docs.python.org/3/whatsnew/3.0.html#integers


1
Corretta. Infatti, da help(sys): maxsize - la più grande lunghezza supportata di contenitori . Questa dovrebbe essere la risposta accettata.
Marco Sulla

77

In Python gli interi passeranno automaticamente da una intrappresentazione a dimensione fissa a una rappresentazione a larghezza variabile una longvolta passato il valore sys.maxint, che è 2 31 - 1 o 2 63 - 1 a seconda della piattaforma. Si noti Lche viene aggiunto qui:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Dal manuale di Python :

I numeri sono creati da valori letterali numerici o come risultato di funzioni e operatori integrati. I letterali interi non ornati (compresi i numeri binari, esadecimali e ottali) producono numeri interi semplici a meno che il valore che indicano sia troppo grande per essere rappresentato come numero intero semplice, nel qual caso producono un numero intero lungo. I letterali interi con un 'L'o il 'l'suffisso producono numeri interi lunghi ( 'L'è preferibile perché 1lassomiglia troppo a undici!).

Python fa di tutto per fingere che i suoi numeri interi siano numeri matematici e non siano vincolati. Può, ad esempio, calcolare facilmente un googol :

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

36
Per aggiungere confusione, Python longnon è come Java, longma è più vicino BigInteger.
NullUserException

In python3, sembra che non ci sia Lsuffisso, ed è solo int, non longimporta, non importa quanto sia grande il numero.
Eric Wang,

39

Per Python 3 lo è

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


34
bene, python 3 esiste , per fortuna (!); ma sys.maxintnon esiste in python 3 (tl; dr: "la sys.maxintcostante è stata rimossa (in python3), poiché non esiste più un limite al valore di numeri interi. Tuttavia, sys.maxsizepuò essere utilizzato come numero intero più grande di qualsiasi elenco pratico o stringa indice. " )
michael

2
Perché creare variabili che ombreggiano i builtin come min()e max()?
RoadRunner - MSFT,

1
Cerca il binario del complimento di 2
netskink,

2
min = ~sys.maxsize
Andrew,


5

Se si desidera il massimo per gli indici di array o elenco (equivalente a size_tin C / C ++), è possibile utilizzare numpy:

np.iinfo(np.intp).max

Questo è lo stesso di sys.maxsize tuttavia il vantaggio è che non è necessario importare sys solo per questo.

Se si desidera max per int nativo sulla macchina:

np.iinfo(np.intc).max

Puoi guardare altri tipi disponibili in doc .

Per i galleggianti puoi anche usare sys.float_info.max.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.