Python >> Tutoriel Python >  >> Python

Comment rendre un entier plus grand que n'importe quel autre entier en Python ?

Cet article traite d'une situation où vous devez implémenter un entier objet qui, lorsqu'il est comparé à l'aide de l'opérateur supérieur à > , à toute autre valeur entière existante dans le programme, renverra toujours True .

Avant de plonger dans les solutions possibles, nous devons prendre note de ce qui suit :

Python 2 se compose de entiers simples et entiers longs. Cependant, en Python 3, les entiers simples et longs ont été fusionnés, et l'entier en python 3 est le même que long en python 2. Par conséquent, une valeur entière n'a pas de limites maximales et minimales en python 3.

value1=9223372036854775807
print("value1=",value1)
print(type(value1))

value2=value1+1
print("value2=",value2)
print(type(value2))

Sortie en Python 2 :

value1= 9223372036854775807
<type 'int'>
value2= 9223372036854775808L
<type 'long'> 

Sortie en Python 3 :

value1= 9223372036854775807                                                                                                  
<class 'int'>                                                                                                                
value2= 9223372036854775808                                                                                                  
<class 'int'>  

Remarque :

Dans un environnement 64 bits, la constante sys.maxint renvoie la valeur entière maximale possible en python2 qui est "9223372036854775807". Tout ce qui est supérieur à cette valeur sera automatiquement converti en un type long. Cependant, la constante sys.maxint a été supprimée en python3 car il n'y a plus de limite à la valeur des entiers. En Python 3, sys.maxsize peut être utilisé comme un entier plus grand que n'importe quelle autre liste pratique ou index de chaîne dans un programme. La valeur renvoyée par la constante sys.maxsize dépend du système/de la plate-forme sur laquelle elle est exécutée. Cela signifie que pour une plateforme 32 bits, la valeur serait 2**31 – 1 =2147483647, alors que sur une plate-forme 64 bits, la valeur serait 2**63 – 1=9223372036854775807.

Voyons maintenant comment nous pouvons utiliser la plus grande valeur entière dans notre programme :

Méthode 1 :Utiliser une classe personnalisée 

Tout en python est un "Objet". De plus, les entiers en python3 n'ont pas de limites. Ainsi, il est sûr de dire que les entiers en python sont des objets sans limites maximales et minimales. Par conséquent, une solution de contournement probable pour notre énoncé de problème consiste à créer une classe personnalisée et à renvoyer un objet qui serait supérieur à tout autre objet du programme.

import functools
import sys

@functools.total_ordering
class AlwaysGreater(object):
    def __le__(self, other):
        return False

class MaximumInteger(AlwaysGreater, int):
    def __repr__(self):
        return 'MaximumInteger()'    
 
obj=MaximumInteger()
print(isinstance(obj,int))
print("1. Is obj greater than sys.maxsize?",obj > sys.maxsize)
print("2. Sorting list: [100,0,obj,922337036854775808,sys.maxsize] in ascending order: ")
print(sorted([100,0,obj,9223372036854775808,sys.maxsize]))

Sortie :

True
1. Is obj greater than sys.maxsize? True                                                                                     
2. Sorting list: [100,0,obj,922337036854775808,sys.maxsize] in ascending order:                                              
[0, 100, 9223372036854775807, 9223372036854775808, MaximumInteger()]

Méthode 2 :Utilisation de Python Infinity

L'infini positif en python est un nombre indéfini supérieur à toute autre valeur du programme. Pour représenter n'importe quel nombre dans un programme qui est supérieur à tous les autres nombres du programme, nous pouvons utiliser le python Infinity.

Le code suivant représente le concept ci-dessus :

import sys
value=float('Inf')
print("1. Is value greater sys.maxsize? :",value>sys.maxsize)
print("2. Sorting list: [100,0,value,922337036854775808,sys.maxsize] in ascending order: ")
print(sorted([100,0,value,9223372036854775808,sys.maxsize]))

Sortie :

1. Is value greater sys.maxsize? : True                                                                                      
2. Sorting list: [100,0,value,922337036854775808,sys.maxsize] in ascending order:                                            
[0, 100, 9223372036854775807, 9223372036854775808, inf]

Avis de non-responsabilité : Pour l'instant, il n'y a aucun moyen de représenter l'infini en python sous la forme d'une valeur entière. Cependant, puisque les valeurs flottantes python peuvent être utilisées pour représenter un entier infini. Par conséquent, int(float('Inf')) conduira à OverflowError :impossible de convertir l'infini flottant en entier.

Vous pouvez en savoir plus sur python infinity ici.

Méthode 3 :Utiliser infinity.Infinity 

Une autre solution pour obtenir la plus grande valeur entière consiste à utiliser la valeur infinie tout-en-un de Konsta Vesterinen pour Python qui peut être comparée à n'importe quel objet. Le seul problème avec cette méthode est qu'elle n'hérite pas de int. Pour surmonter ce problème, nous pouvons créer une sous-classe puis la faire hériter de int comme indiqué ci-dessous :

from infinity import Infinity
import sys

class IntInfinity(Infinity, int):
  pass

print(isinstance(IntInfinity(), int))
obj = IntInfinity()
print("1. Is obj greater than sys.maxsize?", obj > sys.maxsize)
print("2. Sorting list: [100,0,obj,922337036854775808,sys.maxsize] in ascending order: ")
print(sorted([100, 0,obj, 9223372036854775808, sys.maxsize]))

Sortie :

True
1. Is obj greater than sys.maxsize? True
2. Sorting list: [100,0,obj,922337036854775808,sys.maxsize] in ascending order:
[0, 100, 2147483647, 9223372036854775808, inf]

Conclusion

Il est important de noter que les entiers en python sont illimités. Même les valeurs de sys.maxsize dépendent de la plate-forme sur laquelle elles sont exécutées, comme mentionné précédemment. Cela signifie que sys.maxsize + 1> sys.maxsize. Les méthodes proposées sont des solutions de contournement probables pour rendre un entier plus grand que tout autre entier du programme.

J'espère que vous avez trouvé cet article de blog utile et qu'il vous a aidé. Restez à l'écoute pour les futures mises à jour.