7 ответов
Функция ord() получит значение типа char. И если вы хотите преобразовать обратно после игры с числом, функция 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()
не дает вам значение ASCII само по себе; он дает вам числовое значение символа в любой кодировке, в которой он находится. Следовательно, результат ord('ä')
может быть 228, если вы используете Latin-1, или это может поднять TypeError
если вы используете UTF-8. Вместо этого он может даже вернуть код Unicode, если вы передадите ему Unicode:
>>> ord(u'あ')
12354
Принятый ответ правильный, но есть более умный / эффективный способ сделать это, если вам нужно конвертировать целую кучу символов 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 он немного более сложный, потому что у него нет стиля Py3 bytes
объект (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
, но если это не заставит вас ломать страницу, это вряд ли будет иметь значение.
Чтобы получить код ASCII символа, вы можете использовать ord()
функция.
Вот пример кода:
value = input("Your value here: ")
list=[ord(ch) for ch in value]
print(list)
Выход:
Your value here: qwerty
[113, 119, 101, 114, 116, 121]
Numpy также можно использовать для получения значения ascii символа. Это особенно полезно, если вам нужно преобразовать множество символов в их кодовые точки ascii/unicode. В зависимости от количества символов это может быть на порядки быстрее, чем вызовord
в петле.
Чтобы использовать его, оберните строку/символ в массив numpy и просмотрите его какint
, который возвращает соответствующие числовые значения символов в любой кодировке, в которой они находятся.
import numpy as np
# if the characters are in a list
lst = ['a', 'ä', 'あ']
ary = np.array(lst).view(int).tolist() # [97, 228, 12354]
# if the characters are in a string
s = 'abc'
ar = np.array([s])
v = s_arr.view(int) # array([97, 98, 99])
В качестве примечания: одна особенность представления заключается в том, что если вы измените представление, исходное представление также изменится. Например, если мы хотим сделать все символы вar
верхний регистр, мы могли бы сделать это, работая надv
:
v -= 32
print(ar) # ['ABC']
ord(x)
возвращает Юникод
x
.
Поскольку Unicode является расширением ASCII,
ord
также будет работать для всего, что закодировано ASCII. Обратите внимание, что возвращаемое значение является десятичным. Если вы хотите его на другой базе, вы можете использовать
bin(ord(x))
oct(ord(x))
hex(ord(x))
как вы считаете нужным.