2012-06-06 9 views
7

Acabo de aprender Python 3 en 7 días, y tengo la sensación de que hay un pequeño hueco en mi comprensión de las cadenas de bytes. En Python 3, supongamos que tengo una cadena de bytes b'1234'. Su iterador devuelve enteros:Python 3 bytes.index: ¿mejor forma?

Python 3.2.3 (default, May 26 2012, 18:49:27) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 

>>> for z in b'1234': 
... print(type(z)) 
... 
<class 'int'> 
<class 'int'> 
<class 'int'> 
<class 'int'> 

puedo encontrar un número entero en la cadena de bytes (la definición de in es que busca la igualdad):

>>> 0x32 in b'1234' 
True 

Sin embargo, me gustaría encontrar el índice de un entero dado en la cadena de bytes. bytes.index requiere una subcadena:

>>> b'1234'.index(b'2') 
1 

Ahora, si tengo una variable x que quiero encontrar, este es el mejor que he llegado con:

>>> x = 0x32 
>>> b'1234'.index(bytes([x])) 
1 

Sé Python es más elegante que eso. Claramente me falta algo obvio. ¿Alguna idea sobre una forma más simple de hacer esto que no sea crear una secuencia de un solo entero? ¿O es eso realmente?

+1

La pregunta detrás también es, ¿por qué quieres encontrar el índice del byte? – pepr

+0

Si debe saber :) Es parte de una máquina virtual, una de cuyas instrucciones necesita el índice de un byte encontrado. Implementa la versión 3 de la especificación Z-machine, utilizada para jugar Zork y otras aventuras de texto basadas en ese motor. Si desea verificarlo, está en http://code.google.com/p/pyzmachine. Es mi primer esfuerzo, así que los puntos de mejora son apreciados. –

Respuesta

5

Sí, esa es la manera de hacerlo.

No es muy diferente de la forma de búsqueda de un carácter en una cadena en función de su punto de código:

x = 0x32 
i ='1234'.index(chr(x)) 
+0

Interesante - No me había dado cuenta de que chr() había creado una cadena. Parece que, de hecho, las cadenas son la única forma de representar una instancia del tipo de elemento de una cadena. –

+0

@RobertB: Sí. Python no conoce el tipo de caracteres. El personaje (a diferencia de otros idiomas) es técnicamente solo la cadena con la longitud 1. – pepr

0

También, echar un vistazo a buceo de Mark Pilgrim en Python 3, Capítulo 4. Strings, Sección 4.6. Strings vs. Bytes. Explica muy bien cuáles son los problemas con las cadenas anteriores de Python 2.x (que se convirtieron en el tipo bytes en Python 3) y cómo la nueva cadena de Python 3 difiere en principio.