2008-10-22 12 views

Répondre

950

De here:

ord fonction

() obtiendrait la valeur int de l'omble chevalier. Et dans le cas où vous voulez convertir revenir après avoir joué avec le nombre , la fonction chr() fait l'affaire.

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

En Python 2, il y a aussi la fonction unichr, renvoyant le caractère Unicode dont ordinal est l'argument unichr:

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

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

+0

qui codant en utilisant chr? – njzk2

+0

@ njzk2: 'latin1' (ce qui n'est pas génial si votre octet d'origine était encodé en (cp1251') (cyrillique) –

+13

Notez que chr agit aussi comme unichr dans Python 3. ' chr (31415) -> '窷' ' – William

38

Vous recherchez:

ord() 
134

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 encodage. Par conséquent, le résultat de ord ('ä') peut être 228 si vous utilisez Latin-1, ou il peut déclencher une erreur TypeError si vous utilisez UTF- 8. Il peut même retourner le point de code Unicode au lieu si vous passez un unicode:

>>> ord(u'あ') 
12354 
+6

Comment pouvez-vous savoir quel encodage vous utilisez dans une situation donnée? – Moustache

12

La réponse acceptée est correcte, mais il y a une façon plus intelligente/efficace de le faire si vous avez besoin de convertir un tas de ASCII caractères à leurs codes ASCII à la fois. Au lieu de faire:

for ch in mystr: 
    code = ord(ch) 

ou légèrement plus rapide:

for code in map(ord, mystr): 

vous convertir en Python types natifs qui itérera les codes directement. Le Python 3, il est trivial:

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

et Python 2.6/2.7, il est seulement un peu plus impliqué parce qu'il ne dispose pas d'un objet de style bytes PY3 (bytes est un alias pour str, qui le compare 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'): 

Encoding comme un type natif itère par des moyens ordinale la conversion va beaucoup plus vite; dans les tests locaux sur les deux Py2.7 et Py3.5, itérer un str pour obtenir ses codes ASCII en utilisant map(ord, mystr) commence prendre environ deux fois plus long pour un que d'utiliser bytearray(mystr) sur py2 ou mystr.encode('ascii') sur AP3, et que le str obtient plus longtemps, 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, de sorte que votre premier résultat pourrait prendre un peu plus, et un str vraiment énorme aurait un bytes/bytearray proportionnellement important temporaire, mais à moins que cela vous oblige à raclée page, Ce n'est pas important.

Questions connexes