Python >> Tutoriel Python >  >> Python

Fonction Python hex() - Pas un tour de magie

hex(integer) intégré de Python la fonction prend un argument entier et renvoie une chaîne hexadécimale avec le préfixe "0x" . Si vous appelez le hex(x) sur un x non entier , il doit définir le __index__() méthode qui renvoie un entier associé à x . Sinon, il lancera un TypeError: object cannot be interpreted as an integer .

Argumentation integer Une valeur entière ou un objet implémentant le __index__() méthode.
Valeur de retour string Renvoie une chaîne de nombres octaux, préfixés par "0x" .
Input : hex(1)
Output : '0x1'

Input : hex(2)
Output : '0x2'

Input : hex(4)
Output : '0x4'

Input : hex(8) 
Output : '0x8'

Input : hex(10)
Output : '0xa'

Input : hex(11)
Output : '0xb'

Input : hex(256)
Output : '0x100'

Vidéo Python hexa()

Mais avant de continuer, je suis ravi de vous présenter mon nouveau livre Python Python One-Liners (Lien Amazon).

Si vous aimez les one-liners, vous allez adorer le livre. Il vous apprendra tout ce qu'il y a à savoir sur une seule ligne de code Python. Mais c'est aussi une introduction à l'informatique , science des données, apprentissage automatique et algorithmes. L'univers en une seule ligne de Python !

Le livre est sorti en 2020 avec l'éditeur de livres de programmation de classe mondiale NoStarch Press (San Francisco).

Lien :https://nostarch.com/pythononeliners

Python hex() pour les objets personnalisés

Si vous appelez le hex(x) sur un objet non entier ou personnalisé x , il doit définir le __index__() méthode qui retourne un entier associé à x .

class Foo:    
    def __index__(self):
        return 10

f1 = Foo()
print(hex(f1))
# '0xa'

Comment corriger "TypeError :l'objet 'float' ne peut pas être interprété comme un entier" ?

hex() de Python La fonction ne peut convertir que des nombres entiers de n'importe quel système numérique (par exemple, décimal, binaire, octaire) vers le système hexadécimal. Il ne peut pas convertir les flottants en nombres hexadécimaux. Donc, si vous passez un flottant dans le hex() fonction, il lancera un TypeError: 'float' object cannot be interpreted as an integer .

>>> hex(11.14)
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    hex(11.14)
TypeError: 'float' object cannot be interpreted as an integer

Pour résoudre cette erreur, vous pouvez arrondir le flottant à un entier en utilisant le round() intégré fonction ou vous écrivez votre propre fonction de conversion personnalisée :

Comment convertir un flottant en nombre hexadécimal en Python ?

Pour convertir une valeur flottante donnée en une valeur hexadécimale, utilisez le float.hex() fonction qui renvoie une représentation d'un nombre à virgule flottante sous la forme d'une chaîne hexadécimale comprenant un 0x de tête et un p à la fin et l'exposant.

Notez que l'exposant est donné comme la puissance de 2 par laquelle il est mis à l'échelle, par exemple, 0x1.11p+3 serait mis à l'échelle comme 1.11 * 2^3 en utilisant l'exposant 3.

>>> 3.14.hex()
'0x1.91eb851eb851fp+1'
>>> 3.15.hex()
'0x1.9333333333333p+1'

Alternativement, si vous avez besoin d'une représentation hexadécimale non flottante similaire à la plupart des convertisseurs en ligne, utilisez la commande hex(struct.unpack('<I', struct.pack('<f', f))[0]) .

import struct

def float_to_hex(f):
    return hex(struct.unpack('<I', struct.pack('<f', f))[0])


print(float_to_hex(3.14))
print(float_to_hex(88.88))

La sortie est la représentation octale des valeurs d'entrée flottantes :

0x4048f5c3
0x42b1c28f

Sources :

  • https://docs.python.org/3/library/stdtypes.html#float.hex
  • https://gregstoll.com/~gregstoll/floattohex/
  • https://www.scadacore.com/tools/programming-calculators/online-hex-converter/
  • https://stackoverflow.com/questions/23624212/how-to-convert-a-float-into-hex

Sous-problèmes de formatage hexadécimal

Considérons quelques variantes de formatage du problème de conversion hexadécimale convertissant un nombre en minuscule/majuscule et avec/sans préfixe . Nous utilisons le langage de spécification de format. Vous pouvez en savoir plus sur ce sujet dans notre tutoriel de blog détaillé.

Nous utilisons trois variantes sémantiquement identiques pour chaque problème de conversion.

Comment convertir un nombre en hexadécimal minuscule avec préfixe

>>> '%#x' % 12
'0xc'
>>> f'{12:#x}'
'0xc'
>>> format(12, '#x')
'0xc'

Comment convertir un nombre en hexadécimal minuscule sans préfixe

>>> '%x' % 12
'c'
>>> f'{12:x}'
'c'
>>> format(12, 'x')
'c'

Comment convertir un nombre en hexadécimal majuscule avec préfixe

>>> '%#X' % 12
'0XC'
>>> f'{12:#X}'
'0XC'
>>> format(12, '#X')
'0XC'

Comment convertir un nombre en hexadécimal majuscule sans préfixe

>>> '%X' % 12
'C'
>>> f'{12:X}'
'C'
>>> format(12, 'X')
'C'

Résumé

hex(integer) intégré de Python la fonction prend un argument entier et renvoie une chaîne hexadécimale avec le préfixe "0x" .

>>> hex(1)
'0x1'
>>> hex(2)
'0x2'
>>> hex(4)
'0x4'
>>> hex(8)
'0x8'
>>> hex(10)
'0xa'
>>> hex(11)
'0xb'
>>> hex(256)
'0x100'

Si vous appelez le hex(x) sur un x non entier , il doit définir le __index__() méthode qui renvoie un entier associé à x .

class Foo:    
    def __index__(self):
        return 10

f1 = Foo()
print(hex(f1))
# '0xa'

Sinon, il lancera un TypeError: object cannot be interpreted as an integer .


Post précédent
Prochain article