Je recherche des valeurs minimales et maximales pour les entiers en python. Par exemple, en Java, nous avons Integer.MIN_VALUEet Integer.MAX_VALUE. Y a-t-il quelque chose comme ça en python?
Notez que dans Python 3, le inttype est fondamentalement le même que le longtype dans Python 2, donc l'idée d'un maximum ou d'un minimum intdisparaît complètement. C'est fondamentalement hors de propos même sur Python 2.
agf
8
@agf: il peut être pertinent de différentes manières. Par exemple, dans tout algorithme qui nécessite de sauvegarder la valeur min trouvée (comme un algorithme de tri). La valeur min peut être initialisée à sys.maxint afin de garantir que toute première valeur trouvée est prise en min
Basile Perrenoud
@Toaster sauf que vous pouvez avoir une liste où toutes les valeurs sont supérieures sys.maxintcar ce n'est que le maximum pour le inttype sur Python 2, que Python promouvra silencieusement en a long.
agf
30
Si vous devez utiliser "une très grande valeur" dans un algorithme, par exemple trouver le minimum ou le maximum d'une collection générique, float('inf')ou float('-inf')peut être très utile.
En Python 3, cette question ne s'applique pas. Le inttype simple est illimité.
Cependant, vous pourriez en fait rechercher des informations sur la taille de mot de l'interpréteur actuel , qui sera la même que la taille de mot de la machine dans la plupart des cas. Ces informations sont toujours disponibles dans Python 3 as sys.maxsize, qui est la valeur maximale représentable par un mot signé. De manière équivalente, c'est la taille de la plus grande liste possible ou séquence en mémoire .
Généralement, la valeur maximale représentable par un mot non signé sera sys.maxsize * 2 + 1, et le nombre de bits dans un mot sera math.log2(sys.maxsize * 2 + 2). Voir cette réponse pour plus d'informations.
Python 2
En Python 2, la valeur maximale pour les intvaleurs simples est disponible sous la forme sys.maxint:
>>> sys.maxint
9223372036854775807
Vous pouvez calculer la valeur minimale avec -sys.maxint - 1comme indiqué ici .
Python passe de manière transparente de simples entiers longs à une fois que vous dépassez cette valeur. La plupart du temps, vous n'aurez donc pas besoin de le savoir.
Ce nombre peut sembler arbitraire, mais ce n'est pas le cas. 9223372036854775807 est exactement 2^63 - 1, vous avez donc un int 64 bits. En général, un entier de n bits a des valeurs allant de -2^(n-1)à 2^(n-1) - 1.
NullUserException
22
Notez que si vous utilisez un runtime Python 32 bits, sys.maxint reviendra 2^31 - 1, même si Python passera à 64 bits de manière transparente avec le longtype de données.
Scott Stafford
19
Utilisez sys.maxsizeplutôt, comme suggéré par @Akash Rana. Il est également présent dans Python 2, comme lesys disent les documents . Cela rendra le code plus compatible avec les deux versions de Python.
Ioannis Filippidis
6
Vous et moi avons des interprétations différentes de cette ligne des documents. Le remplacement 2to3est une fine heuristique rapide et sale qui ne cassera rien la plupart du temps - mais la différence entre ces deux valeurs est importante. La meilleure pratique consiste à utiliser la valeur que vous souhaitez réellement utiliser. Si vous en avez vraiment besoinsys.maxint en Python 2, vous n'en aurez plus besoin en Python 3, et il devrait vraiment être entièrement supprimé, pas changé en sys.maxsize.
senderle
3
minsize - La multiplication avec l'opérateur min au niveau du bit donne minsize ~ sys.maxsize
om471987
240
Si vous avez juste besoin d'un nombre plus grand que tous les autres, vous pouvez utiliser
float('inf')
de façon similaire, un nombre plus petit que tous les autres:
Juste une note (comme non pertinente, mais quand même): float ('inf')> float ('inf') donne 'false'. Le nombre infini devrait être plus grand qu'un autre nombre infini :-D ... snaps d'esprit
Scre
11
@Scre À quoi d'autre vous attendriez-vous? x > xest généralement False, et l'infini ne devrait pas faire exception. ( float('NaN), d'autre part ...)
jamesdlin
6
En fait, cela ne s'applique pas à la intgaze cannot convert infinite float to int... mais fonctionne dans la plupart des cas
Leighton
5
Notez que int('inf')cela ne fonctionne pas.
Tom Hale
4
Ce n'est pas une réponse à la question OP
ghosh
225
La sys.maxintconstante a été supprimée de Python 3.0, utilisez plutôt sys.maxsize.
Entiers
PEP 237: Essentiellement, renommé depuis longtemps en int. Autrement dit, il n'y a qu'un seul type intégral intégré, nommé int; mais il se comporte principalement comme l'ancien type long.
PEP 238: Une expression comme 1/2 renvoie un flottant. Utilisez 1 // 2 pour obtenir le comportement de troncature. (Cette dernière syntaxe existe depuis des années, au moins depuis Python 2.2.)
La constante sys.maxint a été supprimée, car il n'y a plus de limite à la valeur des entiers. Cependant, sys.maxsize peut être utilisé comme un entier plus grand que n'importe quelle liste pratique ou index de chaîne. Il est conforme à la taille entière «naturelle» de l'implémentation et est généralement le même que sys.maxint dans les versions précédentes sur la même plate-forme (en supposant les mêmes options de construction).
Le repr () d'un entier long n'inclut plus le L de fin, donc le code qui supprime inconditionnellement ce caractère coupera le dernier chiffre à la place. (Utilisez plutôt str ().)
Les littéraux octaux ne sont plus de la forme 0720; utilisez plutôt 0o720.
Correct. En effet, à partir de help(sys): maxsize - la plus grande longueur prise en charge des conteneurs . Ce devrait être la réponse acceptée.
Marco Sulla
77
En Python, les entiers passeront automatiquement d'une intreprésentation de taille fixe à une longreprésentation de largeur variable une fois que vous aurez passé la valeur sys.maxint, qui est soit 2 31 - 1 ou 2 63 - 1 selon votre plateforme. Remarquez ce Lqui est ajouté ici:
Les nombres sont créés par des littéraux numériques ou à la suite de fonctions et d'opérateurs intégrés. Les littéraux entiers non ornés (y compris les nombres binaires, hexadécimaux et octaux) donnent des entiers simples sauf si la valeur qu'ils dénotent est trop grande pour être représentée comme un entier simple, auquel cas ils donnent un entier long. Les littéraux entiers avec un suffixe 'L'ou 'l'produisent des entiers longs ( 'L'est préférable car il 1lressemble trop à onze!).
Python essaie très fort de prétendre que ses entiers sont des entiers mathématiques et sont illimités. Il peut, par exemple, calculer facilement un googol :
eh bien, python 3 existe , heureusement (!); mais sys.maxintn'existe pas en python 3 (tl; dr: "la sys.maxintconstante a été supprimée (en python3), car il n'y a plus de limite à la valeur des entiers. Cependant, sys.maxsizepeut être utilisé comme un entier plus grand que n'importe quelle liste ou chaîne pratique index. " )
michael
3
Pourquoi créer des variables qui masquent les fonctions intégrées telles que min()et max()?
RoadRunner - MSFT
1
Cherchez le compliment binaire de 2
netskink
2
min = ~sys.maxsize
Andrew
10
Vous pouvez utiliser 'inf' comme ceci:
import math
bool_true =0< math.inf
bool_false =0<-math.inf
No - maxsize est simplement le plus grand index de conteneur possible. Python fonctionnera avec plaisir avec des nombres entiers à 100 chiffres et plus
int
type est fondamentalement le même que lelong
type dans Python 2, donc l'idée d'un maximum ou d'un minimumint
disparaît complètement. C'est fondamentalement hors de propos même sur Python 2.sys.maxint
car ce n'est que le maximum pour leint
type sur Python 2, que Python promouvra silencieusement en along
.float('inf')
oufloat('-inf')
peut être très utile.Réponses:
Python 3
En Python 3, cette question ne s'applique pas. Le
int
type simple est illimité.Cependant, vous pourriez en fait rechercher des informations sur la taille de mot de l'interpréteur actuel , qui sera la même que la taille de mot de la machine dans la plupart des cas. Ces informations sont toujours disponibles dans Python 3 as
sys.maxsize
, qui est la valeur maximale représentable par un mot signé. De manière équivalente, c'est la taille de la plus grande liste possible ou séquence en mémoire .Généralement, la valeur maximale représentable par un mot non signé sera
sys.maxsize * 2 + 1
, et le nombre de bits dans un mot seramath.log2(sys.maxsize * 2 + 2)
. Voir cette réponse pour plus d'informations.Python 2
En Python 2, la valeur maximale pour les
int
valeurs simples est disponible sous la formesys.maxint
:Vous pouvez calculer la valeur minimale avec
-sys.maxint - 1
comme indiqué ici .Python passe de manière transparente de simples entiers longs à une fois que vous dépassez cette valeur. La plupart du temps, vous n'aurez donc pas besoin de le savoir.
la source
2^63 - 1
, vous avez donc un int 64 bits. En général, un entier de n bits a des valeurs allant de-2^(n-1)
à2^(n-1) - 1
.2^31 - 1
, même si Python passera à 64 bits de manière transparente avec lelong
type de données.sys.maxsize
plutôt, comme suggéré par @Akash Rana. Il est également présent dans Python 2, comme lesys
disent les documents . Cela rendra le code plus compatible avec les deux versions de Python.2to3
est une fine heuristique rapide et sale qui ne cassera rien la plupart du temps - mais la différence entre ces deux valeurs est importante. La meilleure pratique consiste à utiliser la valeur que vous souhaitez réellement utiliser. Si vous en avez vraiment besoinsys.maxint
en Python 2, vous n'en aurez plus besoin en Python 3, et il devrait vraiment être entièrement supprimé, pas changé ensys.maxsize
.Si vous avez juste besoin d'un nombre plus grand que tous les autres, vous pouvez utiliser
de façon similaire, un nombre plus petit que tous les autres:
Cela fonctionne à la fois en python 2 et 3.
la source
x > x
est généralementFalse
, et l'infini ne devrait pas faire exception. (float('NaN)
, d'autre part ...)int
gazecannot convert infinite float to int
... mais fonctionne dans la plupart des casint('inf')
cela ne fonctionne pas.La
sys.maxint
constante a été supprimée de Python 3.0, utilisez plutôtsys.maxsize
.Voir: https://docs.python.org/3/whatsnew/3.0.html#integers
la source
help(sys)
: maxsize - la plus grande longueur prise en charge des conteneurs . Ce devrait être la réponse acceptée.En Python, les entiers passeront automatiquement d'une
int
représentation de taille fixe à unelong
représentation de largeur variable une fois que vous aurez passé la valeursys.maxint
, qui est soit 2 31 - 1 ou 2 63 - 1 selon votre plateforme. Remarquez ceL
qui est ajouté ici:Depuis le manuel Python :
Python essaie très fort de prétendre que ses entiers sont des entiers mathématiques et sont illimités. Il peut, par exemple, calculer facilement un googol :
la source
long
n'est pas comme Javalong
- il est plutôt plus procheBigInteger
.L
suffixe, et c'est justeint
, nonlong
, peu importe la taille du nombre.Pour Python 3, c'est
la source
sys.maxint
n'existe pas en python 3 (tl; dr: "lasys.maxint
constante a été supprimée (en python3), car il n'y a plus de limite à la valeur des entiers. Cependant,sys.maxsize
peut être utilisé comme un entier plus grand que n'importe quelle liste ou chaîne pratique index. " )min()
etmax()
?min = ~sys.maxsize
Vous pouvez utiliser 'inf' comme ceci:
Refer: math - Fonctions mathématiques
la source
math.inf
équivaut àfloat('inf')
Si vous voulez le maximum pour les index de tableau ou de liste (équivalent à
size_t
C / C ++), vous pouvez utiliser numpy:C'est la même chose que
sys.maxsize
mais l'avantage est que vous n'avez pas besoin d'importer sys juste pour cela.Si vous voulez max pour native int sur la machine:
Vous pouvez consulter d'autres types disponibles dans la doc .
Pour les flotteurs, vous pouvez également utiliser
sys.float_info.max
.la source
Je compte beaucoup sur des commandes comme celle-ci.
Int max renvoyé: 9223372036854775807
Pour plus de références pour 'sys', vous devriez accéder
https://docs.python.org/3/library/sys.html
https://docs.python.org/3/library/sys.html#sys.maxsize
la source