2012-06-06 3 views
7

Je viens d'apprendre Python 3 en 7 jours, et j'ai l'impression qu'il y a un petit trou dans ma compréhension des chaînes d'octets. En Python 3, supposons que j'ai une chaîne d'octets b'1234'. Son iterator retourne des entiers:Python 3 bytes.index: meilleur moyen?

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'> 

je peux trouver un entier dans la chaîne d'octets (la définition de in est qu'il recherche pour l'égalité):

>>> 0x32 in b'1234' 
True 

Cependant, je voudrais trouver l'index d'un entier donné dans la chaîne d'octets. bytes.index nécessite une sous-chaîne:

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

Maintenant, si j'ai une x variable que je veux trouver, c'est le meilleur que je suis venu avec:

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

Je sais que Python est plus élégant que ça. Il me manque clairement quelque chose d'évident. Des idées sur une façon plus simple de le faire autre que de créer une séquence d'un seul entier? Ou est-ce vraiment ça?

+1

La question derrière est également, pourquoi voulez-vous trouver l'index de l'octet? – pepr

+0

Si vous devez savoir :) Il fait partie d'une machine virtuelle, dont l'une des instructions a besoin de l'indice d'un octet trouvé. Il implémente la version 3 de la spécification Z-machine, utilisée pour jouer à Zork et d'autres aventures textuelles basées sur ce moteur. Si vous voulez vérifier, c'est sur http://code.google.com/p/pyzmachine. C'est mon premier effort, donc les points d'amélioration sont appréciés. –

Répondre

5

Oui, c'est la façon de le faire.

Il est pas très différent de la façon de rechercher un caractère dans une chaîne en fonction de son point de code:

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

Intéressant - Je n'avais pas réalisé que chr() a créé une chaîne. Il semble que, en effet, les chaînes sont le seul moyen de représenter une instance du type d'élément d'une chaîne. –

+0

@RobertB: Oui. Python ne connaît pas le type de caractère. Le personnage (contrairement à d'autres langues) est techniquement seulement la chaîne avec la longueur 1. – pepr

0

Aussi, jetez un oeil à de Mark Pilgrim Plongez au coeur de Python 3, chapitre 4. Strings, Section 4.6. Strings vs. Bytes. Il explique bien quels sont les problèmes avec les anciennes chaînes Python 2.x (qui est devenu le type octets dans Python 3) et comment la nouvelle chaîne Python 3 diffère en principe.

Questions connexes