web-dev-qa-db-fra.com

Comment obtenir la valeur ASCII d'un caractère?

Comment obtenir la valeur ASCII d'un caractère sous la forme d'un int dans Python ?

946
Matt

De ici :

function ord () obtiendrait la valeur int du caractère. Et au cas où vous voudriez reconvertir après avoir joué avec le nombre, la fonction chr () fera l'affaire.

>>> ord('a')
97
>>> chr(97)
'a'
>>> chr(ord('a') + 3)
'd'
>>>

Dans Python 2, il y a aussi la fonction unichr qui renvoie le caractère nicode dont l'ordinal est l'argument unichr:

>>> unichr(97)
u'a'
>>> unichr(1234)
u'\u04d2'

Dans Python 3, vous pouvez utiliser chr au lieu de unichr.


ord () - Python 3.6.5rc1 documentation

ord () - Python documentation 2.7.14

1232
Matt J

Notez que ord() ne vous donne pas la valeur ASCII en soi; il vous donne la valeur numérique du caractère, quel que soit son codage. Par conséquent, le résultat de ord('ä') peut être 228 si vous utilisez Latin-1, ou il peut générer un TypeError si vous êtes en utilisant UTF-8. Il peut même renvoyer le code codé Unicode à la place si vous lui transmettez un unicode:

>>> ord(u'あ')
12354
156

Tu recherches:

ord()
47
Jacob Krall

La réponse acceptée est correcte, mais il existe un moyen plus astucieux/efficace de le faire si vous devez convertir tout un tas de caractères ASCII en leurs codes ASCII à la fois. Au lieu de faire:

for ch in mystr:
    code = ord(ch)

ou le légèrement plus rapide:

for code in map(ord, mystr):

vous convertissez en Python types natifs qui traitent directement les codes. Sur Python 3, c'est trivial:

for code in mystr.encode('ascii'):

et sur Python 2.6/2.7, il n’est que légèrement plus impliqué car il n’a pas de style Py3 bytes object (bytes est un alias pour str, qui itère par caractère), mais ils ont bytearray:

# If mystr is definitely str, not unicode
for code in bytearray(mystr):

# If mystr could be either str or unicode
for code in bytearray(mystr, 'ascii'):

Le codage en tant que type qui itère de manière native par ordinal signifie que la conversion est beaucoup plus rapide; dans les tests locaux sur Py2.7 et Py3.5, itérer un str pour obtenir ses codes ASCII à l'aide de map(ord, mystr) commence à prendre environ deux fois plus longtemps pour un len 10 str que d'utiliser bytearray(mystr) sur Py2 ou mystr.encode('ascii') sur Py3, et à mesure que str s'allonge, le multiplicateur payé pour map(ord, mystr) s'élève à ~ 6,5x -7x.

Le seul inconvénient est que la conversion est tout à la fois, donc votre premier résultat pourrait prendre un peu plus longtemps, et un str vraiment énorme aurait une proportion relativement importante de bytes/bytearray, mais à moins que cela ne vous oblige à balayer des pages, cela n’aura probablement aucune importance.

28
ShadowRanger