Как получить значение ASCII символа? - PullRequest
922 голосов
/ 23 октября 2008

Как мне получить ASCII значение символа как int в Python ?

Ответы [ 4 ]

1199 голосов
/ 23 октября 2008

С здесь :

функция ord () получит значение типа int чарса И в случае, если вы хотите преобразовать обратно после игры с число, функция chr () делает свое дело.

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

В Python 2 есть также функция unichr, возвращающая символ Unicode , порядковый номер которого - аргумент unichr:

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

В Python 3 вы можете использовать chr вместо unichr.


ord () - Документация Python 3.6.5rc1

ord () - документация Python 2.7.14

152 голосов
/ 23 октября 2008

Обратите внимание, что ord() само по себе не дает значения ASCII; он дает вам числовое значение символа в любой кодировке, в которой он находится. Поэтому результат ord('ä') может быть 228, если вы используете Latin-1, или он может повысить TypeError, если вы используете UTF-8 , Вместо этого он может даже вернуть код Unicode, если вы передадите ему Unicode:

>>> ord(u'あ')
12354
46 голосов
/ 23 октября 2008

Вы ищете:

ord()
26 голосов
/ 25 марта 2016

Принятый ответ правильный, но есть более умный / эффективный способ сделать это, если вам нужно конвертировать целую кучу символов ASCII в их коды ASCII одновременно. Вместо того, чтобы делать:

for ch in mystr:
    code = ord(ch)

или чуть быстрее:

for code in map(ord, mystr):

вы конвертируете в нативные типы Python, которые итерируют коды напрямую. На Python 3 это тривиально:

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

и в Python 2.6 / 2.7, он лишь немного более сложный, потому что у него нет объекта bytes в стиле Py3 (bytes - это псевдоним для str, который повторяется по символу), но они имеют 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'):

Кодирование как тип, который итеративно повторяется по порядковому номеру, означает, что преобразование происходит намного быстрее; в локальных тестах на Py2.7 и Py3.5 повторение str для получения его ASCII-кодов с использованием map(ord, mystr) начинается примерно вдвое дольше для len 10 str, чем с использованием bytearray(mystr) на Py2 или mystr.encode('ascii') на Py3, и когда str увеличивается, множитель, уплаченный за map(ord, mystr), увеличивается до ~ 6,5x-7x.

Единственным недостатком является то, что преобразование происходит одновременно, поэтому ваш первый результат может занять немного больше времени, и действительно огромный str будет иметь пропорционально большой временный bytes / bytearray, но если это не заставит Вы перебиваете страницы, это вряд ли имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...