2011-02-25 9 views
20

¿Cómo es que podemos iterar sobre cadenas de python cuando las cadenas no tienen una función __iter__?¿por qué las cadenas de Python no tienen la función __iter__?

$ python 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> "asdf".__iter__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'str' object has no attribute '__iter__' 
>>> it = iter("asdf")  
>>> it 
<iterator object at 0xb736f5ac> 
>>> 

Y lo más importante (sin embargo, las cadenas se repiten a lo largo), ¿por qué las cadenas pitón no siguen la misma convención como todo lo demás. ¿Particularmente cuando los documentos de Python dicen que se necesita la función __iter__http://docs.python.org/library/functions.html#iter?

+5

Vale la pena señalar que en Python 3, las cadenas tienen __iter__. – miracle2k

+0

Es todo una cuestión de historia, ¿no? La idea de los iteradores se originó para generalizar las funciones del generador, pero el ciclo for había estado allí todo el tiempo, dependiendo de una firma diferente. – jobermark

Respuesta

38

Desde su enlace:

o debe soportar el protocolo secuencia (la __getitem__() método con argumentos enteros a partir de 0).

In [1]: 'foo'.__getitem__(0) 
Out[1]: 'f' 
+2

guau, soy malo en leer :). Gracias –

0

Probablemente porque Python no es un langage que tiene un tipo "char". Lo natural para volver, si la cadena tuviera __iter__ sería caracteres, pero no hay caracteres. Puedo ver un caso para enganchar __iter__ hasta la cadena y hacer cualquier lista (someString), realmente no estoy seguro de por qué no es así.

+0

'>>> list (iter ('abcd')) ['a', 'b', 'c', 'd']' Python utiliza cadenas de caracteres de un solo carácter. –

+0

Derecha, pero si cadena (en Python 2) _did_ tiene un '__iter__', ¿debe iterar sobre cadenas de caracteres individuales o sobre enteros (0 - 255)? No es obvio cuál es mejor así que probablemente se lo saltaron. Si hubiera un '' __iter__' unicode, aunque definitivamente debería iterar sobre cadenas de caracteres individuales, entonces no estoy seguro de por qué eso no está en Python. – jpsimons

+0

En Python2 iterar sobre una cadena o Unicode produce cadenas de caracteres individuales o Unicode, respectivamente. 'list (iter (u'abcd ')) == [u'a', u'b ', u'c', u'd ']' Esto lleva a la extraña situación de que cada uno de los elementos en ''a '' es lo mismo que toda la secuencia que lo hace efectivamente una secuencia infinitamente anidada. – Singletoned

Cuestiones relacionadas