Respuestas:
Como señaló Johannes:
for c in "string":
#do something with c
Puedes iterar casi cualquier cosa en Python usando la for loop
construcción,
por ejemplo, open("file.txt")
devuelve un objeto de archivo (y abre el archivo), iterando sobre él itera sobre líneas en ese archivo
with open(filename) as f:
for line in f:
# do something with line
Si eso parece magia, bueno, lo es, pero la idea detrás de esto es realmente simple.
Hay un protocolo iterador simple que se puede aplicar a cualquier tipo de objeto para que el for
bucle funcione en él.
Simplemente implemente un iterador que defina un next()
método e implemente un __iter__
método en una clase para hacerlo iterable. ( __iter__
por supuesto, debe devolver un objeto iterador, es decir, un objeto que define next()
)
Si necesita acceso al índice mientras recorre la cadena, use enumerate()
:
>>> for i, c in enumerate('test'):
... print i, c
...
0 t
1 e
2 s
3 t
1 t
, 2 e
, 3 s
, 4 t
utilizar el parámetro de "arranque":for i, c in enumerate('test', start=1)
Aún más fácil:
for c in "test":
print c
for c in "test": print (c)
¿por qué?
Solo para hacer una respuesta más completa, la forma C de iterar sobre una cadena se puede aplicar en Python, si realmente quieres forzar una clavija cuadrada en un agujero redondo.
i = 0
while i < len(str):
print str[i]
i += 1
Pero, de nuevo, ¿por qué hacer eso cuando las cadenas son inherentemente iterables?
for i in str:
print i
for i in range(len(...))
es malvado En python 2.x, range()
crea una lista, por lo que durante un período muy largo puede terminar asignando un bloque de memoria muy grande. Por lo menos uso xrange()
en esos casos. Además, la indexación repetida de la misma cadena es mucho más lenta que iterar directamente sobre la cadena. Si necesita el índice, use enumerate()
.
Bueno, también puedes hacer algo interesante como esto y hacer tu trabajo usando for loop
#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
print ( name[index] ) #just like c and c++
La respuesta es
Señor . S uryaa
Sin embargo, dado que range () crea una lista de valores que es secuencia, puede usar directamente el nombre
for e in name:
print(e)
Esto también produce el mismo resultado y también se ve mejor y funciona con cualquier secuencia como lista, tupla y diccionario.
Hemos utilizado las funciones incorporadas de remolque (BIF en la comunidad de Python)
1) range () - range () BIF se utiliza para crear índices Ejemplo
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4
2) len () - len () BIF se utiliza para averiguar la longitud de una cadena dada
Si desea utilizar un enfoque más funcional para iterar sobre una cadena (tal vez para transformarla de alguna manera), puede dividir la cadena en caracteres, aplicar una función a cada uno y luego unir la lista resultante de caracteres nuevamente en una cadena.
Una cadena es inherentemente una lista de caracteres, por lo tanto, 'map' iterará sobre la cadena, como segundo argumento, aplicando la función, el primer argumento, a cada uno.
Por ejemplo, aquí uso un enfoque lambda simple ya que todo lo que quiero hacer es una modificación trivial del carácter: aquí, para incrementar el valor de cada carácter:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
o más generalmente:
>>> ''.join(map(my_function, my_string))
donde my_function toma un valor char y devuelve un valor char.
Varias respuestas aquí usan range
. xrange
generalmente es mejor ya que devuelve un generador, en lugar de una lista completamente instanciada. Donde la memoria y / o iterables de longitudes muy variables pueden ser un problema, xrange
es superior.
Si alguna vez se encuentra en una situación en la que necesita hacerlo get the next char of the word using __next__()
, recuerde crear una string_iterator
e iterar sobre ella y nooriginal string (it does not have the __next__() method)
En este ejemplo, cuando encuentro un char = [
sigo buscando la siguiente palabra mientras no encuentro ]
, así que necesito usar __next__
aquí un bucle for sobre la cadena no ayudaría
myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
if char == "'":
continue
processedInput+=char
if char == '[':
next_char=word_iterator.__next__()
while(next_char != "]"):
processedInput+=next_char
next_char=word_iterator.__next__()
else:
processedInput+=next_char